Mac OS X 10.7.5でOpenLDAPを使って認証させたかった

0. 始めに

Mac OS X 10.7.5でOpenLDAPを使って認証させたかった。
うちのLANはUNIX系システムの認証にLDAPを利用している。全部で20〜30ホストぐらいあるのだけれど認証を一元化できるので非常に便利で助かっている。

ところでMacBookをもっているのだけれど、この認証もLDAPに参加できないかと思ってみた。画面共有だとかローカルユーザだとか、UIDを一致させたかった。ノートパソコンなので持ち出すことがある。なのでLDAPのスレーブにしてしまって親元サーバから認証情報をもらい、ローカルホストで認証を掛けようと思ってみた。
そこでまずはMac OS XなホストをLDAPクライアントにしてみた。これが意外にも大変だった。

1. ネットの情報を元にLDAPの設定

ネットで検索してみると色々と情報が出てくる。見る限り別段問題はなさそう。というわけで気軽にぽちぽちと設定してみた。GUIから設定できるのでLDAPに少し馴染んでいれば設定していける。

Screen Shot 2013-01-29 at 17.13.45

まずシステム環境設定から Users & Groups 、左タブ下部にある Login Options。右ペインの下部にあるNetwork Account ServerのEditを選択。
新規の場合にはプラスマークをクリックして新しいネットワーク認証プロファイルを作成。
続いてネットワーク認証プロファイルの設定を進めて行く。サービスは”LDAPv3″を選択。下部の編集ボタンから詳細画面を出す。

Screen Shot 2013-01-29 at 17.14.04

LDAP認証サーバの追加を”New”から行う。サーバ名とかはLDAPサーバの情報を入れておく。LDAP Mappingsは”RFC2307″を選択。

あっけないけれど以上で一応設定はおしまい。
で、ここで設定がうまくいっているかどうかの確認。
確認する箇所は二つ。System Preferencesから開いた Users & GroupsのNetwork Account Serverの項目に緑色のランプが付いた状態であればひとまずサーバとの通信ができていることが確認できる。ココが緑にならないのであればIPアドレスだとかが違うということになる。

次いでネットワーク認証プロファイルの設定画面から、上のタブ、一番右側にある、Directory Editorを選択。ここの上部 “in node”のプルダウンを該当するLDAPプロファイルを選択。

ここで左のカラムにldapsearchの結果が拾えてきていれば成功。だけど自分の環境ではうまくいかなかった。

Screen Shot 2013-01-29 at 17.14.42

なぜか認証を求められ、それっぽいアカウント名を入れても全然通らない。
(yubird先生が)ググったところどうやらmac os x 10.7のバグだ、という記事を見つけてきてくれた。

2. mac os xのバグ

バグの記事は下記の通り。

Last week Apple released OS X 10.7.2. They fixed the bug that allowed one to use any password to login when LDAP authentication is enabled. Now one can’t use any password to login. Fortunately, I found a workaround for this bug.

The new bug is that Opendirectoryd uses the best SASL authentication method advertised by the LDAP server. The options for forcing simple anonymous binds in Directory Utility are greyed out.

Here is how I managed to get 10.7.2 to authenticate against our OpenLDAP servers running on Ubuntu Linux.


LDAP Authentication with Simple Binds on OS X Lion 10.7.2

テキトウに訳した。

LDAPにはシンプルバインドとSASL、二種類の認証問い合わせ方式がある。シンプルバインドの方はその名の通り、匿名ユーザで認証のみ問い合わせたりするかんたんなやりかた。対してSASLは認証にこぎ着けるまでに暗号化方式の提案おこなって、受諾してとかややこしいのだけれど一度SASLで認証すれば安全性が担保される方式。(調べもせずに予測してるだけ!)
今回上記で設定したのはシンプルバインドのやりかたでやったのだけれど実は10.7には重大なバグがあり、LDAPのシンプルバインドを行うべき箇所なのにSASLでなんとか認証しようとしてしまうのだ。なのでこれをSASLでの認証を拒否させ、SASLダメだからシンプルバインドで認証しよう、と思わせる方法にて回避しましょう、というもの。
なるほど、よく分からないです。
先ほどのネットワーク認証プロファイルを直接編集する。plistファイルには認証するための情報が入っている。その中にはSASLで認証を行う際、受諾しない暗号化用ハッシュアルゴリズムの一覧がある。この受諾しない暗号化用ハッシュアルゴリズムをいっぱい、というか全部書いてしまえばLDAPサーバから「このハッシュアルゴリズムでどうよ」「やだねww」ということになり、無理矢理シンプルバインドにて認証ができる、というものらしい。

3. というわけで手順。

ネットワーク認証プロファイルを開く。バイナリになっている(もしかしたらいけるのかも)のでxcode付属のplist editorを利用。xcodeが入っていれば関連づけされているのでopenコマンドで開こうとする、が、開けない。パーミッション問題らしい。
sudoを付けてもだめなようで(xcode自体をsudoで開いていれば良いと思う)、いったんパーミッションをあける。面倒なので先のplistファイルを0666にしてやる(元は0600)。またplistファイルの編集にはファイルロックを取得する必要がある。このためにはファイルが置いてあるディレクトリにもwパーミッションがないとダメらしい。なので親元のディレクトリを0777にする(元は0755)。

shell> sudo chmod 0777 /Library/Preferences/OpenDirectory/Configurations/LDAPv3/

shell> sudo chmod 0666 /Library/Preferences/OpenDirectory/Configurations/LDAPv3/ldap.example.com.plist

shell> sudo open /Library/Preferences/OpenDirectory/Configurations/LDAPv3/ldap.example.com.plist

無事plist editorが開いたらロックを取得。上部メニューバーからFile > Lockでロックを取得。

module options > ldap > Denied SASL Methodsとたどり項目を列挙する。プラスマークを押すとItemが増える。Itemが増えたらKey名はそのままでValueを書く。ここで書くValueはLDAPサーバが教えてくれる暗号化として受け入れるハッシュアルゴリズムをすべて書く。受諾されるべき暗号化ハッシュアルゴリズムの調べ方は下記の通り。(-hの後にサーバのホスト名を書いてね)

shell> ldapsearch -x -h ldapserver -b "" -s base "(objectclass=*)" supportedSASLMechanisms

コレで書き終えたらFileから保存。で、上の方法でアクセスできるか確認。

shellでもidとかで確認。

ちなみにほとんどの作業でyubird先生にアドバイスをもらいまくりました。いつもお手数をかけていますありがとうございます!

以上!

コメントを残す