AADは非常に便利なのですが、LDAPプロトコルがそのままでは使えません。LDAPを使いたい場合はAAD DSを使います。
なのですが、意外とLinuxのopenldap-clientsから接続する場合の手順がみつからず非常に手間取ったのでまとめておきたいと思います。なお手順は試行錯誤の末できたという状態なので、もしかすると不要な手順やよりよい手順がある可能性が高いです。ちなみに最終的にやりたかったことは、OpenShiftのmaster APIの認証をLDAP経由でAADから認証させたいということです。
AAD DSの構築
基本的にはこの手順に従って作成するだけです。
注意点としては、Classicネットワークしかサポートしていないので、今は懐かしい旧ポータルで作業をすすめていきます。また、今では仮想マシンはAzure Resource Manager (ARM)で作ることが多いと思いますが、その場合は後でVNETピアリングやVNET-to-VNET VPNでprivateネットワーク接続することになります。 先に仮想ネットワークを作成しておいてから、ドメインサービスを有効にする段階で該当するネットワークを選択します。設定後、最初のIPアドレスが表示されるまで20~30分、2つ目のIPアドレスが表示されるまでまた20~30分かかるので気長に待ちましょう。
AAD Premiumの有効化とパスワード同期の設定
追記 (2017/07/06 21:00) その後別のAADを立てて検証したところ、とくにパスワード同期の設定をしなくてもLDAP認証が可能になることがわかりました。ただ、AAD DSの設定が完了後、既存のAADユーザーが認証可能になるまで30分ほどかかりました。この辺の詳細な挙動はドキュメントになっていないので、なんとも…という感じです。本番システムでの運用の場合は、設計に関してAzure Supportなどに問い合わせることをおすすめします。
さて、ドメインサービスを設定するとこのような表示がでます。
これはドメインサービス側にパスワードハッシュが存在しあいので、そのままだとパスワードで認証できないことを意味しているようです*1。実際にパスワード同期を設定しないままLDAP接続を試みても認証が通りませんでした。というわけでパスワード同期を設定するためにこのドキュメントに沿って進めます。
つまり、パスワード同期をするためにはユーザー自身がそれぞれでパスワードのリセットを行う必要があるということのようです。そしてこの手順を行うには、ユーザーによるパスワードのリセットを有効化しないといけないのですが、この設定はBasicかPremiumが必要です。自分が検証に利用したアカウントはFreeだったので、trialでPremiumを有効にして検証を進めました。
さてこの手順を行うとユーザーによるパスワードのリセットができますが、注意点として、Microsoftアカウントのユーザーではリセットできません。AzureにサインアップするときMicrosoft アカウントを利用すると、AADにMicrosoftアカウントが追加されますが、このユーザーではパスワードリセットできないので、AADに追加したユーザーでないといけないようです。
VNET ピアリングの設定
今回はARMで仮想マシンを構築したいので、ClassicのVNETと仮想マシンに使うARMのVNETをVNETピアリングで接続することにしました。注意点としては、プライベートIPレンジが重ならないように設計しておくことでしょうか。
(オプション)Windows Serverを作成して、ドメイン参加してLDAPで接続してみる
ゴールはLinuxマシンからの接続なので本来は不要な手順なんですが、いきなり openldap-clientsだけでつなごうとしてうまくいかなくて心が折れたので、まずはWindows Serverでこて調べをします。ARMでWindows Server 2016 Datacenter Editionを作成して、VNET peeringした仮想ネットワークにつなぎます。いったんは仮想マシン作成時に指定できる普通のユーザー/パスワードでリモートログインしたあとにドメインに参加します。 このとき、デフォルトだとVNET PeeringしたARM側のVNETはDNSサーバーがAzure内部DNSのままで、AAD DSのIPアドレスにはなっていません。ARM側のVNETのDNSサーバーをAAD DSのものにしてもいいですが*2、今回は仮想マシンのVNIC単位でDNSサーバーを設定しました。
これでAAD DSを設定するときに指定したドメイン(デフォルトだと hogefuga.onmicrosoft.com 的なドメイン)に参加することができます。参加するときにユーザーとパスワードを聞かれるので、そのタイミングで事前にパスワードハッシュが作成されAAD DS側に同期されている必要があります。また、ここでWindows Serverに追加したユーザーでリモート接続できるようになります。
さて、ドメインに参加して追加したユーザーでログインすると、Active Directory Users and Computers (ADUC)で中を観ることができます。
ここで見るとわかるように、デフォルトのOUはAADDC Users
になります。addmin*3とocpuser1がAADで追加したユーザーでopenshiftがグループです。
最初、AADユーザーやグループのOUがどれになるのかわからなくて困っていたのですが、ブチザッキに助けてもらいました。
Azure Active Directory Domain Services (Public Preview)buchizo.wordpress.com
ただ、これはLDAPではなくActive Directoryとして見ています。せっかくなのでWindowsからLDAPクライアントとして見ることができないかと思っていたら、こういうツールを見つけました。
LDAP Admin - a free LDAP directory browser and editor
インストールの必要なく、解凍してでてきたexeを管理者として実行するだけでよいのでこれを使いました。実行すると接続先を聞かれるので、ドメイン名を入力します。
表示するとこんな風になります。
これでLDAPの属性などが見られるので便利です。これで確認できたところで本題に移ります。
RHEL Serverからopenldap-clientsでつなぐ
というわけでまずは、ARMでRHEL Serverを構築します。構築したあと、openldap-clientsをインストールします。
$ sudo yum install openldap-clients
これでldapsearch
コマンドが使えるようになったので繋いでみます。-W
と指定しているので、プロンプトでパスワード入力を求められます。AAD DSのIPアドレスが172.XX.XX.XX、ドメインがexample.onmicrosoft.comという前提で、出力結果からいくつかの属性を除いています。
$ ldapsearch -LLL -x -D "cn=addmin,ou=AADDC Users,DC=example,DC=onmicrosoft,DC=com" -h 172.XX.XX.XX -W -b "CN=openshift,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com" dn: CN=openshift,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com objectClass: top objectClass: group cn: openshift member: CN=ocpuser1,OU=AADDC Users,DC=example,DC=onmicrosoft,DC=com distinguishedName: CN=openshift,OU=AADDC Users,DC=example,DC=onmicr osoft,DC=com instanceType: 4 name: openshift sAMAccountName: openshift sAMAccountType: 268435456 groupType: -2147483646 objectCategory: CN=Group,CN=Schema,CN=Configuration,DC=example,DC=o nmicrosoft,DC=com msDS-AzureADObjectId:: d2aCBDo84E2dQES9N5djSw== msDS-AzureADMailNickname: 0846aab7-9b8e-45d5-b8fd-3cc70c05310b
という感じでわかってしまえば簡単そうなのですが、AAD DSにopenldap-clientsで接続するまでの手順になります。