第24章 LDAP 認証
管理者は、Automation Controller ユーザーのアカウント認証情報のソースとして、Lightweight Directory Access Protocol (LDAP) を使用します。ユーザー認証は提供されますが、ユーザーのパーミッションと認証情報は同期されません。組織のメンバーシップとチームのメンバーシップは、組織管理者が同期できます。
24.1. LDAP 認証のセットアップ
設定すると、LDAP のユーザー名とパスワードを使用してログインするユーザーに対して、Automation Controller のアカウントが自動的に作成されます。このユーザーを、通常のユーザーまたは組織管理者として自動的に組織に配置できます。
ユーザーインターフェイス (ローカル) で作成されたユーザーは、別の認証ソリューションを使用して初めて Automation Controller にログインするユーザーよりも優先されます。LDAP などの別の認証方法で再利用する場合は、ローカルユーザーを削除する必要があります。
LDAP ログインで作成されたユーザーは、自分のユーザー名や姓名を変更できず、ローカルのパスワードも設定できません。他のフィールド名の編集を制限するように設定することも可能です。
接続先の LDAP サーバーに自己署名証明書、または企業内部の認証局 (CA) で署名された証明書がある場合は、その CA 証明書をシステムの信頼された CA に追加する必要があります。そうしないと、LDAP サーバーに接続する際に、証明書の発行者が認識されないというエラーが発生します。詳細は、LDAPS 統合向けに Automation Controller に認証局をインポートする手順 を参照してください。プロンプトが表示されたら、Red Hat の顧客認証情報を使用してログインしてください。
手順
- LDAP 構造全体の読み取り権限があるユーザーを LDAP に作成します。
ldapsearch
コマンドを使用して、LDAP サーバーへのクエリーが正常に実行できるかどうかをテストします。このツールは、Automation Controller のシステムコマンドラインからインストールでき、他の Linux および OSX システムを使用してもインストール可能です。例
ldapsearch -x -H ldap://win -D "CN=josie,CN=Users,DC=website,DC=com" -b "dc=website,dc=com" -w Josie4Cloud
この例では、
CN=josie,CN=users,DC=website,DC=com
が接続ユーザーの識別名です。注記ldapsearch
ユーティリティーは、Automation Controller とともに自動的にプリインストールされるわけではありません。ただし、openldap-clients
パッケージからインストールできます。- ナビゲーションパネルから、Automation Controller UI の を選択します。
Authentication オプションのリストで LDAP settings を選択します。
LDAP サーバーごとに複数の LDAP 設定を行う必要はありませんが、このページから複数の LDAP サーバーを設定できます。そのように設定しない場合は、サーバーを Default のままにします。
同等の API エンドポイントは、
AUTH_LDAP_1_*
、AUTH_LDAP_2_*
、AUTH_LDAP_5_*
のようにAUTH_LDAP_*
を繰り返し表示し、サーバーの割り当てを示します。LDAP サーバーアドレスを入力または変更するには、LDAP Server URI フィールドに入力します。
をクリックし、テキストフィールドに事前に入力されているものと同じ形式を使用して注記複数の LDAP サーバーを指定するには、各サーバーをスペースまたはコンマで区切ります。 アイコンをクリックして、正しい構文とルールに準拠してください。
- バインディングユーザーに使用するパスワードを LDAP Bind Password テキストフィールドに入力します。LDAP 変数の詳細は、Ansible Automation Hub 変数 を参照してください。
LDAP Group Type リストで、グループタイプをクリックして選択します。
Automation Controller がサポートする LDAP グループタイプは、基盤となる django-auth-ldap ライブラリー を使用します。選択したグループタイプのパラメーターを指定するには、ステップ 15 を参照してください。
- LDAP Start TLS は、デフォルトで無効になっています。LDAP 接続が SSL/TLS を使用していない場合に TLS を有効にするには、トグルを On に設定します。
LDAP Bind DN テキストフィールドに識別名を入力して、Automation Controller が LDAP サーバーへの接続 (バインド) に使用するユーザーを指定します。
-
名前がキー
sAMAccountName
に保存されている場合、LDAP User DN Template は(sAMAccountName=%(user)s)
から入力されます。Active Directory はユーザー名をsAMAccountName
に保存します。OpenLDAP の場合、キーはuid
で、行は(uid=%(user)s)
になります。
-
名前がキー
-
LDAP Require Group フィールドに識別グループ名を入力して、当該グループ内のユーザーが Automation Controller にアクセスできるようにします。このとき、テキストフィールドに表示されているもの (
CN=controller Users,OU=Users,DC=website,DC=com
) と同じ形式を使用します。 - LDAP Deny Group フィールドに識別グループ名を入力して、当該グループ内のユーザーが Automation Controller にアクセスできないようにします。このとき、テキストフィールドに表示されているものと同じ形式を使用します。
LDAP User Search フィールドに、認証時にユーザーを検索する場所を入力します。このとき、テキストフィールドに表示されているものと同じ形式を使用します。この例では、以下を使用します。
[ "OU=Users,DC=website,DC=com", "SCOPE_SUBTREE", "(cn=%(user)s)" ]
最初の行では、LDAP ツリーの中でユーザーを検索する場所を指定します。上記の例では、
DC=website,DC=com
から開始して再帰的にユーザーの検索が実行されます。2 行目は、ユーザーを検索する範囲を指定します。
- SCOPE_BASE: この値は、基本 DN でエントリーのみを検索して、このエントリーだけが返されるように指定する時に使用します。
- SCOPE_ONELEVEL: この値は、基本 DN の 1 つ下のレベルにあるエントリーをすべて検索するように指定する時に使用します。ここでは、基本 DN や、基本 DN の 1 つ下のレベルよりも下のレベルにあるエントリーは検索には含めません。
SCOPE_SUBTREE: この値は、指定した基本 DN も含めて、全レベルの全エントリーを検索するように指定する際に使用します。
3 行目は、ユーザー名を保存するキー名を指定します。
複数の検索クエリーの場合、正しい構文は以下のとおりです。
[ [ "OU=Users,DC=northamerica,DC=acme,DC=com", "SCOPE_SUBTREE", "(sAMAccountName=%(user)s)" ], [ "OU=Users,DC=apac,DC=corp,DC=com", "SCOPE_SUBTREE", "(sAMAccountName=%(user)s)" ], [ "OU=Users,DC=emea,DC=corp,DC=com", "SCOPE_SUBTREE", "(sAMAccountName=%(user)s)" ] ]
LDAP Group Search テキストフィールドで、検索するグループと検索方法を指定します。この例では、以下を使用します。
[ "dc=example,dc=com", "SCOPE_SUBTREE", "(objectClass=group)" ]
- 最初の行は、グループを検索すべき基本 DN を指定します。
- 2 行目は、ユーザーディレクティブと同じで、範囲を指定します。
-
3 行目は、使用する LDAP において、グループオブジェクトの
objectClass
が何かを指定します。
LDAP User Attribute Map テキストフィールドに、ユーザー属性を入力します。この例では、以下を使用します。
{ "first_name": "givenName", "last_name": "sn", "email": "mail" }
上記の例では、キー
sn
で姓によってユーザーを取得します。ユーザーに対して同じ LDAP クエリーを使用して、ユーザーがどのキーに保存されているかを判断できます。選択した LDAP Group Type に応じて、異なるパラメーターが LDAP Group Type Parameters フィールドで使用できます。
LDAP_GROUP_TYPE_PARAMS
は、Automation Controller によってkwargs
に変換されて、選択した LDAP Group Type クラスに渡されるディクショナリーです。どの LDAP Group Type でも使用される共通パラメーターが 2 つあります。name_attr
とmember_attr
です。name_attr
のデフォルトは cn で、member_attr
のデフォルトは member です。{"name_attr": "cn", "member_attr": "member"}
特定の LDAP Group Type が必要とするパラメーターを確認するには、django_auth_ldap ドキュメントのクラス
init
パラメーターに関する箇所を参照してください。LDAP User Flags by Group テキストフィールドにユーザープロファイルフラグを入力します。次の例では、LDAP ユーザーを「スーパーユーザー」および「監査人」として設定する構文を使用しています。
{ "is_superuser": "cn=superusers,ou=groups,dc=website,dc=com", "is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com" }
- LDAP Organization Map および LDAP Team Map のマッピングフィールドへの入力に関する詳細は、LDAP 組織およびチームのマッピング セクションを参照してください。
- をクリックします。
Automation Controller はユーザーを積極的に同期しませんが、初回のログイン時にユーザーが作成されます。LDAP 認証に関連するパフォーマンスを向上させるには、ログインごとの LDAP 属性更新の防止 を参照してください。
24.1.1. LDAP 組織およびチームのマッピング
LDAP 属性に基づいて、どのユーザーをどの Automation Controller 組織に配置するかを制御できます (組織の管理者、ユーザー、LDAP グループの間のマッピング)。
キーは組織名です。組織が存在しない場合は作成されます。値は、各組織のメンバーシップのオプションを定義するディクショナリーとなります。どのグループが自動的に組織のユーザーになり、どのグループが組織を管理できるかを、組織ごとに指定できます。
admins
: none
、true
、false
、string
、または文字列の list/tuple
:
-
none
の場合、組織管理者は LDAP 値に基づいて更新されません。 -
true
の場合、LDAP 内のすべてのユーザーが組織の管理者として自動的に追加されます。 -
false
の場合、いずれの LDAP ユーザーも組織の管理者として自動的に追加されません。 - 文字列または文字列のリストの場合は、グループ DN を指定します。指定したグループに一致する場合、組織に追加されます。
remove_admins: True/False。
デフォルトは False です。
-
true
の場合、指定されたグループのメンバーではないユーザーは、組織の管理者リストから削除されます。
users
: none
、true
、false
、string
、または文字列の list/tuple
。管理者と同じルールが適用されます。
remove_users
: true
または false
。デフォルトは false
です。管理者と同じルールが適用されます。
例
{ "LDAP Organization": { "admins": "cn=engineering_admins,ou=groups,dc=example,dc=com", "remove_admins": false, "users": [ "cn=engineering,ou=groups,dc=example,dc=com", "cn=sales,ou=groups,dc=example,dc=com", "cn=it,ou=groups,dc=example,dc=com" ], "remove_users": false }, "LDAP Organization 2": { "admins": [ "cn=Administrators,cn=Builtin,dc=example,dc=com" ], "remove_admins": false, "users": true, "remove_users": false } }
ユーザーと LDAP グループをマッピングする場合、キーはチーム名であり、存在しない場合は作成されます。値は、各チームのメンバーシップに関するオプションのディクショナリーとなります。各値には、次のパラメーターを含めることができます。
organization
: string
.チームが所属する組織の名前です。組織とチームの組み合わせが存在しない場合は、チームが作成されます。組織が存在しない場合には、先に組織が作成されます。
users
: none
、true
、false
、string
、または文字列の list/tuple
:
-
none
の場合、チームメンバーは更新されません。 -
true
またはfalse
の場合、すべての LDAP ユーザーがチームメンバーとして追加または削除されます。 - 文字列または文字列のリストでグループ DN を指定する場合、ユーザーがこれらのグループの いずれか のメンバーであれば、そのユーザーはチームメンバーとして追加されます。
remove
: true
または false
。デフォルトは false
です。true
の場合、指定されたグループのメンバーではないユーザーは、チームから削除されます。
例
{ "LDAP Engineering": { "organization": "LDAP Organization", "users": "cn=engineering,ou=groups,dc=example,dc=com", "remove": true }, "LDAP IT": { "organization": "LDAP Organization", "users": "cn=it,ou=groups,dc=example,dc=com", "remove": true }, "LDAP Sales": { "organization": "LDAP Organization", "users": "cn=sales,ou=groups,dc=example,dc=com", "remove": true } }
24.1.2. LDAP のロギングの有効化
LDAP のロギングを有効にするには、Settings 設定ウィンドウでレベルを DEBUG に設定する必要があります。
手順
- ナビゲーションパネルから を選択します。
- System オプションのリストから Logging settings を選択します。
- をクリックします。
- Logging Aggregator Level Threshold フィールドを DEBUG に設定します。
- をクリックします。
24.1.3. ログインごとの LDAP 属性更新の防止
デフォルトでは、LDAP ユーザーが認証されると、すべてのユーザー関連の属性がログインのたびにデータベースで更新されます。一部の環境では、パフォーマンスの問題のためにこの操作をスキップできます。これを回避するには、オプション AUTH_LDAP_ALWAYS_UPDATE_USER を無効にします。
LDAP ユーザーの属性を更新しない場合は、このオプションを false
に設定してください。属性は、ユーザーが初めて作成されたときにのみ更新されます。
手順
/etc/tower/conf.d/custom-ldap.py
に次の内容のカスタムファイルを作成します。複数のノードがある場合は、すべてのノードで実行します。AUTH_LDAP_ALWAYS_UPDATE_USER = False
すべてのノードで Automation Controller を再起動します。
automation-controller-service restart
このオプションを
False
に設定すると、LDAP ユーザーの属性に対する変更は Automation Controller にプッシュされません。新しいユーザーが作成され、当該ユーザーの初回ログイン時にその属性がデータベースにプッシュされることに注意してください。
デフォルトでは、LDAP ユーザーはログインするたびにデータベースで属性が更新されます。LDAP 認証情報を使用して複数回実行される Playbook の場合、これらのクエリーを回避できます。
検証
LDAP 認証に関連するクエリーで時間のかかっているものがないか、PostgreSQL を確認してください。
関連情報
詳細は、Django ドキュメントの AUTH_LDAP_ALWAYS_UPDATE_USER を参照してください。
24.1.4. LDAPS 統合向けに Automation Controller に認証局をインポートする手順
LDAP を使用して Automation Controller サーバーへの認証を行うことができますが、認証に LDAPS (SSL/TLS 経由の LDAP) を使用するように変更すると、次のいずれかのエラーで失敗します。
2020-04-28 17:25:36,184 WARNING django_auth_ldap Caught LDAPError while authenticating e079127: SERVER_DOWN({'info': 'error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed (unable to get issuer certificate)', 'desc': "Can't contact LDAP server"},)
2020-06-02 11:48:24,840 WARNING django_auth_ldap Caught LDAPError while authenticating reinernippes: SERVER_DOWN({'desc': "Can't contact LDAP server", 'info': 'error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed (certificate has expired)'},)
デフォルトでは、django_auth_ldap
は、LDAPS トランザクションを開始する前に SSL 接続を検証します。certificate verify failed
エラーが発生した場合、django_auth_ldap
が証明書を検証できなかったことを意味します。SSL/TLS 接続を検証できない場合、接続の試行は中止されます。
手順
LDAP CA をインポートするには、次のコマンドを実行します。
cp ldap_server-CA.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
クラスター化されたセットアップ内のすべての Automation Controller ノードで、これら 2 つのコマンドを実行します。
24.1.5. リファラル
Active Directory は、クエリーされたオブジェクトがデータベースで利用できない場合に備えて「リフェラル」を使用します。リフェラルは、django LDAP クライアントでは正しく機能しないため、無効にした方が有益です。
/etc/tower/conf.d/custom.py
ファイルに次の行を追加して、LDAP リフェラルを無効にします。
AUTH_LDAP_GLOBAL_OPTIONS = { ldap.OPT_REFERRALS: False, }
24.1.6. 認証用にデフォルトタイムアウトを変更する手順
Automation Controller UI の Settings 画面で、指定したトークンが有効であるデフォルトの時間 (秒単位) を変更できます。
手順
- ナビゲーションパネルから を選択します。
- System オプションのリストから Miscellaneous Authentication settings を選択します。
- をクリックします。
- Idle Time Force Log Out テキストフィールドに、タイムアウトの期間を秒単位で入力します。
- をクリックします。
Automation Controller にアクセスしてログインで問題が生じた場合は、Web ブラウザーのキャッシュをクリアしてください。一般的にそのような状況では、ブラウザーセッション中に認証トークンがキャッシュされています。続行するにはこれをクリアする必要があります。