Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第3章 汎用 LDAP の統合
本章では、Identity サービス (keystone) を汎用 LDAP 環境と統合する方法について説明します。
以下のユースケースでは、Identity サービスが特定の LDAP のユーザーを認証しつつ、Identity サービスデータベース内で承認設定および重要なサービスアカウントを保持します。この手順を実行すると、Identity サービスは、LDAP に読み取り専用でアクセスしてユーザーアカウントの認証を行う一方で、認証されたアカウントに割り当てる権限を引き続き管理するようになります。
3.1. 主要な用語
- 認証: パスワードを使用して、ユーザーが本人であることを検証するプロセス
- 承認: 認証されたユーザーに対して、アクセスしようとしているシステムの適切なパーミッションが付与されていることを確認するプロセス
- ドメイン: Identity サービス内で設定する追加のバックエンドのことを指します。たとえば、Identity サービスは、外部の LDAP 環境内のユーザーを認証するように設定することができます。このように設定されたユーザーの集合は、ドメインとして考えることができます。
3.2. 前提条件
本ガイドのデプロイメント例は、以下を前提としています。
- LDAP サーバーが設定済みで、稼働していること。
- Red Hat OpenStack Platform が設定済みで、稼働していること。
- DNS 名前解決が完全に機能しており、かつ全ホストが適切に登録されていること。
3.3. 影響評価
以下のステップを実行すると、LDAP ユーザーが OpenStack に対して認証を実行して、リソースにアクセスできるようになります。OpenStack のサービスアカウント (keystone、glance など) および承認管理 (パーミッションとロール) は Identity サービスのデータベースに残ります。パーミションとロールは、Identity サービスの管理ツールを使用して LDAP アカウントに割り当てられます。
3.3.1. 高可用性のオプション
この設定により、単一の LDAP に依存するようになるため、Identity サービスがその LDAP サーバー に対して認証できない場合には、プロジェクトユーザーが影響を受けることになります。このリスクを管理するオプションは複数あります。たとえば、keystone が 個別の IdM サーバーではなくDNS エイリアスやロードバランシングアプライアンスにクエリーを実行するように設定することが可能です。また、IdM サーバー の 1 つが利用できない場合には、keystone が異なる IdM サーバーにクエリーを実行するように設定することもできます。詳しくは、「高可用性の設定」を参照してください。
3.4. 停止の要件
- LDAP バックエンドを追加するには、Identity サービスを再起動する必要があります。
- keystone v3 に切り替えるには、全ノード上の Compute サービスを再起動する必要があります。
- ユーザーは、LDAP でアカウントが作成されるまでは、Dashboard にアクセスできません。ダウンタイムを短縮するには、この変更の前に十分余裕をもって LDAP アカウントのプレステージを行うことを検討してください。
3.5. ファイアウォールの設定
ファイアウォールが LDAP と OpenStack の間のトラフィックをフィルタリングしている場合には、以下のポートを介したアクセスを許可する必要があります。
送信元 | 送信先 | 種別 | ポート |
---|---|---|---|
OpenStack コントローラーノード |
LDAP サーバー |
LDAPS |
TCP 636 |
3.6. LDAP サーバーの設定
LDAP サーバーで以下のステップを実行して、Identity サービスの統合の準備をします。
1. LDAP ルックアップアカウントを作成します。
このアカウントは、Identity サービスが LDAP サービスにクエリーを実行するのに使用します。このデプロイメント例では、標準のパスワードポリシーの要件に加えて、以下の属性が必要となります。
- First name: OpenStack
- Last name: LDAP
- User name: svc-ldap
作成が完了したら、このアカウントのパスワード期限の設定を確認してください。
2. grp-openstack という名前の OpenStack ユーザーの LDAP グループを作成します。OpenStack Identity でパーミッションを割り当てることができるのは、このグループのメンバーのみです。
3. svc-ldap アカウントのパスワードを設定して、grp-openstack グループに追加します。
3.7. LDAPS 証明書の設定
1. LDAP の環境で、LDAPS 証明書を見つけます。このファイルの場所は、/etc/openldap/ldap.conf で確認することができます。
TLS_CACERT /etc/ipa/ca.crt
2. OpenStack Identity (keystone) を実行しているノードにファイルをコピーします。たとえば、以下のコマンドは、scp を使用して、ca.crt を node.lab.local という名前のコントラーノードにコピーします。
scp /etc/ipa/ca.crt root@node.lab.local:/root/
3. コントローラーノードで、.crt を .pem に変換します。
# openssl x509 -in ca.crt -out ca.pem -outform PEM
4. OpenStack コントローラーに .pem をインストールします。たとえば、Red Hat Enterprise Linux の場合は以下を実行します。
# cp ca.pem /etc/pki/ca-trust/source/anchors/ # update-ca-trust
5..crt を証明書のディレクトリーにコピーします。
# cp ca.crt /etc/ssl/certs/
3.8. Identity サービスの設定
以下のステップでは、LDAP との統合に備えて、Identity サービスの準備を行います。
3.8.1. keystone v3 へのコマンドラインアクセスの有効化
コマンドラインから Identity サービスドメインを管理するには、keystone v3 にアクセス可能である必要があります。
keystone サービスを実行しているコントローラーから以下の手順を実行します。
1. 既存の環境変数ファイルのコピーを作成します。director ベースのデプロイメントでは、overcloudrc
と呼ばれます。
$ cp overcloudrc overcloudrc-v3
2. 新しい overcloudrc-v3
ファイルを編集します。
-
以下のように、
OS_AUTH_URL
の値を v2.0 から v3 に変更してください。
export OS_AUTH_URL=http://controllerIP:5000/v3/
-
overcloudrc-v3
の一番下に、以下のエントリーを追加します。
export OS_IDENTITY_API_VERSION=3 export OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default
3. source コマンドでこの設定ファイルを読み込み、現在のコマンドラインセッションでこれらのオプションを有効にします。
$ source overcloudrc-v3
3.8.2. コントローラーの設定
keystone サービスを実行しているコントローラーから以下の手順を実行します。
1. SELinux を設定します。
# setsebool -P authlogin_nsswitch_use_ldap=on
2. domains ディレクトリーを作成します。
# mkdir /etc/keystone/domains/ # chown keystone /etc/keystone/domains/
3. Identity サービスが複数のバックエンドを使用するように設定します。
# openstack-config --set /etc/keystone/keystone.conf identity domain_specific_drivers_enabled true # openstack-config --set /etc/keystone/keystone.conf identity domain_config_dir /etc/keystone/domains # openstack-config --set /etc/keystone/keystone.conf assignment driver sql
Red Hat OpenStack Platform director を使用している場合には、/etc/keystone/keystone.conf が Puppet で管理されている点を認識する必要があります。このため、カスタムの設定を追加しても、openstack overcloud deploy
プロセスを実行する度に上書きされる可能があります。上書きされた場合には、この設定を毎回手動で追加し直す必要がある場合があります。今後の director のリリースでは、デプロイ後のスクリプトを使用して、このような設定を自動的に再適用するための Puppet のパラメーターが追加される予定です。
4. Dashboard で複数のドメインを有効にします。以下の行を /etc/openstack-dashboard/local_settings に追加します。
OPENSTACK_API_VERSIONS = { "identity": 3 } OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
Red Hat OpenStack Platform director を使用している場合には、/etc/openstack-dashboard/local_settings が Puppet で管理されている点を認識する必要があります。このため、カスタムの設定を追加しても、openstack overcloud deploy
プロセスを実行する度に上書きされる可能性があります。上書きされた場合には、この設定を毎回手動で追加し直す必要がある場合があります。今後の director のリリースでは、デプロイ後のスクリプトを使用して、このような設定を自動的に再適用するための Puppet のパラメーターが追加される予定です。
httpd サービスを再起動して、設定を適用します。
# systemctl restart httpd.service
5. 追加のバックエンドを設定します。
a. LDAP 統合のための keystone ドメインを作成します。
+ 新しい keystone ドメインに使用する名前を選択し、ドメインを作成します。たとえば、以下のコマンドは LAB
という名前の keystone ドメインを作成します。
# openstack domain create LAB
このコマンドが使用できない場合には、コマンドラインセッションでの keystone v3 へのアクセスが有効化されているかどうかを確認してください。
b. 設定ファイルを作成します。
LDAP バックエンドを追加するには、/etc/keystone/domains/keystone.LAB.conf (LAB
は、前のステップで作成したドメイン名に置き換えます) という名前の新規ファイルに LDAP 設定を入力します。以下の設定例は、実際に使用する LDAP デプロイメントに合わせて編集する必要があります。
[ldap] url = ldaps://ldap.lab.local user = uid=svc-ldap,cn=users,cn=accounts,dc=lab,dc=local user_filter = (memberOf=cn=grp-openstack,cn=groups,cn=accounts,dc=lab,dc=local) password = RedactedComplexPassword user_tree_dn = cn=users,cn=accounts,dc=lab,dc=local user_objectclass = inetUser user_id_attribute = uid user_name_attribute = uid user_mail_attribute = mail user_pass_attribute = user_allow_create = False user_allow_update = False user_allow_delete = False tls_cacertfile = /etc/ssl/certs/ca.crt [identity] driver = keystone.identity.backends.ldap.Identity
各設定項目について説明します。
設定 | 説明 |
---|---|
|
認証に使用する LDAP サーバー。LDAPS ポート |
|
LDAP クエリーに使用する LDAP 内のアカウント |
|
上記で使用した LDAP アカウントのパスワード (プレーンテキスト形式) |
|
Identity サービスに対して提示するユーザーをフィルタリングすることにより、grp-openstack グループのメンバーのみに Identity サービスで定義されているパーミッションを付与することができます。 |
|
LDAP 内の OpenStack アカウントへのパス |
|
LDAP ユーザーの種別を定義します。LDAP には |
|
ユーザー ID に使用する LDAP 値をマッピングします。 |
|
names に使用する LDAP 値をマッピングします。 |
|
ユーザーのメールアドレスに使用する LDAP 値をマッピングします。 |
|
この値は空白のままにします。 |
|
keystone では読み取り専用アクセスのみが必要であるため、この値を |
|
keystone では読み取り専用アクセスのみが必要であるため、この値を |
|
keystone では読み取り専用アクセスのみが必要であるため、この値を |
6. 設定ファイルの所有権を keystone ユーザーに変更します。
# chown keystone /etc/keystone/domains/keystone.LAB.conf
7. admin ユーザーにドメインへのアクセス権を付与します。
この手順を実行しても、OpenStack admin アカウントには LDAP のパーミッションは付与されません。この場合には、ドメインという用語は、OpenStack が使用する keystone ドメインのことを指しています。
a. LAB ドメインの ID
を取得します。
# openstack domain show LAB +---------+----------------------------------+ | Field | Value | +---------+----------------------------------+ | enabled | True | | id | 6800b0496429431ab1c4efbb3fe810d4 | | name | LAB | +---------+----------------------------------+
b. admin ユーザーの ID
の値を取得します。
# openstack user list --domain default | grep admin | 3d75388d351846c6a880e53b2508172a | admin |
c. admin ロールの ID
の値を取得します。
# openstack role list +----------------------------------+---------------+ | ID | Name | +----------------------------------+---------------+ | 544d48aaffde48f1b3c31a52c35f01f9 | SwiftOperator | | 6d005d783bf0436e882c55c62457d33d | ResellerAdmin | | 785c70b150ee4c778fe4de088070b4cf | admin | | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | +----------------------------------+---------------+
d. 返されたドメインおよび管理 ID を使用して、keystone LAB ドメインの admin ロールに admin ユーザーを追加するコマンドを構築します。
# openstack role add --domain 6800b0496429431ab1c4efbb3fe810d4 --user 3d75388d351846c6a880e53b2508172a 785c70b150ee4c778fe4de088070b4cf
8. httpd サービスを再起動して、変更を適用します。
# systemctl restart httpd.service
9. コマンドで keystone ドメイン名を指定して、LDAP ドメイン内のユーザー一覧を確認します。
# openstack user list --domain LAB
10. ローカルの keystone データベース内のサービスアカウントを確認します。
# openstack user list --domain default
3.8.3. Compute が keystone v3 を使用するようにするための設定
Compute はデフォルトで keystone v2.0 を使用するように設定されているので、マルチドメイン機能を使用するためには、keystone v3 を使用するように設定する必要があります。
1. 各コンピュートノードとコントローラーで keystone_authtoken
値を変更します。
# openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_version v3
2. コントローラーでサービスを再起動して、変更を適用します。
# systemctl restart openstack-nova-api.service openstack-nova-cert.service openstack-nova-conductor.service openstack-nova-consoleauth.service openstack-nova-novncproxy.service openstack-nova-scheduler.service
3. 各コンピュートノードでこのサービスを再起動して、変更を適用します。
# systemctl restart openstack-nova-compute.service
3.8.4. Block Storage が keystone v3 を使用するようにするための設定
keystone v3 に対して認証を実行するには、Block Storage (cinder) を設定する必要もあります。
/etc/cinder/cinder.conf を編集します。
[keystone_authtoken] auth_uri = http://controllerIP:5000/v3 auth_version = v3
-
auth_uri
のcontrollerIP
の箇所をコントローラーの IP アドレスに置き換えます。
3.8.5. LDAP ユーザーによるプロジェクトへのアクセスの許可
grp-openstack LDAP グループのメンバーである LDAP ユーザーには、Dashboard 内のプロジェクトにログインするパーミッションを付与することができます。
1. LDAP ユーザーの一覧を取得します。
# openstack user list --domain LAB +------------------------------------------------------------------+----------------+ | ID | Name | +------------------------------------------------------------------+----------------+ | 1f24ec1f11aeb90520079c29f70afa060d22e2ce92b2eba7784c841ac418091e | user1 | | 12c062fLDAP5f8b065434d9ff6fce03eb9259537c93b411224588686e9a38bf1 | user2 | | afaf48031eb54c3e44e4cb0353f5b612084033ff70f63c22873d181fdae2e73c | user3 | | e47fc21dcf0d9716d2663766023e2d8dc15a6d9b01453854a898cabb2396826e | user4 | +------------------------------------------------------------------+----------------+
2. ロールの一覧を取得します。
# openstack role list +----------------------------------+---------------+ | ID | Name | +----------------------------------+---------------+ | 544d48aaffde48f1b3c31a52c35f01f9 | SwiftOperator | | 6d005d783bf0436e882c55c62457d33d | ResellerAdmin | | 785c70b150ee4c778fe4de088070b4cf | admin | | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | +----------------------------------+---------------+
3. 一覧表示されたロールの中から 1 つまたは複数のロールをユーザーに追加して、プロジェクトへのアクセス権を付与します。たとえば、user1 を demo プロジェクトの一般ユーザーにするには、_member_
ロールに追加します。
# openstack role add --project demo --user 1f24ec1f11aeb90520079c29f70afa060d22e2ce92b2eba7784c841ac418091e _member_
また、user1 を demo プロジェクトの管理ユーザーにするには、admin ロールに追加します。
# openstack role add --project demo --user 1f24ec1f11aeb90520079c29f70afa060d22e2ce92b2eba7784c841ac418091e admin
その結果、user1 は LDAP のユーザー名とパスワードを入力してから、ドメインのフィールドにも LAB
と入力すると Dashboard にログインすることができます。
ユーザーに「Error: Unable to retrieve container list.」というエラーメッセージが表示され、コンテナーの管理が可能であることが想定されている場合には、SwiftOperator ロールに追加する必要があります。
3.9. 新規プロジェクトの作成
上記の統合ステップが完了した後に新規プロジェクトを作成する場合には、Default
ドメインと、自分で作成した keystone ドメインのどちらに作成するかを決定する必要があります。これは、ワークフローとユーザーアカウントの管理方法を考慮して決定することができます。Default
ドメインは、サービスアカウントと admin
プロジェクトに使用する内部ドメインとして考えることができるので、AD でバッキングされているユーザーを異なる keystone ドメインに内に配置することは理にかなっています。これは、LDAP ユーザーが管理されているのと全く同じ keystone ドメインである必要はありません。また、分離の目的で複数の keystone ドメインを使用することも可能です。
3.9.1. Dashboard へのログインプロセスの変更
Identity サービスに複数のドメインを設定すると、Dashboard のログインメージに新しい ドメイン フィールドが有効になります。
ユーザーは、ログイン認証情報にマッチするドメインを入力する必要があります。このフィールドには、keystone で提示されるドメインの 1 つを手動で入力する必要があります。利用可能なエントリーを表示するには、openstack コマンドを使用します。
以下の例では、LDAP アカウントには LAB
ドメインを指定する必要があります。admin のような組み込みの keystone アカウントには、ドメインに Default
を指定する必要があります。
# openstack domain list +----------------------------------+---------+---------+----------------------------------------------------------------------+ | ID | Name | Enabled | Description | +----------------------------------+---------+---------+----------------------------------------------------------------------+ | 6800b0496429431ab1c4efbb3fe810d4 | LAB | True | | | default | Default | True | Owns users and tenants (i.e. projects) available on Identity API v2. | +----------------------------------+---------+---------+----------------------------------------------------------------------+
3.9.2. コマンドラインへの変更
特定のコマンドでは、対象のドメインを指定する必要がある場合があります。たとえば、以下のコマンドに --domain LAB
を追加すると、LAB ドメイン内のユーザー (grp-openstack グループのメンバー) が返されます。
# openstack user list --domain LAB
--domain Default
を追加すると、組み込みの keystone アカウントが返されます。
# openstack user list --domain Default
3.9.3. LDAP 統合のテスト
以下の手順では、Dashboard の機能へのユーザーアクセスをテストして、LDAP の統合を検証します。
1. LDAP にテストユーザーを作成し、そのユーザーを grp-openstack
LDAP グループに追加します。
2. テストユーザーを demo
テナントの _member_
ロールに追加します。
3. LDAP テストユーザーの認証情報を使用して Dashboard にログインします。
4. 各タブをクリックし、エラーメッセージなしに正常に表示されているかどうかを確認します。
5. Dashboard を使用してテストインスタンスをビルドします。
上記の手順で問題が発生した場合には、組み込みの admin アカウントでステップ 3 から 5 までを実行してください。正常に実行できた場合には、OpenStack が想定通りに機能していることが実証されるので、問題は LDAP と Identity の統合設定の間のどこかにあることになります。「トラブルシューティング」を参照してください。
3.10. 高可用性の設定
keystone v3 が有効化されている場合には、ドメインの設定ファイルに複数の LDAP サーバーをリストして、この設定を高可用性にすることが可能です。
1. 2 番目のサーバーを url
エントリーに追加します。たとえば、keystone.LAB.conf ファイル内の url
設定を更新すると、Identity サービスは全クエリートラフィックをリスト内で 1 番目の LDAP サーバーである ldap.lab.local に送信します。
url = ldaps://ldap.lab.local,ldaps://ldap2.lab.local
ldap.lab.local が利用できないためにクエリーが失敗した場合には、Identity サービスはリストに記載されている次のサーバー ldap2.lab.local にクエリーの送信を試みます。この設定では、ラウンドロビン式にはクエリーが実行されないので、ロードバランスのソリューションとしては考慮できない点に注意してください。
2. /etc/openldap/ldap.conf でネットワークのタイムアウトを設定します。
NETWORK_TIMEOUT 2
また、コントローラーと LDAP サーバーの間でファイアウォールが設定されている場合には、LDAP サーバーがダイアログを表示せずにコントローラーからのパケットを破棄してしまわないように設定すべきです。このように設定すると、python-keystoneclient が機能停止を適切に検知して、リスト内の次の LDAP サーバーに要求をリダイレクトすることができます。
クエリーがリストの第 2 の LDAP サーバーに転送される間に接続の遅延が発生する可能性があります。これは、第 2 のサーバーへの接続を試みるには、第 1 のサーバーがタイムアウトになる必要があるためです。
3.11. トラブルシューティング
3.11.1. LDAP 接続のテスト
LDAP サーバーに対してテストクエリーをリモートで実行するには、ldapsearch を使用します。クエリーが成功した場合には、ネットワーク接続が機能しており、LDAP サービスが稼働中であることを確認できます。以下の例では、テストクエリーはサーバー ldap.lab.local のポート 636 に対して実行されます。
# ldapsearch -D "cn=directory manager" -H ldaps://ldap.lab.local:636 -b "dc=lab,dc=local" -s sub "(objectclass=*)" -w RedactedComplexPassword
ldapsearch は、openldap-clients パッケージに含まれています。このパッケージは、# yum install openldap-clients
のコマンドを実行するとインストールすることができます。
3.11.2. ポートアクセスのテスト
nc を使用して、LDAPS ポート (636) がリモートでアクセス可能であることを確認します。この例では、サーバー ldap.lab.local に対してプローブを実行します。ctrl-c を押してプロンプトを終了します。
# nc -v ldap.lab.local 636 Ncat: Version 6.40 ( http://nmap.org/ncat ) Ncat: Connected to 192.168.200.10:636. ^C
接続を確立できなかった場合には、ファイアウォールの設定に問題がある可能性があります。