LDAPサーバを作る
利用サイトもあるので一応押さえておく所の一つかな
過去記事 LDAP/サーバ構築
このサイトでは認証として ActiveDrectoryを模した samba、伝統的なNISを取り上げてる.
ここでは LDAP の openLDAP を扱う 別のLDAPエンジン FreeIPA LDAP/389DirectoryServer
RockyLinuxで作ってみた. nisもいいのだがsambaと連携するとパスワードが2系統存在する羽目になるので、それが見えにくいLDAPを作る. samba-adがパスワード系の一本化には最適と思っている
冗長構成 LDAP/failover、パスワードポリシーLDAP/ppolicy、ツールphpLDAPadmin、LDAPでautofsLDAP/autofs、LDAPでsudo利用アカウント管理LDAP/sudo
*RAID1な構成で運用すればよくね?って思うが、求めるところもあって作ってみた
[root@ldap-server ~]# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)
[root@ldap-server ~]# dnf --enablerepo=devel install openldap-servers openldap-clients
(「openldap-servers」パッケージは「devel」レポジトリに存在)
[root@ldap-server ~]# dnf info openldap-servers
Last metadata expiration check: 0:01:57 ago on Sun 28 Jan 2024 02:18:03 PM JST.
Installed Packages
Name : openldap-servers
Version : 2.6.3
Release : 1.el9
Architecture : x86_64
Size : 5.6 M
Source : openldap-2.6.3-1.el9.src.rpm
Repository : @System
From repo : devel
Summary : LDAP server
URL : http://www.openldap.org/
License : OpenLDAP
Description : OpenLDAP is an open-source suite of LDAP (Lightweight Directory Access
: Protocol) applications and development tools. LDAP is a set of
: protocols for accessing directory services (usually phone book style
: information, but other information is possible) over the Internet,
: similar to the way DNS (Domain Name System) information is propagated
: over the Internet. This package contains the slapd server and related files.
[root@ldap-server ~]#
Rocky9でインストールされるのは「OpenLDAP-2.6.3」であった.
加えてユーザ[ldap]が追加されるみたい
[root@ldap-server ~]# id ldap
uid=55(ldap) gid=55(ldap) groups=55(ldap)
[root@ldap-server ~]#
パッケージのインストールはここまで
openldap-2.4.xの時はldapのデータベースの仕様を選んだりパラメータを定義してましたが今は不要みたい
っで起動します。他に事前の準備は?とCentOS6時代ならそう思うのだが、どうやらldapを動かしたまま
初期設定を調整するみたい. 事前に/etc/openldap/slapd.d/配下を弄るのもあるのだろうけど、結構複雑.
[root@ldap-server ~]# systemctl enable slapd.service --now
[root@ldap-server ~]# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; preset: disabled)
Active: active (running) since Sun 2024-01-28 14:23:37 JST; 56s ago
Docs: man:slapd
man:slapd-config
man:slapd-mdb
file:///usr/share/doc/openldap-servers/guide.html
Process: 11549 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
Process: 11569 ExecStart=/usr/sbin/slapd -u ldap -h ldap:/// ldaps:/// ldapi:/// (code=exited, status=0/SUCCESS)
Main PID: 11570 (slapd)
Tasks: 2 (limit: 12355)
Memory: 5.3M
CPU: 35ms
CGroup: /system.slice/slapd.service
mq11570 /usr/sbin/slapd -u ldap -h "ldap:/// ldaps:/// ldapi:///"
Jan 28 14:23:37 ldap-server systemd[1]: Starting OpenLDAP Server Daemon...
Jan 28 14:23:37 ldap-server runuser[11552]: pam_unix(runuser:session): session opened for user ldap(uid=55) by (uid=0)
Jan 28 14:23:37 ldap-server runuser[11552]: pam_unix(runuser:session): session closed for user ldap
Jan 28 14:23:37 ldap-server slapd[11569]: @(#) $OpenLDAP: slapd 2.6.3 (Jun 14 2023 00:00:00) $
openldap
Jan 28 14:23:37 ldap-server slapd[11570]: slapd starting
Jan 28 14:23:37 ldap-server systemd[1]: Started OpenLDAP Server Daemon.
[root@ldap-server ~]#
そしてサービスとして提供しているのでfirewallに穴を空ける.
[root@ldap-server ~]# firewall-cmd --add-service=ldap --add-service=ldaps --zone=public --permanent
[root@ldap-server ~]# firewall-cmd --reload
[root@ldap-server ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens192
sources:
services: cockpit dhcpv6-client ldap ldaps ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ldap-server ~]#
「--add-service」で使われる「/usr/lib/firewalld/services/ldap.xml」と「/usr/lib/firewalld/services/ldaps.xml」は tcp/389、tcp/636 をそれぞれ空けている
ちなみにSELinuxは有効のままにしてます
[root@ldap-server ~]# getenforce
Enforcing
[root@ldap-server ~]#
「サーバ管理者」と「ディレクトリ管理者」の2つを用意します
「サーバ管理者」ldapにスキーマの追加をするときとかに使う
「ディレクトリ管理者」ldap内に展開したスキーマ上でエントリー(データ)の登録・更新・削除に使用する
っでまずは「サーバ管理者」のパスワードを定義します
[root@ldap-server ~]# slappasswd
New password: <-- パスワードを入力
Re-enter new password: <-- 再入力
{SSHA}abecefghijklmnopqrstu123123123123123 <--- 暗号化されたパスワード
[root@ldap-server ~]#
「暗号化されたパスワード」文字列をコピーして、管理者のパスワードを定義するファイル「rootpw.ldif」を用意します
[root@ldap-server ~]# mkdir ldap <-- ldap作業用フォルダを設けた
[root@ldap-server ~]# vi ldap/rootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}abecefghijklmnopqrstu123123123123123
[root@ldap-server ~]#
この定義ファイル「rootpw.ldif」をldapに反映させる
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -f ldap/rootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
[root@ldap-server ~]#
一応ここで確認
[root@ldap-server ~]# ldapsearch -x -LLL -W -D cn=config -b cn=config dn
Enter LDAP Password: <-- 「サーバ管理者」のパスワードを入力
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}mdb,cn=config
[root@ldap-server ~]#
っでここでこの「サーバ管理者」のパスワードを再度変更したければ、再度パスワードの「暗号化されたパスワード」を得て下記ファイルを用意します.
留意点は「add: olcRootPW」ではなく「replace: olcRootPW」になる点です.
[root@ldap-server ~]# vi ldap/rootpw-change.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}ynkCkbugval111111111111111111111111
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -f ldap/rootpw-change.ldif
「openldap-servers」パッケージに含まれている利用可能なスキーマは下記の通り
[root@ldap-server ~]# ls -CF /etc/openldap/schema/
collective.ldif cosine.ldif dyngroup.ldif misc.ldif nis.ldif
collective.schema cosine.schema dyngroup.schema misc.schema nis.schema
corba.ldif dsee.ldif inetorgperson.ldif msuser.ldif openldap.ldif
corba.schema dsee.schema inetorgperson.schema msuser.schema openldap.schema
core.ldif duaconf.ldif java.ldif namedobject.ldif pmi.ldif
core.schema duaconf.schema java.schema namedobject.schema pmi.schema
[root@ldap-server ~]#
何を入れればいいのか不明なのだが、アカウント管理ならどうも「cosine.ldif」「nis.ldif」「inetorgperson.ldif」を適用すればいいみたい
っでスキーマ登録
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
っで確認
[root@ldap-server ~]# ldapsearch -x -LLL -W -D cn=config -b cn=config dn
Enter LDAP Password:
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config <--- 増えた
dn: cn={2}nis,cn=schema,cn=config <--- 増えた
dn: cn={3}inetorgperson,cn=schema,cn=config <--- 増えた
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}mdb,cn=config
[root@ldap-server ~]#
この増えたスキーマを削除するには? LDAP/delete
ここではドメインは
dc=sybyl,dc=local
ディレクトリ管理者は
cn=manager,dc=sybyl,dc=local
とします。
そのためのドメイン設定ファイル(ldapdomain.ldif)を用意します
その前に「サーバ管理者」の暗号化パスワード文字列を算出したように再度slappasswdを使って今度は「ディレクトリ管理者」の暗号化パスワードを求めます
[root@ldap-server ~]# slappasswd
New password: <-- 「ディレクトリ管理者」向けのパスワードを入力
Re-enter new password:
{SSHA}qawsedrftgyhujikolp <--- 暗号化されたパスワード
[root@ldap-server ~]#
この「暗号化されたパスワード」をコピーしてドメイン設定ファイルを作成します
[root@ldap-server ~]# vi ldap/ldapdomain.ldif
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=sybyl,dc=local" read by * none
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=sybyl,dc=local
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=manager,dc=sybyl,dc=local
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}qawsedrftgyhujikolp <-- ここに「ディレクトリ管理者」の「暗号化されたパスワード」を入れる
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=manager,dc=sybyl,dc=local" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=manager,dc=sybyl,dc=local" write by * read
[root@ldap-server ~]#
これをLDAPに反映させます. 上記をコピペで貼り付けると失敗する可能性があります. 空行に何かあるようで、空行を削除して、再度空行を設ければ行けるかも
[root@ldap-server ~]# ldapmodify -H ldapi:/// -f ldap/ldapdomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}mdb,cn=config"
modifying entry "olcDatabase={2}mdb,cn=config"
modifying entry "olcDatabase={2}mdb,cn=config"
modifying entry "olcDatabase={2}mdb,cn=config"
[root@ldap-server ~]#
で完了
「ldapadd -Y EXTERNAL -H ldapi:/// -f ldap/ldapdomain.ldif」で行うこともできる. こちらはパスワードなしです
トップドメインを用意します。
下記ファイル(domain.ldif)には、
が含まれてます 投入時は下記の日本語部分は削除してください
[root@ldap-server ~]# vi ldap/domain.ldif
#TOPドメインの定義
dn: dc=sybyl,dc=local
objectClass: top
objectClass: dcObject
objectclass: organization
dc: sybyl
o: sybyl local
description: sybyl Ldap
#管理者の定義
dn: cn=manager,dc=sybyl,dc=local
objectClass: organizationalRole
cn: manager
description: Directory manager
#people(/etc/passwdなもの)の定義
dn: ou=People,dc=sybyl,dc=local
objectClass: organizationalUnit
ou: People
#group(/etc/groupなもの)の定義
dn: ou=Group,dc=sybyl,dc=local
objectClass: organizationalUnit
ou: Group
[root@ldap-server ~]#
これは新規追加となるので「ldapadd」を使います。こちらも上記をコピペで貼り付けると失敗する可能性があります. 同じように空行を一旦削除して、再度空行を入れてみてください
「Enter LDAP Password:」とパスワードを問われるが、これはディレクトリ管理者のパスワード.
[root@ldap-server ~]# ldapadd -x -D cn=manager,dc=sybyl,dc=local -W -f ldap/domain.ldif
Enter LDAP Password:
adding new entry "dc=sybyl,dc=local"
adding new entry "cn=manager,dc=sybyl,dc=local"
adding new entry "ou=People,dc=sybyl,dc=local"
adding new entry "ou=Group,dc=sybyl,dc=local"
[root@ldap-server ~]#
これで枠が完成した。「ldap_bind: Invalid credentials (49)」とか表示されたらそれは恐らくパスワードがあっていない.
方法としては「ldapvi」で直接パスワード文字列を更新するのがいいのかと.
[root@ldap-server ~]# yum --enablerepo=epel install ldapvi
[root@ldap-server ~]# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}mdb,cn=config
:
olcRootPW: {SSHA}qawsedrftgyhujikolp <---- ここの値を修正する
olcSuffix: dc=sybyl,dc=local
olcRootDN: cn=manager,dc=sybyl,dc=local
[root@ldap-server ~]#
あとはLdapAdminアプリで直接変更も可能.
パスワード変更の確認はldapsearchとかでしてみる
ldapsearch -x -H ldap://ldap-server -b dc=sybyl,dc=local -D cn=nanager,dc=sybyl,dc=local -W
「ldap anonymous bind」 CentOS7のOpenLDAPは「ldap anonymous bind」が既定で有効みたい
qnapとかは既定で無効化されている. この有効/無効は単に olcAccess で定義されている模様.
現状は
[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b olcDatabase={2}mdb,cn=config -o ldif-wrap=no | grep olcAccess
:
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=manager,dc=sybyl,dc=local" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=manager,dc=sybyl,dc=local" write by * read
[root@ldap-server ~]#
と「olcAccess: {2}」にて全てを「read」となっている
参照先 https://kazuhira-r.hatenablog.com/entry/2018/12/07/000729
クラスター内で認証、研究室内で認証なら通信の暗号は要らないと思っていたのだが、rsh系のオワコン扱いと同じようにLDAPもLDAPSで運用しないとSELinux君が暴れるそうな....なので施してみた.
本筋は秘密鍵でサーバ申請書「CSR(Certificate Signing Request)」を作って、
それをCA認証局に持っていってサーバ証明書「CRT(SSL Cerver Certificate)」を作ってもらうのですが、
サーバ申請書もCA認証局も同じなので、得られるのは自己署名な証明書サーバ証明書「CRT(SSL Cerver Certificate)」となります.
[root@ldap-server ~]# cd /etc/openldap/certs/
[root@ldap-server certs]# ls -l
total 0
[root@ldap-server certs]#
(ldap-serverの秘密鍵[key]を作る)
[root@ldap-server certs]# openssl genrsa 2048 > server.key
(秘密鍵を使ってサーバ申請書[CSR]を作る)
[root@ldap-server certs]# openssl req -new -key server.key -out server.csr
:
Country Name (2 letter code) [XX]:JP <-- JPのみ入力してあとはリターンキーのみで逃げる
:
[root@ldap-server certs]#
(秘密鍵とサーバ申請書[CSR]からサーバ証明書[CRT]を得る)
[root@ldap-server certs]# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
[root@ldap-server certs]# ls -l
total 12
-rw-r--r--. 1 root root 1115 Apr 23 08:37 server.crt
-rw-r--r--. 1 root root 952 Apr 23 08:37 server.csr
-rw-r--r--. 1 root root 1675 Apr 23 08:31 server.key
[root@ldap-server certs]#
これらのファイルのありかをopenldapに伝える
[root@ldap-server ~]# vi ldap/ldaps.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
[root@ldap-server ~]#
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -W -f ldap/ldaps.ldif
Enter LDAP Password:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "cn=config"
[root@ldap-server ~]#
「cn=config」部分を確認してみると
[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config cn=config -o ldif-wrap=no
:
olcTLSCertificateFile: /etc/openldap/certs/server.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
:
[root@ldap-server ~]#
っと確かに存在している. これで再起動します
[root@ldap-server ~]# systemctl restart slapd
確認のためにldaps経由でldapsearchコマンドで検索すると残念ながらエラーになります.
これは「使った」CA認証局はプライベートなためで、事前にTLS_REQCERTは無効にする必要があります. &size(10){
[root@ldap-server ~]# ldapsearch -x -H ldaps://ldap-server -b dc=sybyl,dc=local
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) <-- ldapsで繋げるとエラーになる
[root@ldap-server ~]# echo "TLS_REQCERT never" >> /etc/openldap/ldap.conf
[root@ldap-server ~]# ldapsearch -x -H ldaps://ldap-server -b dc=sybyl,dc=local
:
(データがぞろぞろ表示される)
:
[root@ldap-server ~]#
これでldapsでつながることが確認できました.
備考
slpadのデーモンは「/usr/lib/systemd/system/slapd.service」です。これを読むと初めからldap、ldaps、ldapiで通信を行うようになってます.
これで openLDAP サーバが作れました。器/枠のみです。次にこの枠にデータを流し込みます.