OSX Server の OpenDirectory を用いて,Linux上のApache2の mod_authnz_ldap でグループ認証.

できてしまえばあっさりなのだけれど,何故かつまずきまくった*1
いつか同じことで躓きそうなきもするので記録しておく.

下記の例の前提は下記の通り.

  • OSX Server の IPアドレスは 192.168.100.1
  • OpenDirectory の ベースDNは "dc=ldap,dc=example,dc=org"
  • 認証させたいグループ名は foobarbaz

ldapsearch でグループの DNを取得する.

ldapsearch を使う.OSX Server に到達可能なマシンならどこからでも構わないが,認証させたい Apache2サーバマシンで実行すれば認証以外のネットワークトラブルがあった場合早めに解るのでオススメ.

# ldapsearch -h 192.168.100.1 -x "cn=foobarbaz" -b "dc=ldap,dc=example,dc=org"
# extended LDIF
#
# LDAPv3
# base <cn=groups,dc=ldap,dc=example,dc=org> with scope subtree
# filter: cn=foobarbaz
# requesting: ALL
#

# foobarbaz, groups, ldap.example.org
dn: cn=foobarbaz,cn=groups,dc=ldap,dc=example,dc=org
objectClass: posixGroup
objectClass: apple-group
objectClass: extensibleObject
objectClass: top
(以下略)

ここで,

dn: cn=foobarbaz,cn=groups,dc=ldap,dc=example,dc=org

を覚えておく.

Apache2

下記の例には今回の話にとって冗長なものが沢山あるけれども,残したほうが雰囲気は掴みやすいかと思い,そのまま残してある.
他のLDAP環境ではどうなのか判らず,他の解説webサイトを見た結果混乱してしまった.結論として,下記3点に気をつければ,グループ認証はできるようになる.

  • AuthLDAPURL は base DN を書いておけば良い.
  • require ldap-group は,先に ldapsearch で得た dn をそのまま書き写す.
  • AuthLDAPGroupAttribute は省いてはいけない.
    <Location "/trac/">
        AuthName "Trac user"
        AuthType Basic
        AuthBasicProvider ldap
        require ldap-group cn=foobarbaz,cn=groups,dc=ldap,dc=example,dc=org
        AuthLDAPGroupAttribute memberUid
        AuthLDAPGroupAttributeIsDN off
        AuthLDAPURL ldap://192.168.100.1/dc=ldap,dc=example,dc=org

以上,Leopard Server で確認.

*1:なんとなくいつもよりストレス負けしているのかもしれない