銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure AD Domain Services を ARM VNetに作成し、peeringさせてVNet上のOpenShiftからLDAP認証させる

以前に同じような記事を書きましたが、そのときはAzure AD Domain ServicesはClassic Networkにしか作成できませんでした。

tech.tanaka733.net

tech.tanaka733.net

今回ARM VNetに作成できるようになったので試してみました。

作成する前にこのドキュメントを読んでおきます。

docs.microsoft.com

単純には、Domain Servicesを有効にしたVNet上にOpenShiftやそのほかAAD DSを参照するサービスを置けば動くはずですが、Domain Servicesに設定するVNetは専用のものを割り当てた方がよいとあるので、それに倣います。あとで、必要なVNetとpeeringして参照できるようにします。リージョン越えて接続する必要がある場合はサイト間VPNが利用できます。

実際に作成する手順はこちらのドキュメントを見て進めます。

docs.microsoft.com

特に面倒なところはなく作成まで進みます。ただ、作成を開始してから実際にDomain Servicesを参照するIPアドレスが利用可能になるには30~1時間ほどかかりました。

Domain ServicesのIPアドレスが利用可能になる間に(なってからでもいいですか)、VNet peeringの設定を行います。といっても、ARM VNet同士のpeeringはAzure PortalのVnetブレードから設定できます。注意点としては、双方向でpeeringを設定しないと接続できません。Azure Portalの表示でPEERING STATUSがConnectedになっているところまで確認しましょう。

f:id:tanaka733:20170906013524p:plain

ここまでできたら、peering相手のVNet上に起動したVMからDomain Servicesが参照できるようになります。VMが起動済みの場合はpeering完了後に再起動しておく必要があります。

OpenShiftの設定をする前にopenldap-clientsをインストールしてLDAP接続を確認しておきましょう。ドメインはexample.onmicrosoft.comを仮定しています。AAD DC Administratorsにadminユーザーが属しており、testというユーザーがocpusersというグループの中にいます。

# yum install openldap-clients

# ldapsearch -x -LLL -h <DomainServicesのIPアドレス> -D "cn=<AAD DC管理者ユーザーのを識別するCN>,ou=AADDC Users,DC=example,DC=onmicrosoft,DC=com" -W -b "OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com"
//testユーザーの結果のみ表示
dn: CN=test,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: test
distinguishedName: CN=test,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com
instanceType: 4
whenCreated: 20170903140510.0Z
whenChanged: 20170905081811.0Z
displayName: test
uSNCreated: 20496
memberOf: CN=ocpusers,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=
 com
uSNChanged: 29234
name: test
objectGUID:: XXXXX
userAccountControl: 544
badPwdCount: 1
codePage: 0
countryCode: 0
badPasswordTime: 131490732568021847
lastLogoff: 0
lastLogon: 131490731077979891
pwdLastSet: 131490727552992577
primaryGroupID: 513
objectSid:: XXXXXXXX
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: test
sAMAccountType: 805306368
userPrincipalName: test@example.onmicrosoft.com
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=example,DC=onmicrosoft,DC=com
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 131490730911102975
msDS-AzureADObjectId:: XXXXXX
msDS-AzureADMailNickname: test

//testユーザーのパスワードがDomain Servicesの同期されていることを確認する。パスワードを入れて認証できればOK。
# ldapwhoami -x -D "CN=test,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com" -h <DomainServicesのIPアドレス> -W
Enter LDAP Password: 
u:EXAMPLE\test

ここまで確認できたら、OpenShiftのmaster configurationをドキュメントに従って変更します。

Configuring Authentication and User Agent | Installation and Configuration | OpenShift Container Platform 3.6

今回の場合肝心の部分はこんな感じになります。

  - name: "aad_ds_provider"
    challenge: true
    login: true
    mappingMethod: claim
    provider:
      apiVersion: v1
      kind: LDAPPasswordIdentityProvider
      attributes:
        id:
        - dn
        email:
        - userPrincipalName
        name:
        - cn
        preferredUsername:
        - sAMAccountName
      bindDN: "cn=admin,ou=AADDC Users,DC=example,DC=onmicrosoft,DC=com"
      bindPassword: "<adminユーザーのパスワード>"
      insecure: true
      url: "ldap://<DomainServicesのIPアドレス>/OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com?userPrincipalName?sub?(memberof=CN=ocpusers,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com)"

変更後、masterサービスを再起動すればLDAP情報でログインできるようになるはずです。ならない場合、詳細なエラーログはログレベルを上げて確認します。/etc/sysconfig/atomic-openshift-master (single masterの場合)のloglevelを5に変更します。8とかでもいいですが、余計な出力が増えるのでまず5で試すのがいいかと思います。