TL;DR
- Server.appでOpenDirectoryに有効な証明書を設定
- ダメなら一回キーチェーンから証明書を削除して再登録
- SIPをオフにする
- /System/Library/LaunchDaemons/org.openldap.slapd.plistのProgramArgumentsの最後の要素にldaps:///を追加
- SIPをオンにする
背景
OSX Serverからいろんな機能を削るよというAppleの宣言により、一応使ってたサービスをどうするかという検討をしました。 我が家では、前に書いたようにOSX Serverを使って色々やっていました。主に使っていたのは以下のサービスです。
- iOSデバイス向けMDM
- カレンダーサーバ
- メールサーバ*1
でした。MDMは今後も残る機能だからよく、カレンダーサーバはiCloudに移行すればよかったのでそうしたのですが、問題はメールサーバ。Postfixインストール済みのサーバはある*2から流用すれば良いけれど、ユーザ認証をどうするか。
ここで、OSX ServerのLDAPが出てくるわけです。 OpenDirectoryは手っ取り早くいうと「OpenLDAPに幾つかの薄い皮を被せたもの」なので、普通にLDAPv3サーバとして利用でき、ということはPostfixやdovecotとの連携も容易です。
問題は、インターネットから自宅サーバまでのセキュリティをどう保つか。 もちろんIPアドレス制限は当然のように行いますが、当然E2EのSSL通信としたい。となればLDAPSを喋らせたくなるわけです。
デフォルト状態
というわけで喋らせようと思うところ、そう簡単ではないわけです。 Server.appからSSLをオンにしてLDAPSで繋ごうとしてもうまくいきません。
# OK % ldapsearch -D [bind DN] -H ldap://[OSX_SERVER] -b [base DN] [query] # NG % ldapsearch -D [bind DN] -H ldaps://[OSX_SERVER] -b [base DN] [query]
ldapsをサーバに喋らせるには(探索編)
こういう時、"OSX Server ldaps"とかでGoogle検索しても、なかなか良い情報が出てきません。マイナープラットフォームゆえの哀しさです。 なので一旦諦めて"OpenLDAP ldaps"などで検索するとlinuxでの方法が出てきます。例えばここなど。 このページには/etc/sysconfig/slapdを変更する、と書いてありますが、このディレクトリはOSX Serverには当然存在しないので読み替えます。マイナープラットフォームのユーザは常にこの手の「読み替え」が必要です。 man slapd などで調べてみるとこれはslapdの起動引数であることがわかります。なので、次は起動引数です。デーモンの起動引数といえばOSXでは(/System)?/Library/LaunchDaemonsなのでこの辺りでfindします。
% find /System/Library/LaunchDaemons -name \*ldap\*
で引っかかるのが/System/Library/LaunchDaemons/org.openldap.slapd.plistです。 とりあえず覗いてみると該当箇所はこうです。
<key>ProgramArguments</key> <array> <string>/usr/libexec/slapd</string> <string>-d</string> <string>0</string> <string>-h</string> <string>ldap:/// ldapi://%2Fvar%2Frun%2Fldapi</string> </array>
ここで「ああ/System配下なのか面倒だな」と思ったあなたはよく訓練されたOSXユーザです。そうですSIP(a.k.a rootless)です*3。
ldapsをサーバに喋らせるには(解決編)
というわけで、/System/Library/LaunchDaemons/org.openldap.slapd.plistを変更すれば良いのですが、そのための手順は以下となります。
- リカバリモードで起動してSIPをオフにする
- /System/Library/LaunchDaemons/org.openldap.slapd.plistを変更
- SIPを再度オンにする*4
SIPをオフにする
まず再起動して、起動するまで⌘-Rを押し続けるとリカバリモードになります。ここで「ユーティリティ」から「ターミナル」を選びます。 ターミナルで以下コマンドを入力します。
# csrutil disable
ファイルを編集
org.openldap.slapd.plistの前掲の部分をこう変えます。
<key>ProgramArguments</key> <array> <string>/usr/libexec/slapd</string> <string>-d</string> <string>0</string> <string>-h</string> <string>ldaps:/// ldap:/// ldapi://%2Fvar%2Frun%2Fldapi</string> <!-- ldaps://を追加している--> </array>
SIPをオフにする
リカバリモードで再起動したのち、再度オンにします。
# csrutil enable
ここまででOK、のはずが…
ここまででOKのはずが、なぜかldapsで繋げません。 色々いじったのですが解決せず。
結局、証明書を再度インストールすることでできました。 これだけで3時間くらいハマりました。
最後にルータのIPアドレス制限設定を忘れずに!!
これももちろん必要です。セキュリティのために取れる手段はどれも利用しましょう。