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 さんを登録していきます。
dn: dc=virtual,dc=localdomain
objectClass: dcObject
objectClass: organization
dc: virtual
o: virtual
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
This entry was posted on 水曜日, 3月 29th, 2023 at 17:14 and is filed under 未分類. You can follow any responses to this entry through the RSS 2.0 feed.
You can skip to the end and leave a response. Pinging is currently not allowed.