銀の光と碧い空

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

Azure Active Directory Domain Services (AAD DS)を使って、RHEL Serverから openldap-clients で接続してみる

AADは非常に便利なのですが、LDAPプロトコルがそのままでは使えません。LDAPを使いたい場合はAAD DSを使います。

docs.microsoft.com

なのですが、意外とLinuxのopenldap-clientsから接続する場合の手順がみつからず非常に手間取ったのでまとめておきたいと思います。なお手順は試行錯誤の末できたという状態なので、もしかすると不要な手順やよりよい手順がある可能性が高いです。ちなみに最終的にやりたかったことは、OpenShiftのmaster APIの認証をLDAP経由でAADから認証させたいということです。

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

AAD DSの構築

基本的にはこの手順に従って作成するだけです。

docs.microsoft.com

注意点としては、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などに問い合わせることをおすすめします。

さて、ドメインサービスを設定するとこのような表示がでます。

f:id:tanaka733:20170706152037p:plain

これはドメインサービス側にパスワードハッシュが存在しあいので、そのままだとパスワードで認証できないことを意味しているようです*1。実際にパスワード同期を設定しないままLDAP接続を試みても認証が通りませんでした。というわけでパスワード同期を設定するためにこのドキュメントに沿って進めます。

docs.microsoft.com

つまり、パスワード同期をするためにはユーザー自身がそれぞれでパスワードのリセットを行う必要があるということのようです。そしてこの手順を行うには、ユーザーによるパスワードのリセットを有効化しないといけないのですが、この設定はBasicかPremiumが必要です。自分が検証に利用したアカウントはFreeだったので、trialでPremiumを有効にして検証を進めました。

docs.microsoft.com

さてこの手順を行うとユーザーによるパスワードのリセットができますが、注意点として、Microsoftアカウントのユーザーではリセットできません。AzureにサインアップするときMicrosoft アカウントを利用すると、AADにMicrosoftアカウントが追加されますが、このユーザーではパスワードリセットできないので、AADに追加したユーザーでないといけないようです。

VNET ピアリングの設定

今回はARMで仮想マシンを構築したいので、ClassicのVNETと仮想マシンに使うARMのVNETをVNETピアリングで接続することにしました。注意点としては、プライベートIPレンジが重ならないように設計しておくことでしょうか。

docs.microsoft.com

(オプション)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サーバーを設定しました。

f:id:tanaka733:20170706154839p:plain

これでAAD DSを設定するときに指定したドメイン(デフォルトだと hogefuga.onmicrosoft.com 的なドメイン)に参加することができます。参加するときにユーザーとパスワードを聞かれるので、そのタイミングで事前にパスワードハッシュが作成されAAD DS側に同期されている必要があります。また、ここでWindows Serverに追加したユーザーでリモート接続できるようになります。

さて、ドメインに参加して追加したユーザーでログインすると、Active Directory Users and Computers (ADUC)で中を観ることができます。

f:id:tanaka733:20170706155448p:plain

ここで見るとわかるように、デフォルトの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を管理者として実行するだけでよいのでこれを使いました。実行すると接続先を聞かれるので、ドメイン名を入力します。

f:id:tanaka733:20170706160121p:plain

表示するとこんな風になります。

f:id:tanaka733:20170706160353p:plain

これで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で接続するまでの手順になります。

f:id:tanaka733:20170706162153p:plain

*1:いまいち自信がない

*2:その場合、DNSサーバーを設定後仮想マシンを再起動する必要があります

*3:adadminをtypoした説がある