単一のホスト上でしか試していないが,tlsを用いてのldapの認証がgentooでできたのでメモしておく.
1) slapdの基本設定
まず,ldapのサーバーはopenldapをインストールし,その設定はslapd.confで記述し,テストし,問題なければslapd.dに書き込む.slapdが起動できることを確認する./etc/conf.d/slapdを編集し,slapd.confからslapd.dに設定情報の場所を移行させる.
slapdが起動しない場合,slapd.dとデータベースディレクトリが整合していないことが考えられる.また,slapd.dのパーミッションも重要(owner, groupともにldapにしておく).
・slapd.confの例
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
pidfile /run/openldap/slapd.pid
argsfile /run/openldap/slapd.args
modulepath /usr/lib64/openldap/openldap
database hdb
suffix "dc=dummy,dc=org"
checkpoint 32 30
rootdn "cn=root,dc=dummy,dc=org"
rootpw {SSHA}xxenter your encrypted passwordxxxx
directory /var/lib/openldap-data
index objectClass eq
index uid pres,eq
index mail pres,sub,eq
index cn pres,sub,eq
index sn pres,sub,eq
index dc eq
access to attrs=userPassword,givenName,sn,photo
by self write
by anonymous auth
by dn.base="cn=root,dc=dummy,dc=org" write
by * none
access to *
by self read
by dn.base="cn=root,dc=dummy,dc=org" write
by * read
・slapd.confをテストし,slapd.dに流し込む
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
-F以下がなければ,単なるテスト.
・slapd.confではなくslapd.dでの設定で動作させる(/etc/conf.d/slapd).
#OPTS_CONF="-f /etc/${INSTANCE}/slapd.conf"
OPTS_CONF="-F /etc/${INSTANCE}/slapd.d"
ここまでできても,slapcatで何も表示されないはず.すなわち,データベースは空.
ここからは,ldifファイルを作成し,食わせていき,データベースを構築する.
・ldifファイルの例
# dummy.org
dn: dc=dummy,dc=org
dc: dummy
o: Dummy Family
objectClass: dcObject
objectClass: organization
description: Dummy family
# root, dummy.org
dn: cn=root,dc=dummy,dc=org
cn: root
description: LDAP administrator
objectClass: organizationalRole
objectClass: top
roleOccupant: dc=dummy,dc=org
# People, dummy.org
dn: ou=People,dc=dummy,dc=org
ou: People
objectClass: top
objectClass: organizationalUnit
# Groups, dummy.org
dn: ou=Group,dc=dummy,dc=org
ou: Group
objectClass: top
objectClass: organizationalUnit
・ldifを食わせる.
ldapadd -D "cn=root,dc=dummy,dc=org" -W -f base.ldif
よくわからんが,""のなかの記述は先にslapd.confで設定したrootdnのものと一致していなくてはならない.
・間違って食わせたデータを削る例
ldapdel -D "cn=root,dc=dummy,dc=org" -W ou=Group,dc=dummy,dc=org
・アカウントのldifの例
dn: uid=bionic,ou=People,dc=tatsumi,dc=org
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: bionic
cn: Bionic Ubuntu
sn: Ubuntu
givenName: Bionic
title: Linux OS
userPassword: {SSHA}xxenter your encrypted passwordxxxx
loginShell: /bin/bash
uidNumber: 9999
gidNumber: 9999
homeDirectory: /home/bionic/
description: This is an example user
dn: cn=bionic,ou=Group,dc=tatsumi,dc=org
objectClass: posixGroup
cn: bionic
gidNumber: 9999
memberUid: bionic
注) slapd.confをいじった後は常にテストし,slapd.dに反映させる.うまく行かない場合は,slapd.dを削除してやり直す.データベースディレクトリを削除してやり直す.
注) ldapadd, ldapdelを用いてldifファイルを食わせていく.dcの記載等が間違っていると,食ってくれないし,エラーメッセージは不親切.
2)slapdのデータベース情報をキャッチする
ldapsearch -xでデータベース情報がキャッチできるか,確認.ここまでできていれば,slapdは動くはず.
・ldap.confの例
BASE dc=dummy,dc=org
URI ldap://111.111.113.133
3)データベース情報を受け取る方の設定
sssdをインストール./etc/sssd/sssd.confを設定する./etc/nsswitch.confを設定し直す./etc/pam.d/配下のファイルを設定し直す.
sssd起動確認.sssd.confのパーミッション(chmod 600 /etc/sssd/sssd.conf)も重要.
情報が取れているか,getent passwd [ldapアカウント名]で確認.
su やssh, loginでldapアカウントがログインできるか確認.
・sssd.confの例.
[sssd]
config_file_version = 2
services = nss, pam
domains = genfic
debug_level = 5
[nss]
filter_users = root,ldap,named,avahi,haldaemon,dbus,radiusd,news,nscd
[domain/genfic]
id_provider = ldap
auth_provider = ldap
ldap_search_base = dc=dummy,dc=org
ldap_uri = ldap://111.111.113.133,ldap://127.0.0.1
・/etc/nsswitch.conf (sss追加箇所抜粋)
group: sss files
passwd: sss files
shadow: sss files
sudoers: sss files
・/etc/pam.d/system-auth
#%PAM-1.0
auth sufficient pam_sss.so forward_pass
auth required pam_unix.so try_first_pass nullok
auth optional pam_permit.so
auth required pam_env.so
#account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so
account required pam_unix.so
account optional pam_permit.so
account required pam_time.so
password sufficient pam_sss.so
password required pam_unix.so try_first_pass nullok sha512 shadow
password optional pam_permit.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0077
session required pam_limits.so
session required pam_unix.so
session optional pam_sss.so
session optional pam_permit.so
・/etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_sss.so forward_pass retry=2
auth required pam_unix.so
account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so
account required pam_unix.so
session required pam_unix.so
session optional pam_sss.so
・/etc/pam.d/passwd
#%PAM-1.0
password sufficient pam_sss.so
password required pam_unix.so sha512 shadow nullok
4)tlsによる暗号化
自己証明書を作成し,slapd.confをtls動作するように修正,slapd.dに流し込む.slapd再起動.sssd.confもtls動作するように修正.sssd再起動.3)の方法で問題なく情報がキャッチでき,ログインできるか確認.認証局の証明書とその設定は今の所不要.
・自己証明書作成
openssl req -new -x509 -nodes -out slapdcert.pem -keyout slapdkey.pem -days 365
注) tls動作するのは url ldaps://.....である. .....は自己証明書作成時に記入した Common nameと一字一句異なってはならない.出来たslapdcert.pemとslapdkey.pemは例えば/etc/openldap/ssl/にコピーし,パーミッションを変更.
# chmod -R 755 /etc/openldap/ssl/
# chmod 400 /etc/openldap/ssl/slapdkey.pem
# chmod 444 /etc/openldap/ssl/slapdcert.pem
# chown ldap /etc/openldap/ssl/slapdkey.pem
・slapd.confのtls設定(末尾に追加し,slaptestでslap.dに流し込む)
TLSCipherSuite DEFAULT
TLSCertificateFile /etc/openldap/ssl/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/ssl/slapdkey.pem
TLSCipherSuite HIGH:MEDIUM:-SSLv2:-SSLv3
・/etc/openldap/ldap.confのtls設定(ldap://ではなくldaps://)
URI ldaps://111.111.113.133
TLS_REQCERT hard
TLS_CACERT /etc/openldap/ssl/slapdcert.pem
・/etc/conf.d/slapdのtls設定(ldaps://が入っていること)
OPTS="${OPTS_CONF} -h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
・sssd.confのtls設定(ldap://ではなくldaps://)
ldap_tls_reqcert = hard
ldap_uri = ldaps://111.111.113.133,ldaps://127.0.0.1
3)4)はsssdではなく,nslcdでも可能であることを確認した.boot時は多くても片方しか自動起動させないほうが無難.