PAM APIを決めたのでLDAP用PAM実装のテストをするためLDAPサーバを
立ち上げようとしたがすっかり忘れてる。
毎回、調べ直していてさすがにばかばかしいので少し真面目に整理しておく。

#FreeBSDベースなのでこのブログを参考にする人は要注意。

* インストール。
- ports からインストール
-- /usr/ports/net/openldap24-server をインストール
-- 先に openldap24-client を deinstall しとく必要がある。

* 設定

- 管理者パスワードの準備
> slappasswd -s passwd
{SSHA}BS6Y3u5OxjwYNpqC0P/gK1tbT5Zt6KiC



- サーバのの設定ファイル変更(変更部分のみ)
> vi /usr/local/etc/openldap/slapd.conf
include         /usr/local/etc/openldap/schema/core.schema

include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema

suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
rootpw {SSHA}BS6Y3u5OxjwYNpqC0P/gK1tbT5Zt6KiC


- クライアントの設定ファイル変更(変更部分のみ)
> vi /usr/local/etc/openldap/ldap.conf
BASE    dc=example,dc=com



- OSの設定。
> vi /etc/rc.conf # FreeBSD only
slapd_enable="YES"



- LDAPサーバの起動
> /usr/local/etc/rc.d/slapd start



* 自動設定スクリプト

- convert.sh : ユーザ、ロール自動設定スクリプト
#!/bin/sh


export DOMAIN="dc=example,dc=com"
export MANAGER="cn=Manager,$DOMAIN"
export PASSWD="passwd"

ldapdelete -x -w "$PASSWD" -D "$MANAGER" -r "ou=People,$DOMAIN"
ldapdelete -x -w "$PASSWD" -D "$MANAGER" -r "ou=Group,$DOMAIN"

ldapadd -x -w "$PASSWD" -D "$MANAGER" -f domain.ldif
awk -f convert.awk users.txt | ldapadd -x -w "$PASSWD" -D "$MANAGER"

ldapsearch -x -w "$PASSWD" -D $MANAGER


- convert.awk : ユーザ定義->LDIF 変換スクリプト
BEGIN {

FS=":";
}

!/^#/{
user = $1;
pass = $2;
print "dn: cn=" user ",ou=People,dc=example,dc=com";
print "cn:",user;
print "sn:",user;
print "objectClass: person";
("slappasswd -s '"pass"'") | getline encPass;
print "userPassword:",encPass;
print "";

len = split($3,roles,",");
for (i=1; i<=len; i++) {
role = roles[i];
allRoles[role] = sprintf("%s:%s",allRoles[role],user);
}
}

END {
gid = 0;
for (role in allRoles) {
print "dn: cn=" role ",ou=Group,dc=example,dc=com";
print "cn:",role;
print "objectClass: posixGroup";
print "gidNumber:",gid++;

len = split(allRoles[role],users,":");
for (i=2; i<=len; i++) {
print "memberUid:",users[i];
}
print "";
}
}


- domain.ldif : 初期化ファイル

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: example ldap
dc: example

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group


- users.text : ユーザ、ロール定義の元ファイルサンプル
#user:pass:roles,...

admin:admin:admin,manager
tomcat:tomcat:manager
guest:guest:guest