LDAPにユーザ情報を追加し、apacheへのアクセス時に参照させる

前回までの話

ou=People,dc=shonbori,dc=net
ou=Group,dc=shonbori,dc=net

というディレクトリを作った。

これはdc=netをルートとし、その下位にdc=shonboriディレクトリがあり、
さらにその配下にou=Peopleとou=Groupディレクトリが並列して存在するデータ構造であった。

LDAPに追加登録するデータ

このシリーズの目的は、LDAPのデータツリーに、認証対象となるユーザとパスワードを格納し、
apacheと連携させることである。

これを実現する上でさらに必要なデータは、ユーザとパスワードの対である。

これまでの設定でちょうどPeopleというディレクトリを作ったので、
この配下にユーザIDやパスワードのエントリ(LDAP的にはattribute(属性)らしい)を追加していこう。

具体的には、次のようなldifファイルを新たに用意し、
ldapaddでdn(distinguished name)を追加してやる。

# cat user.hoge.ldif

dn: uid=hoge,ou=People,dc=shonbori,dc=net    # hogeというユーザIDに相当するdnを定義
uid: hoge                                    # 相対dn的な表記
objectclass: account                         # *よくわからないが
objectclass: posixAccount                    # *POSIXに準拠した
#objectclass: shadowAccount                  # *データをここに書くことで
cn: hoge                                     # *既存のschemaを利用できるらしい
uidNumber: 1001                              # *
gidNumber: 1001                              # *
userPassword: {SSHA}smFKBYZoO403X9ay+3wpcg5oLQ8uXPSb # *
#             hogehoge
homeDirectory: /home/hoge                    # *
loginShell: /bin/bash                        # *

POSIXにおけるAccountとは、最低限
cn,uid,uidNumber,gidNumber,homeDirectory
の属性を持っているものらしい。
userPassword属性は、先のエントリで述べた、

# slappasswd -h {SSHA}

このコマンドで暗号化したパスワードである。
ここまでやった後、以下を実行する。

# ldapadd -x -W -D "cn=Manager,dc=shonbori,dc=net" -f user.hoge.ldif

adding new entry "uid=hoge,ou=People,dc=shonbori,dc=net"

これで、uid=hoge,ou=People,dc=shonbori,dc=netというdnについての情報が追加されたはず。
ためしにldapsearchで見てみると・・・

# ldapsearch -x -W -D "cn=Manager,dc=shonbori,dc=net" '(uid=hoge)'

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (uid=hoge)
# requesting: ALL
#

# hoge, People, shonbori.net
dn: uid=hoge,ou=People,dc=shonbori,dc=net
uid: hoge
objectClass: account
objectClass: posixAccount
cn: hoge
uidNumber: 1001
gidNumber: 1001
userPassword:: e1NTSEF9c21GS0JZWm9PNDAzWDlheSszd3BjZzVvTFE4dVhQU2I=
homeDirectory: /home/hoge
loginShell: /bin/bash

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

このように無事参照できるはずである。

ちなみに余談だが、FreeBSD/Linux等の/etc/passwdもPOSIX準拠のposixAccountのリストであり、
これをそのままLDAPに乗せ換えて、サーバへのログインをLDAP認証に切り替えてしまうこともできるようだ。

apache側の設定

条件

/home/*/public_html配下に.htaccessを置いて、そのディレクトリへのアクセスを、LDAPを使ってBasic認証する。

apacheモジュール
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so

以上の2つがおそらく必要になるだろう。

.htaccessの記述
        AuthType               Basic
        AuthName               "LDAP Auth"
        AuthBasicProvider      ldap
        AuthzLDAPAuthoritative off    # よくわからなかった
        AuthLDAPURL            ldap://localhost/ou=People,dc=shonbori,dc=net?uid
        Require                 valid-user

.htpasswdファイルを使う場合はAuthBasicProvider,AuthzLDAPAuthoritative,AuthLDAPURLの代わりにAuthFileディレクティブを使っていた。
AuthLDAPURLの書式はapache.orgのマニュアルに詳しく記述されているのでぜひ参照されたい。
ともかくこれで、この.htaccessを設置したディレクトリにhttpでアクセスした場合は、
ldapaddで追加したユーザ(valid-user)のIDとパスワードを入力して認証されなければコンテンツを参照できなくなった。

あとは、LDAPの初期化やユーザの追加を自動化するスクリプトを書いたりすれば、
LDAPサーバのアドミニストレータを名乗れるのではなかろうか。
・・・・だめ?