メールサーバのためにLDAPを触る
- 2023/03/29
- aikawa
LDAPは使う機会が無かった事と、ちょっと面倒な感じが有り触って来なかったのですが、メールサーバの試験環境で利用するためにちょっと学習しました。OSはCentOS Stream 9。
長くなるので、今回はLDAPのみです。メール環境は次回に。
LDAPの大まかな概要
色々と調べる中で、取り合えずDITとDNを大まかに理解しておけば、LDAPをメールサーバで使う分には大丈夫だろうと、それに絞って後は流す事にしました。
なので、schemaやldifについては触り程度に。
DIT(Directory Information Tree)
LDAPの基本的な構成として、DIT(Directory Information Tree)が有り、URLで言えばドメイン名、フォルダ名、ファイル名(データ実体)、みたいなものの様です。
ドメイン・組織・一般名(ユーザ等のデータ)を連鎖で登録しますが、以下のような属性名が一般的に利用されるようです。
dc(Domain Component) ドメイン
ou (Organization Unit) 組織
cn (Common Name) 一般名
例えば、ドメインvirtual.localdomainの管理者ManagerをDITで表すには、以下のように繋げて記載します。cn=Manager,dc=virtual,dc=localdomainDN(Distinguished Name)
上記のように組み合わせたユニークな識別表示がDN(Distinguished Name)となるようです。
以下でよく使われます。
バインドDN
ログインする際に使用するユーザ名です。さっきのManagerのような表記になります。cn=Manager,dc=virtual,dc=localdomainベースDN
ログイン後にどのDIT下の情報を扱うかを指定します。ドメイン下であれば以下のように指定します。dc=virtual,dc=localdomain大体こんな理解で行けるかと思います。
LDAPインストール
まずはインストールと起動設定。EPELリポジトリを設定した環境で実行します。
dnf --enablerepo=epel -y install openldap-servers openldap-clients
systemctl enable --now slapd1. 管理パスワード
slappasswdを使ってパスワードを生成します。
slappasswdコマンド入力後、パスワードを確認用に二回入力すると、ハッシュ化したパスワードが生成されますのでメモしておきます(今回はtestpassと入力してみます)。
設定ファイルchrootpw.ldifファイルを作成します。olcRootPWにはメモしておいたパスワードを入力。
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}JhARbyKXlHNbP8bMNYJsvKrMAbJu3IgM作成したファイルをロード。
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif 2. 基本的なスキーマを登録
デフォルトでcoreスキーマは登録されていますが、それだけでは不足なので他の基本的なスキーマを登録します。
例えば、inetorgperson.ldif内のolcObjectClasss: inetOrgPerson等を指定しないと、mail属性が使えず登録出来ません。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif3. 自身のドメインを登録
chdomain.ldifファイルを作成します。大まかにはolcDatabase{2}のドメイン名、管理者パスワード、ACLの設定になります。
※olcRootPW: {SSHA}x…にはslappasswdで別途生成した値を入れます。
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=virtual,dc=localdomain" read by * none
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=virtual,dc=localdomain
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=virtual,dc=localdomain
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=virtual,dc=localdomain" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=virtual,dc=localdomain" write by * readldapmodifyでデータを更新します。
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif 4. LDAPにSSLを設定
自己証明書の秘密鍵とCSRを作成します。
cd /etc/pki/tls/certs/
openssl genrsa 2048 > server.key
openssl req -new -key server.key -out server.csrCSRの入力例(パスワードは空で登録)
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) [Default City]:Yokohama
Organization Name (eg, company) [Default Company Ltd]:Localhost
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:virtual.localdomain
Email Address []:admin@virtual.localdomain証明書CRTファイルを作成します。
cat server.csr | openssl x509 -req -days 3650 -signkey server.key > server.crt/etc/openldap/certs/にkey,crtをコピーしてldapユーザにします。
cp /etc/pki/tls/certs/{server.key,server.crt} /etc/openldap/certs/
chown ldap:ldap /etc/openldap/certs/{server.key,server.crt}SSL設定用の mod_ssl.ldif ファイルを作成。ハイフンは複数属性の区切りに入れる用です。
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.keyldapmodifyでロード。
ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif slapdをリロードします。localhostでなく外部からの接続をする場合はfirewallを開けて下さい。
systemctl restart slapd 5. 組織及びユーザを登録
ドメインvirtual.localdomain、組織 people、uid=10000のユーザ yamada さんを登録していきます。
まずドメインのdc.ldifファイル。
dn: dc=virtual,dc=localdomain
objectClass: dcObject
objectClass: organization
dc: virtual
o: virtual次に組織のou.ldifファイル。
dn: ou=people,dc=virtual,dc=localdomain
objectclass: organizationalUnit
ou: people最後にユーザのperson.yamada.ldifファイル。
userPasswordには、yamadaさん用にslappasswdでパスワード生成します。
dn: uid=10000, ou=people, dc=virtual, dc=localdomain
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: 10000
cn: Taro Yamada
sn: yamada
o: people
mail: yamada@virtual.localdomain
description: virtual.localdomain/yamada
userPassword: {SSHA}7MgE8A3LkY5o24iZFCTJekNlcHlK2h/b上から順に登録していきますが、virtual.localdomainはchdomain.ldifでACLをManagerに融通しているので、Managerでパスワードを入れて登録する必要が有ります。
一行ごとに「3.自身のドメインを登録」で登録したパスワードを入力する必要があります。
ldapadd -D "cn=Manager,dc=virtual,dc=localdomain" -xW -f dc.ldif
ldapadd -D "cn=Manager,dc=virtual,dc=localdomain" -xW -f ou.ldif
ldapadd -D "cn=Manager,dc=virtual,dc=localdomain" -xW -f delete.yamada.ldif データが登録されたかの確認は、EXTERNAL認証か、bind dnでManagerを指定しても行けるようです。Managerを指定する場合はパスワード入力が必要になります。
# EXTERNALで
ldapsearch -Y EXTERNAL -H ldapi:/// -b "dc=virtual,dc=localdomain" dn -LLL
# Managerで
ldapsearch -LLL -xW -D "cn=Manager,dc=virtual,dc=localdomain" -b "dc=virtual,dc=localdomain" dn最後に、yamadaさんが認証出来るか、確認を取ってみます。
ldapwhoami -x -D "uid=10000,ou=people,dc=virtual,dc=localdomain" -Wここにはperson.yamada.ldifで設定したパスワードを入力し、成功するとdnが表示されます。
dn:uid=10000,ou=people,dc=virtual,dc=localdomain