AWSでOpenLDAP OLC(cn=config)導入してみた

OpenLDAPでOLC(cn=config)でこれだ!って記事がなかったので書いてみました。いちお、今はなきLPIC3 Coreもってるし。ちなみに、証明書ログインではなくアイパスログインに変更の話なので、お目当ての記事でなかった方には申し訳ありません。
AMIはとりあえずAmazon Linux(たぶん3.14.23-22.44.amzn1.x86_64)で。
おもむろにインストール

# yum install openldap-servers.x86_64 openldap-clients.x86_64
# cp -av /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG
# cp -av /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf.import
# slappasswd -s [password string]
[slappasswd output]
# vi /etc/openldap/slapd.conf.import
...
include         /etc/openldap/schema/ppolicy.schema
include         /etc/openldap/schema/sudo.schema
...
modulepath /usr/lib64/openldap
...
moduleload ppolicy.la
...
access to attrs=userPassword,shadowLastChange,shadowMax
        by self write
        by dn="cn=Manager,dc=example,dc=com" write
        by anonymous auth
        by * none
access to *
        by self write
        by dn="cn=Manager,dc=example,dc=com" write
        by * read
...
database config
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
        by dn.exact="cn=Manager,dc=example,dc=com" manage
        by * none
...
database monitor
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=Manager,dc=exapmle,dc=com" read
        by * none
...
suffix          "dc=example,dc=com" 
...
rootdn          "cn=Manager,dc=example,dc=com" 
...
rootpw [slappasswd output]
overlay ppolicy
ppolicy_default "cn=ppolicy,ou=policies,dc=example,dc=com" 
ppolicy_use_lockout

shadowLastChangeのアクセス権はppolicy使用時に必要だと信じてやみません。
よく都市伝説的にOLCはパスワード設定されてないからアクセスできんがないわれますが、rootpwを指定しておけば大丈夫です。
今回sudo連携もしたいのでsudo schemaいれます。(上のincludeで既に指定してるけど)

# cp -a /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema

私も昔はOLCなのになんでslapd.confいじってんだよ思ってましたけど、こっからslaptestでインポートします。

# mkdir /etc/openldap/slapd.d
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf.import -F /etc/openldap/slapd.d

syslogの設定とかは省略。
ここまでできれば

# ldapsearch -x -D "cn=Manager,dc=example,dc=com" -b "cn=config" -W

とかでさっきのslappasswdで作成したパスワードでアクセスできるはずです(いまそらで書いたのでコマンドシンタックス間違ってたらごめんなさい。)
こっからはldifでもりもり初期データを突っ込むと思いますが、ここでは関係あるppolicyデフォルトのldifだけ。

# vi ./addPpolicy.ldif
dn: cn=ppolicy,ou=policies,dc=example,dc=com
cn: ppolicy
objectClass: top
objectClass: device
objectClass: pwdPolicy
pwdAttribute: userPassword
pwdInHistory: 3
pwdMinLength: 10
pwdMaxFailure: 4
pwdFailureCountInterval: 1800
pwdCheckQuality: 1
pwdMustChange: TRUE
pwdGraceAuthNLimit: 0
pwdMaxAge: 7776000
pwdExpireWarning: 1209600
pwdLockoutDuration: 900
pwdLockout: TRUE
# ldapadd -x -D "cn=Manager,dc=example,dc=com" -f ./addPpolicy.ldif -W

設定値は適当です。
で、こっからはクライアント側設定になりますが、pam_ldapのインストール。

# yum install pam_ldap
# yum install nscd nss-pam-ldapd

pamの設定。authconfig-tuiが吐きそうになるくらい便利。

# authconfig-tui
【認証の設定】
・[Use LDAP] にチェックを入れる。
・[Use LDAP Authentication] にチェックを入れる。
・[Next] を選択する。

【LDAP 設定】
・サーバー: ldap://[ldap server internal domain]
・ベースDN: ou=XXX,dc=example,dc=com
・[OK] を選択する。
# vi /etc/pam_ldap.conf
pam_lookup_policy yes
pam_password exop

お好みでsystem-authのaccoutn ~ pam_ldap.soにauthinfo_unavail=ignoreなどを入れてみたり、pam_mkhomedirをいれてみるなどしたりしてください。
あと、AWSではssh認証がPasswordAuthentication noなのでyesにしときます。勢いでPermitEmptyPasswordsもnoに。

あとは、sudo。

# vi addSudo.ldif
# sudo group
dn: ou=SUDOers,dc=example,dc=com
objectClass: organizationalUnit
ou: SUDOers

# sudo defaults
dn: cn=defaults,ou=SUDOers,dc=example,dc=com
objectclass: top
objectclass: sudoRole
cn: defaults
sudoOption: !root_sudo
sudoOption: !lecture
sudoOption: log_host
sudoOption: log_year
sudoOption: syslog=local3
sudoOption: logfile=/var/log/sudo.log
sudoOption: ignore_dot
sudoOption: ignore_local_sudoers
sudoOption: timestamp_timeout=0

# %wheel
dn: cn=%wheel,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoUser: %wheel
sudoHost: ALL
sudoCommand: ALL

# wheel group
dn: cn=wheel,ou=XXX,dc=example,dc=com
objectClass: posixGroup
objectClass: top
gidNumber: 1234
cn: wheel
memberUid: [uid]

sudoの設定値も適当です。
おもむろにignore_local_sudoersとかしてるんで突然のsudo不可状態!!とかに気をつけてください。
あとは

# vi /etc/pam.d/su
auth            required        pam_wheel.so group=wheel
# vi nsswitch.conf
sudoers:    ldap files

以上で完了です。
設定確認などldapsearchだけでやってたらすごいウォーリーを探せ状態になったので、私はApache directory studio使ってます。macでもおけなので。
http://directory.apache.org/studio/downloads.html