2007/09/06

OpenDSをSMFで管理する方法

Solaris 10ではrcスクリプトではなくSMFでサービスを管理することができます。 そこで今回は、OpenDSをSMFで管理する方法を説明します。

  1. 前準備

    OpenDSをセットアップして、bin/start-ds、bin/stop-dsでそれぞれ起動、停止が できる状態にしてください。なお、以下の例ではインストールディレクトリを /opt/OpenDSとしています。他のディレクトリにインストールした場合は、 /opt/OpenDSをインストールディレクトリに適宜読み替えてください。

  2. OpenDS用のユーザとグループの作成

    OpenDSを起動するために使うopendsユーザとopendsグループを作成します。

    # groupadd opends
    # useradd -g opends -d / opends

  3. マニフェストファイルとメソッドスクリプトの配置

    マニフェストファイルとメソッドスクリプトを以下のリンクからダウンロードし、 適切なディレクトリに配置します。メソッドスクリプトは実行を 許可する必要があります。

    マニフェストファイル
    http://www.akaumigame.org/resource/org-opends-ds.xml
    配置ディレクトリ: /var/svc/manifest/network

    メソッドスクリプト
    http://www.akaumigame.org/resource/svc-ds
    配置ディレクトリ: /opt/OpenDS/lib/svc/method

    # cp org-opends-ds.xml /var/svc/manifest/network
    # mkdir -p /opt/OpenDS/lib/svc/method
    # cp svc-ds /opt/OpenDS/lib/svc/method
    # chmod a+x /opt/OpenDS/lib/svc/method/svc-ds

  4. マニフェストファイルのインポート

    マニフェストファイルをインポートします。

    # svccfg import /var/svc/manifest/network/org-opends-ds.xml

  5. マニフェストの編集

    OpenDSを/opt/OpenDS以外のディレクトリにインストールした場合は、 マニフェストを編集する必要があります。OpenDSを/opt/OpenDSにインストールした 場合には変更の必要はありません。

    # svccfg -s opends/ds setprop 'config/instance_home=インストールディレクトリ'

  6. インストールディレクトリの所有ユーザと所有グループの変更

    インストールディレクトリをopendsユーザとopendsグループの所有にします。

    # chown -R opends:opends /opt/OpenDS

以上で作業は完了です。

OpenDSを起動するには以下の文を入力します。

# svcadm enable opends/ds

OpenDSを停止するには以下の文を入力します。

# svcadm disable opends/ds

2007/08/22

Cyrus SASLライブラリのLDAPDBプラグインとOpenDS

UNIX-like OSでよく使われているSASLライブラリの一つにCyrus SASLライブラリが あります。Cyrus SASLライブラリにはauxpropサービスという仕組みがあって、 auxpropプラグインを使用することでSASLで利用するパスワードの取得方法を変更する ことができます。LDAPDBプラグインもauxpropプラグインの一つで、 LDAPDBプラグインを利用することで、ディレクトリサーバからパスワードを取得し、 SASLで利用することができるようになります。そこで、このLDAPDBプラグインで OpenDSからパスワードを取得しようと考えるわけですが、通常の手順で LDAPDBプラグインを設定すると、正しいパスワードを入力しても認証に失敗して しまいます。

LDAPDBプラグインは主な連携先としてOpenLDAPを想定しているように思われます。 そして、OpenDSとOpenLDAPとではクリアテキストのパスワードの表現方法に少し違いが あります。

OpenLDAP
userPassword: password

OpenDS
userPassword: {CLEAR}password

このように、OpenDSはクリアテキストのパスワードを表現するときにパスワードの 先頭に文字列{CLEAR}を付けるのですが、OpenLDAPでは何も付けません。そして、 LDAPDBプラグインはこのOpenLDAPの何も付けないという挙動を前提に処理を行うため、 OpenDSと連携するとパスワードに不要な文字列{CLEAR}が付いた文字列がパスワードと なってしまいます。そのため、正しいパスワードを入力しても認証に失敗する わけです。ちなみに、正しいパスワードの先頭に文字列{CLEAR}を付けた文字列を 入力すると認証に成功します。

この問題に対処する方法の一つとして、ディレクトリサーバから取得した パスワードの先頭から指定した文字列を取り除くCyrus SASLライブラリ用のパッチを 作りました。Cyrus SASLライブラリ2.1.21と2.1.22用です。

動作は以下のとおりです。

  1. ldapdb_password_prefixに文字列が設定されている場合
    1. ディレクトリサーバから取得したパスワードの先頭にldapdb_password_prefixと 同じ文字列があれば、それを取り除いた文字列をパスワードとして渡す
    2. ディレクトリサーバから取得したパスワードの先頭にldapdb_password_prefixと 同じ文字列がなければ、パスワードの取得に失敗する
  2. ldapdb_password_prefixが設定されていない場合
    1. パッチを当てない状態と同じ処理をする

パッチを適用して、Cyrus SASLライブラリの設定ファイルに以下の設定を 追加すると、OpenDSから正しくパスワードを取得することができます。

ldapdb_password_prefix: {CLEAR}

cyrus-sasl-ldapdb.patch
http://www.akaumigame.org/resource/cyrus-sasl-ldapdb.patch

2007/08/20

OpenDSを非ルートユーザで実行する

OpenDSはルートユーザでも非ルートユーザでもどちらでも実行することが できます。ただ、特権を持たない非ルートユーザで実行した場合には特権ポートで 待ち受けることができません。では単純にルートユーザで実行するのがいいのかと いえば、それにはある程度のセキュリティリスクが伴います。OpenDSは Pure Javaアプリケーションであるがゆえに、実行中に特権の放棄などの処理を 行うことができません。そのため、ルートユーザで実行されたOpenDSはずっと ルートユーザの権限で動作することになります。これは、OpenDSが侵入者に 乗っ取られた場合などを考えるとあまり好ましい状態ではありません。

ということで、OpenDSを非ルートユーザで実行したいけど特権ポートで 待ち受けたいと思ったときに参考になるのが以下のページです。

Running the Server As a Non-Root User
https://www.opends.org/wiki/page/RunningTheServerAsANonRootUser

簡単にまとめると以下のようになります。

  1. そもそも本当に特権ポートで待ち受けないといけないのかを考える
  2. それでも特権ポートで待ち受けたい場合
    1. Solaris 10の場合は特権を細かく制御できるので、net_privaddr特権を与えた 非ルートユーザを作って、その非ルートユーザで実行する
    2. そういった仕組みがないOSの場合は非特権ポートで待ち受けて、 ディレクトリプロキシで中継するかパケットフィルタでリダイレクトする

上のページを見て思ったのですが、ディレクトリサーバを特権ポートで 待ち受けさせる必要がある状況というのは意外と少ないのかも知れません。