user icon

メールサーバのためにLDAPを触る

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=localdomain

DN(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 slapd

1. 管理パスワード

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.ldif

3. 自身のドメインを登録

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 * read
ldapmodifyでデータを更新します。
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.csr
CSRの入力例(パスワードは空で登録)
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.key
ldapmodifyでロード。
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
Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)