注釈
接続する LDAP サーバーに、自己署名または企業内の証明局 (CA) で署名された証明書がある場合には、CA 証明書をシステムの信頼される CA に追加する必要があります。追加しない場合には、LDAP サーバーに接続すると、証明書の発行者が認識されていないというエラーが発生します。
管理者は、Tower ユーザーのアカウント認証情報のソースとして LDAP を使用します。ユーザー認証は提供されますが、ユーザーのパーミッションや認証情報は同期されません。組織のメンバーシップ (および組織の管理者) やチームのメンバーシップは同期可能です。
上記のように設定された場合に、LDAP のユーザー名およびパスワードでログインすると自動的に Tower のアカウントが作成され、各ユーザーは通常のユーザーまたは組織の管理者として組織に所属します。
LDAP ログインで作成されたユーザーは、ユーザー名、姓名を変更できず、ローカルのパスワードも設定できません。これは、さらにカスタマイズして他のフィールド名の編集を制限することができます。
Tower の LDAP 統合を設定する方法:
まず、LDAP 構造全体を読み取るアクセス権限を持つユーザーを LDAP に作成します。
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
パッケージからインストールできます。
Ansible Tower ユーザーインターフェースの設定 () メニュー画面から 認証 をクリックします。
デフォルトでは、Azure AD タブが最初に表示されます。
LDAP タブを選択します。
注釈
Ansible Tower 3.3 以降で、設定するサーバーを指定して複数の LDAP サーバーを設定できます (指定しない場合は、サーバーは Default のままとなります)。
同等の API エンドポイントにより、AUTH_LDAP_*
が表示され、AUTH_LDAP_1_*
、AUTH_LDAP_2_*
、... AUTH_LDAP_5_*
と繰り返し表示し、サーバーの割り当てを示します。
テキストフィールドに表示されている内容と同じフォーマットを使用して、LDAP サーバー URI フィールドに、接続先の LDAP サーバーアドレスを入力します。以下に例を示します。
注釈
接続する LDAP サーバーに、自己署名または企業内の証明局 (CA) で署名された証明書がある場合には、CA 証明書をシステムの信頼される CA に追加する必要があります。追加しない場合には、LDAP サーバーに接続すると、証明書の発行者が認識されていないというエラーが発生します。
LDAP バインド DN テキストフィールドに識別名を入力して、Tower が LDAP サーバーへの接続 (バインド) に使用するユーザーを指定します。以下では例として CN=josie,CN=users,DC=website,DC=com
を使用します。
LDAP バインドパスワード テキストフィールドにバインドに使用するユーザーのパスワードを入力します。以下の例では、パスワードは 'passme' です。
名前が sAMAccountName
キーに格納されている場合に、LDAP ユーザー DN テンプレート には (sAMAccountName=%(user)s)
のデータが投入されます。Active Directory はユーザー名を sAMAccountName
に保存します。同様に、OpenLDAP の場合は、キーは uid
なのでこの行は (uid=%(user)s)
となります。
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_attr
とmember_attr
の 2 つです。name_attr
のデフォルト値はcn
、member_addr
のデフォルト値はmember
です。{'name_attr': 'cn', 'member_attr': 'member'}特定の LDAP グループタイプが必要とするパラメーターを判断するには、「django_auth_ldap 」ドキュメントのクラス
init
パラメーターの部分を参照してください。
LDAP Require Group フィールドで識別名を入力して、対象のグループ内のユーザーが Tower にアクセスできるようにします。この際、テキストフィールドに表示されている形式と同じものを使用します。この例では、CN=Tower Users,OU=Users,DC=website,DC=com
を使用します。
LDAP 拒否グループ フィールドでグループの識別名を入力して、対象のグループ内のユーザーが Tower にアクセスできないようにします。この際、テキストフィールドに表示されている形式と同じものを使用します。この例では、このフィールドには何も入力しません。
LDAP Start TLS はデフォルトでは無効になっています。LDAP 接続で SSL を使用せずに TLS を有効化するには、クリックして ON に切り替えます。
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 行目は、ユーザー名を保存するキー名を指定します。
注釈
複数の検索クエリーの場合の正しい構文は以下のとおりです。
[
[
"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 グループ検索 のテキストフィールドで、検索するグループ、検索方法を指定します。この例では、以下を使用します。
[
"dc=example,dc=com",
"SCOPE_SUBTREE",
"(objectClass=group)"
]
最初の行は、グループを検索すべき基本 DN を指定します。
2 行目は、ユーザーディレクティブと同じで、範囲を指定します。
3 行目は、使用する LDAP において、グループオブジェクトの objectclass
は何であるかを指定します。
LDAP ユーザー属性マップ テキストフィールドに、ユーザー属性を入力します。この例では以下を使用します。
{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}
上記の例は、sn
のキーから名 (last name) でユーザーを取得しています。同じ LDAP クエリーをそのユーザーに使用して、どのキーに保存されているのかを確認することができます。
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 としてフラグがつけられたユーザーを取得します。
マッピングフィールドの入力に関する情報は、「LDAP 組織およびチームマッピング」を参照してください。
完了したら 保存 をクリックします。
このフォームで入力したこれらの値を使用して、LDAP で正常に認証を行うことができます。
注釈
Tower はユーザーの同期を行いませんが、ユーザーの作成は初期ログイン時に行われます。
Active Directory は、クエリーしたオブジェクトがデータベースで利用できない場合のために、「参照」を使用します。これは、django LDAP クライアントで多くの場合に正しく機能しないので、参照を無効にすると回避できます。/etc/tower/conf.d/custom.py
ファイルに以下の行を追加して、LDAP の参照を無効にしてください。
AUTH_LDAP_GLOBAL_OPTIONS = {
ldap.OPT_REFERRALS: False,
}
注釈
Ansible Tower バージョン 2.4.3 以降では、"参照" はデフォルトで無効になっています。以前のバージョンの Tower を実行している場合は、設定ファイルにこのパラメーターを追加することを検討してください。
マッピングフィールドの入力に関する情報は、「LDAP 組織およびチームマッピング」を参照してください。
LDAP のロギングを有効にするには、LDAP 設定ファイル DEBUG
で、レベルを /etc/tower/conf.d/custom.py
に設定する必要があります。
LOGGING['handlers']['tower_warnings']['level'] = 'DEBUG'
次に、LDAP 属性をもとに、どのユーザーがどの Tower 組織に配置されるかを制御する必要があります (組織の管理者/ユーザーと LDAP グループ間のマッピング)。
キーは組織名です。組織が存在しない場合には、作成されます。値は、各組織のメンバーシップのオプションを定義するディクショナリーです。各組織に対して、組織のユーザーとなるグループ、そして組織を管理するグループを自動的に指定することができます。
None の場合は、組織の管理者は LDAP の値をもとに更新されません。
True の場合は、LDAP の全ユーザーが自動的に組織の管理者として追加されます。
False の場合は、組織の管理者として追加される LDAP ユーザーはありません。
文字列または文字列のリストの場合は、指定したグループに一致する場合に、組織に追加されるグループ DN を指定します。
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 グループ間のマッピングです。キーはチーム名です (存在しない場合に作成されます)。値は、各チームのメンバーシップに関するオプションのディクショナリーとなります。各値には以下のパラメーターを含めることができます。
チームは、組織とチームの組み合わせが存在しない場合には作成されます。組織が存在しない場合には、先に作成されます。
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
}
}