Documentation

18. LDAP 認証の設定

注釈

LDAP 認証はエンタープライズレベルのライセンス情報をお持ちのお客様向けの機能です。この設定プロセスを開始する前に有効なエンタープライズライセンスが必要です。さらに接続する LDAP サーバーに、自己署名または企業内の証明局 (CA) で署名された証明書がある場合には、CA 証明書をシステムの信頼される CA に追加する必要があります。追加しない場合には、LDAP サーバーに接続すると、証明書の発行者が認識されていないというエラーが発生します。

管理者は、Tower ユーザーのアカウント認証情報のソースとして LDAP を使用します。ユーザー認証は提供されますが、ユーザーのパーミッションや認証情報は同期されません。組織のメンバーシップ (および組織の管理者) やチームのメンバーシップは同期可能です。

上記のように設定された場合に、LDAP のユーザー名およびパスワードでログインすると自動的に Tower のアカウントが作成され、各ユーザーは通常のユーザーまたは組織の管理者として組織に所属します。

LDAP ログインで作成されたユーザーは、ユーザー名、姓名を変更できず、ローカルのパスワードも設定できません。これは、さらにカスタマイズして他のフィールド名の編集を制限することができます。

Tower の LDAP 統合を設定する方法:

  1. まず、LDAP 構造全体を読み取るアクセス権限を持つユーザーを LDAP に作成します。

  2. LDAP サーバーにクエリーを正常に実行できるかどうかをテストするには、ldapsearch コマンドを実行します。このコマンドツールは、Tower システムのコマンドライン、他の Linux、OSX システムでインストール可能です。以下のコマンドを使用して、ldap サーバーにクエリーを実行してください。josie および Josie4Cloud は、お使いの設定で機能する属性に置き換えてください。

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 ユーティリティーは、Ansible Tower に自動的にインストールされませんが、openldap-clients パッケージからインストールできます。

  1. 左のナビゲーションバーから設定 (settings-icon) アイコンをクリックします。

デフォルトでは、認証タブが最初に表示されます。

  1. サブカテゴリーフィールドで、ドロップダウンリストから LDAP を選択します。

注釈

Ansible Tower 3.3 以降で、設定するサーバーを指定して複数の LDAP サーバーを設定できます (指定しない場合は、サーバーは Default のままとなります)。

_images/configure-tower-auth-ldap-servers.png

同等の API エンドポイントは、AUTH_LDAP_1_*AUTH_LDAP_2_* ... AUTH_LDAP_5_* など、AUTH_LDAP_* を繰り返して表示し、サーバーの割り当てを表記します。

  1. テキストフィールドに表示されているないようと同じフォーマットを使用して、LDAP サーバー URI フィールドに、接続先の LDAP サーバーアドレスを入力します。以下に例を示します。

_images/configure-tower-auth-ldap-server-uri.png
  1. LDAP バインド DN テキストフィールドに識別名を入力して、Tower が LDAP サーバーへの接続 (バインド) に使用するユーザーを指定します。以下では例として CN=josie,CN=users,DC=website,DC=com を使用します。

_images/configure-tower-auth-ldap-bind-dn.png
  1. LDAP バインドパスワード テキストフィールドにバインドに使用するユーザーのパスワードを入力します。以下の例では、パスワードは 'passme' です。

_images/configure-tower-auth-ldap-bind-pwd.png
  1. 名前が sAMAccountName に格納されている場合に、LDAP ユーザー DN テンプレート には (sAMAccountName=%(user)s) のデータが投入されます。同様に、OpenLDAP の場合は、キーは uid``であるのでこの行は ``(uid=%(user)s) となります。

  2. LDAP グループタイプ のドロップダウンメニュー一覧からグループタイプをクリックして選択します。

LDAP グループタイプには以下が含まれます。

  • PosixGroupType

  • GroupOfNamesType

  • GroupOfUniqueNamesType

  • ActiveDirectoryGroupType

  • OrganizationalRoleGroupType

  • MemberDNGroupType

  • NISGroupType

  • NestedGroupOfNamesType

  • NestedGroupOfUniqueNamesType

  • NestedActiveDirectoryGroupType

  • NestedOrganizationalRoleGroupType

  • NestedMemberDNGroupType

  • PosixUIDGroupType

Tower がサポートする LDAP グループタイプは、下層の django-auth-ldap library を使用します。

LDAP Group Type はそれぞれ、異なるパラメーターを取る可能性があります。Tower は LDAP_GROUP_TYPE_PARAMS を公開して、これに対応します。LDAP_GROUP_TYPE_PARAMS は、ディクショナリーで、Tower が kwargs に変換し、選択した LDAP グループタイプクラスに渡します。LDAP グループタイプで一般的に使用するパラメーターは name_attrmember_attr の 2 つです。name_attr のデフォルト値は cnmember_addr のデフォルト値は member です。

{'name_attr': 'cn', 'member_attr': 'member'}

特定の LDAP グループタイプが必要とするパラメーターを判断するには、「django_auth_ldap 」ドキュメントのクラス init パラメーターの部分を参照してください。

  1. LDAP Require Group フィールドで識別名を入力して、対象のグループ内のユーザーが Tower にアクセスできるようにします。この際、テキストフィールドに表示されている形式と同じものを使用します。この例では、CN=Tower Users,OU=Users,DC=website,DC=com を使用します。

_images/configure-tower-auth-ldap-req-group.png
  1. LDAP 拒否グループ フィールドでグループの識別名を入力して、対象のグループ内のユーザーが Tower にアクセスできないようにします。この際、テキストフィールドに表示されている形式と同じものを使用します。この例では、このフィールドには何も入力しません。

  2. LDAP Start TLS はデフォルトでは無効になっています。LDAP 接続で SSL を使用せずに TLS を有効化するには、クリックして ON に切り替えます。

_images/configure-tower-auth-ldap-start-tls.png
  1. LDAP ユーザー検索 フィールドに、テキストフィールドに記載されている内容と同じフォーマットを使用して、認証時にユーザーを検索する場所を入力します。この例では、以下を使用します。

[
"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 配下のこのレベルよりも下のレベルにあるエントリーは検索には含めません。

  • SCOPE_SUBTREE: この値は、指定した基本 DN も含めて、全レベルの全エントリーを検索するように指定する際に使用します。

3 行目は、ユーザー名を保存するキー名を指定します。

_images/configure-tower-authen-ldap-user-search.png

注釈

複数の検索クエリーの場合の正しい構文は以下のとおりです。

[
  [
  "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)"
  ]
]
  1. LDAP グループ検索 のテキストフィールドで、検索するグループ、検索方法を指定します。この例では、以下を使用します。

 [
"dc=example,dc=com",
"SCOPE_SUBTREE",
"(objectClass=group)"
 ]
  • 最初の行は、グループを検索すべき基本 DN を指定します。

  • 2 行目は、ユーザーディレクティブと同じで、範囲を指定します。

  • 3 行目は、使用する LDAP において、グループオブジェクトの objectclass は何であるかを指定します。

_images/configure-tower-authen-ldap-group-search.png
  1. LDAP ユーザー属性マップ テキストフィールドに、ユーザー属性を入力します。この例では以下を使用します。

{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}

上記の例は、sn のキーから名 (last name) でユーザーを取得しています。同じ LDAP クエリーをそのユーザーに使用して、どのキーに保存されているのかを確認することができます。

_images/configure-tower-auth-ldap-user-attrb-map.png
  1. LDAP ユーザーフラグ (グループ別) テキストフィールドでユーザープロファイルフラグを入力します。この例では、以下の構文を使用して LDAP ユーザーを "Superusers" および "Auditors" に設定します。

{
"is_superuser": "cn=superusers,ou=groups,dc=website,dc=com"
"is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com"
}

上記の例では、プロファイルの superuser または auditor としてフラグがつけられたユーザーを取得します。

_images/configure-tower-auth-ldap-user-flags.png
  1. マッピングフィールドの入力に関する情報は、「LDAP 組織およびチームマッピング」を参照してください。

  2. 完了したら 保存 をクリックします。

このフォームで入力したこれらの値を使用して、LDAP で正常に認証を行うことができます。

注釈

Tower はユーザーの同期を行いませんが、ユーザーの作成は初期ログイン時に行われます。

18.1. 参照

Active Directory は、クエリーしたオブジェクトがデータベースで利用できない場合のために、「参照」を使用します。これは、django LDAP クライアントで多くの場合に正しく機能しないので、参照を無効にすると回避できます。/etc/tower/conf.d/ldap.py ファイルに以下の行を追加して、LDAP の参照を無効にしてください。

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_REFERRALS: False,
}

注釈

Ansible Tower バージョン 2.4.3 以降では、"参照" はデフォルトで無効になっています。以前のバージョンの Tower を実行している場合は、設定ファイルにこのパラメーターを追加することを検討してください。

マッピングフィールドの入力に関する情報は、「LDAP 組織およびチームマッピング」を参照してください。

18.2. LDAP のロギングの有効化

LDAP のロギングを有効にするには、LDAP 設定ファイル /etc/tower/conf.d/ldap.py で、レベルを DEBUG に設定する必要があります。

LOGGING['handlers']['tower_warnings']['level'] =  'DEBUG'

18.3. LDAP 組織およびチームマッピング

次に、LDAP 属性をもとに、どのユーザーがどの Tower 組織に配置されるかを制御する必要があります (組織の管理者/ユーザーと LDAP グループ間のマッピング)。

キーは組織名です。組織が存在しない場合には、作成されます。値は、各組織のメンバーシップのオプションを定義するディクショナリーです。各組織に対して、組織のユーザーとなるグループ、そして組織を管理するグループを自動的に指定することができます。

admins: None、True/False、文字列または文字列のリスト/タプル
  • None の場合は、組織の管理者は LDAP の値をもとに更新されません。

  • True の場合は、LDAP の全ユーザーが自動的に組織の管理者として追加されます。

  • False の場合は、組織の管理者として追加される LDAP ユーザーはありません。

  • 文字列または文字列のリストの場合は、指定したグループに一致する場合に、組織に追加されるグループ DN を指定します。

remove_admins: True/False。デフォルト値は False です。
  • True の場合は、指定のグループのメンバーでないユーザーは、組織の管理者リストから削除されます。

users: None、True/False、文字列または文字列のリスト/タプル。admins と同じルールが適用されます。

remove_users: True/False。デフォルト値は False で、remove_admins と同じルールが適用されます。

{
"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: 文字列。チームが所属する組織名。

チームは、組織とチームの組み合わせが存在しない場合には作成されます。組織が存在しない場合には、先に作成されます。

users: None、True/False、文字列または文字列のリスト/タプル

  • 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
}
}