2012/12/09

RacktablesでLDAP認証をかける時の注意点

Racktablesは簡単に導入ができて、ビジュアル的にもそこそこ見栄えが良く、ネットワーク屋さんがexcelやvisioを使って書くであろう絵の基本的な部分はカバーできるツールではないでしょうか。

PHPベースなので、あいかわらず拡張性が良いとは思えませんが、とりあえず動いているので使ってみる事にしました。

今回は不特定多数で使用する前提で、Ubuntu上で稼働するopenldapを使ったLDAP認証と連携させる事にしました。

racktablesのadminユーザーで、承認するユーザー名を個別に設定する場合には難しい点はないのですが、グループで認証しようとする場合には、Active Directory(AD)が想定されているので、Openldap用に少しだけ変更してあげる必要があります。

基本的なopenldapの設定

今回は手間をかけないために、ldap-account-manager (LAM)を併用しています。

LAMをUbuntuで使う場合は、openldapがデフォルトでドメイン名をみて基本的なディレクトリを作成しています。 sudo slapcatなどで確認して、変更したい場合には、$ sudo dpkg-reconfigure slapdなどで自分の管理するドメイン(dc=example,dc=com)を設定します。

racktablesの導入

ポイントはだいたい次のようなところでしょうか。

  • mysqlをあらかじめ導入しておく
  • wwwrootディレクトリをScriptAliasに設定するなどし、Webサーバーの実行ユーザーには読取権限だけを与えておく
  • inc/secret.phpファイルをWebサーバーの実行ユーザーに書き換えられるよう権限を変更する ($ sudo chown www-data:www-data wwwroot)
  • http://localhost/racktables/など配置した場所に応じたパスの/install.phpにアクセスし、インストール作業を終える

PHPが参照するファイルはWebサーバーのアクセス制限には縛られないので、secert.phpはシンボリックリンクなどにして、Webサーバーの設定としてはシンボリックリンク参照を無効にしておくのがお勧めです。

racktablesにLDAP認証を設定する

inc/secret.phpファイルに既に入っている雛型だけで、LDAP認証は十分です。 domain行は使わないのでコメントのまま無効にしておきます。

だいたい次のようなコードになっています。

secret.phpファイルの内容抜粋


$user_auth_src = 'ldap';
$require_local_account = FALSE;
$LDAP_options = array
(
        'server' => 'localhost',
#       'domain' => 'example.com',
        'search_attr' => 'uid',
        'search_dn' => 'ou=People,dc=x200,dc=example,dc=com',
# // The following credentials will be used when searching for the user's DN:
#       'search_bind_rdn' => NULL,
#       'search_bind_password' => NULL,
        'displayname_attrs' => 'sn',
        'group_attr' => 'gidnumber',
        'group_filter' => '/^([0-9]+)$/',
        'options' => array (LDAP_OPT_PROTOCOL_VERSION => 3),
#       'use_tls' => 2,         // 0 == don't attempt, 1 == attempt, 2 == require
);

group_attrは基本がAD認証なので、posixAccountで定義されているgidNumberをキーにすると、group_attrに対応するgroup_filterも書き直す必要があります。

PHPのldapsearchのマニュアルをみると、ldapsearchは大文字、小文字を意識しないけれど、戻り値として返される配列のキーは小文字になる記述があります。

そのためgroup_attrに指定する文字列は小文字でなければいけません。

また、group_filterの設定は数字が期待されているので、ここでは全ての数字を許可していますが、ドメインのポリシーに従って、10000番台だけを許可するような設定がここで可能です。

racktablesでのauthorization設定

認証されたユーザーがracktablesにアクセスできるかどうかは、Configurationのpermissions設定で行ないます。

Configuration -> Permissions設定


allow {$userid_1}
allow {lgcn_10000}

デバッグの方法について

secret.phpを編集してもうまく動かない場合、内部動作を確認する方法がないので、printfデバッグの手法を使います。 auth.phpファイルを編集する場合には、認証失敗画面に出力されるよう、$ret['memberof'][]に代入するのがお勧めです。

さいごに

ネットワーク管理用のアプリはいろんな形態が考えられますが、物理的なラックに着目した点で、ユニークなアプリなのかなと思っています。

認証済みユーザーに閲覧権限だけ付与するのに、default tabだけへのアクセスを許可するようなアプローチもできそうですが、それでは閲覧できない情報がいろいろあるので良い方法がないか探しています。

この手のアプリケーションをいろいろみていて、拡張性なんかが気になってしまいます。 mediawikiのWeb API的なアプローチが内部構造として採れないか、ちょっといろいろ考えています。