OpenLDAPをインストールする(トラブルシュート)

せっかくSolaris系OSを使用するわけなので、Solarisコンテナを使用したい。
コンテナついでに、PAMのLDAPモジュールを利用してユーザの一元管理をと
一意奮闘しております。

今回は、SUNWopenldapパッケージを使用したのですが、
妙なところでハマッたのでそのメモ。
※シューティングメモのため細かい内容は今回は割愛します

まずはパッケージをインストール

OpenSolarisは便利です。
pkgコマンドを利用すると、インストールされていないパッケージを
リモートのパッケージリポジトリからインストールできます。

# #パッケージを調べる。結果はSUNWopenldap
# pkg search openldap
# #SUNWopenldapの依存パッケージを調べる。
# pkg contents -m SUNWopenldap
# #依存パッケージのインストール状況を調べる
# pkg info SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldap
# #パッケージ管理されているのでとりあえず、依存パッケージ全部入れちゃえ
# pkg install -v SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldap
これで、インストール完了です。
設定ファイルが/etc/openldapに保存されますので、自己の環境にあわせ、
slapd.confを設定します。
なお、起動・停止スクリプトも一緒にインストールされるので、
以下の部分はそのままにしました。
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

いざslapdを起動する

Solaris10から、SMF(Service Management Facility)というサービス
管理機能が追加されました。OpenSolarisも例外なくSMFがあります。
※SMFについてはいつか別の機会にふれたいと思います。

今回インストールした、SUNWopenldapパッケージもSMFにより
サービスの制御が可能です。

# svcs -a | grep ldap
disabled       21:45:28 svc:/network/ldap/client:default
disabled       21:45:54 svc:/network/ldap/server:openldap_24
# svcadm enable -t svc:/network/ldap/server:openldap_24
よし!! これで起動
# ps -ef | grep slapd
と思いきや、slapdのプロセスが、、、無い。
さて、原因追求。
svcsコマンドでサービスの起動状況を確認し、maintenace状態であることがわかった。
svcs -vx でSMFのメッセージを確認する。
# svcs -a | grep openldap_24
maintenance    22:50:45 svc:/network/ldap/server:openldap_24
# svcs -vx
svc:/network/ldap/server:openldap_24 (slapd - OpenLDAP LDAP server)
 State: maintenance since 2010年04月xx日 xx時xx分xx秒
Reason: Method failed repeatedly.
   See: http://sun.com/msg/SMF-8000-8Q
   See: man -M /usr/openldap/man -s 8 slapd
   See: http://www.openldap.org
   See: /var/svc/log/network-ldap-server:openldap_24.log
Impact: This service is not running.
とりあえず、logファイルを確認すると、
[  4月 xx xx:xx:xx Method "stop" exited with status 2. ]
[  4月 xx xx:xx:xx Executing stop method ("/usr/bin/kill `cat /var/run/openldap/slapd.pid`"). ]
cat: /var/run/openldap/slapd.pid: cannot open [No such file or directory]
pidファイルが無いとおっしゃっています。
/var/runのサブディレクトopenldapということでこいつが存在しないことが
原因だとわかり、
# mkdir /var/run/openldap
# chown openldap:openldap /var/run/openldap
# svcadm enable svc:/network/ldap/server:openldap_24
# svcs -a | grep openldap_24
online         21:45:54 svc:/network/ldap/server:openldap_24
これで無事起動!!

ほんとの原因は /var/run に

さて、これで設定完了と思いつつ、OS再起動。
ところが、再起動後プロセスを確認するとslapdは起動していなかった

ログファイルを確認すると、前回と同じくpidファイルが開けないと書いてある
また、/var/runを除いてみても、先に作成した/var/run/openldapが存在しない。
感に任せて dfをたたく、、、

# df -h
Filesystem            Size  Used Avail Use% Mounted on
rpool/ROOT/opensolaris
                       19G  3.0G   16G  17% /
swap                  923M  312K  923M   1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
                       19G  3.0G   16G  17% /lib/libc.so.1
swap                  923M  4.0K  923M   1% /tmp
swap                  923M   40K  923M   1% /var/run
rpool/export           16G   21K   16G   1% /export
rpool/export/home      16G   21K   16G   1% /export/home
rpool/export/home/hoge
                       16G  8.8M   16G   1% /export/home/hoge
rpool                  16G   79K   16G   1% /rpool
いやな予感的中。
/var/runがswapデバイスにのっていた。 swapデバイスとはその名の通り、swap領域を利用しているため、
揮発性のある領域で、OSの再起動をすると消えてしまうのである。

トラブルシュート

/var/run/openldapディレクトリが、OS起動毎になくなってしまうことが
原因のため、起動スクリプトの修正を行う必要がある。

まずは、どんなスクリプトが呼び出されているか確認する必要があるため
SMFの制御ファイルであるマニフェストと呼ばれるXMLベースのファイルを確認する

# vi /var/svc/manifest/network/ldap/ldap-olslapd.xml
	:
	:
<exec_method
    type='method'
    name='start'
    exec='/usr/lib/slapd -u openldap -g openldap -f /etc/openldap/slapd.conf'
    timeout_seconds='60'>
    <method_context>
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
    </method_context>
</exec_method>

<exec_method
        type='method'
        name='stop'
        exec='/usr/bin/kill `cat /var/run/openldap/slapd.pid'
        timeout_seconds='60' />
	:
	:
	:
マニフェストの一部で、に起動・停止時の設定が書かれているのだが
上記の通り、起動・停止がハードコーディングされてる。

そこで、下記のような起動スクリプトを/etc/openldap/slapdrc.shとして作成しました
※あくまで暫定の起動スクリプトです。
#!/bin/sh
CONF_FILE='/etc/openldap/slapd.conf'
RUN_DIR='/var/run/openldap'
RUN_UID='openldap'
RUN_GID='openldap'

start() {
        if [ ! -d $RUN_DIR ]; then
                /usr/bin/mkdir -p $RUN_DIR
                /usr/bin/chown $RUN_UID:$RUN_GID $RUN_DIR
        fi

        /usr/lib/slapd -u $RUN_UID -g $RUN_GID -f $CONF_FILE
}

stop() {
        if [ -f $RUN_DIR/slapd.pid ]; then
                /usr/bin/kill `cat $RUN_DIR/slapd.pid`
        fi
}

case $1 in
start)
        start;;
stop)
        stop;;
esac

また、マニフェスト上で実行ユーザ・グループがopenldapになっているため、
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
セキュリティ上好ましくありませんが、下記のようにパーミッションを設定
# chmod +x slapdrc.sh
# chmod u+s slapdrc.sh

続いて、マニフェストを以下のように修正します。
<exec_method
    type='method'
    name='start'
    exec='/etc/openldap/slapdrc.sh start'
    timeout_seconds='60'>
    <method_context>
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
    </method_context>
</exec_method>

<exec_method
        type='method'
        name='stop'
        exec='/etc/openldap/slapdrc.sh stop'
        timeout_seconds='60' />
修正したマニフェストをsvccfgコマンドを利用して登録します
# svccfg import /var/svc/manifest/network/ldap/ldap-olslapd.xml

以上で、OS再起動後もslapdが立ち上がるようになります。
もっとも、作成したスクリプトは暫定的なものですので、
セキュリティを考慮して作り直す必要がありますが、それはまた別の機会に