LDAPサーバ(Debian11.0.0)

2021/8/21,2022/5/2


インストール

Buster(Debian10)と同じ手順でインストールする。
apt -y install slapd ldap-utils

インストール中にLDAP管理者のパスワードを入力する。
ldap01.png
パスワードは2回入力
ldap02.png

動作確認

systemctlで動作確認
systemctl status slapd

ポリシー

実験室内での使用を前提にする。
  1. LDAPサーバドメインはdc=takahashi,dc=labとする。
  2. 在籍中のユーザだけを登録する。
  3. ユーザ名、uidは学籍番号とする。
  4. ユーザの登録、削除はバッチファイルを使う。
  5. ユーザアカウント生成時にホームディレクトリも生成する。
  6. 初期パスワードを用意する。ログイン後、各ユーザが変更する。

設定

LDAPドメイン他は現在のドメイン名(FQDN等)から適当に生成される。
現在のドメイン名と異なるLDAPドメインを使うときは注意する。
LDAPドメインやLDAP管理者に関する設定を確認する。
# slapcat 
dn: dc=...., creatorsName: cn=...., modifiersName: cn=....を確認する。
dn: dc=....が違うときは、dpkg-reconfigure slapdで再設定の後、 /etc/ldap/slapd.d/cn=config.ldif他を作り直したのちslapcatで再度確認する。
dn: dc=takahashi,dc=lab  LDAPドメインを確認
objectClass: top
objectClass: dcObject
objectClass: organization
o: takahashi.lab
dc: takahashi
structuralObjectClass: organization
entryUUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
creatorsName: cn=admin,dc=takahashi,dc=lab		管理者を確認
createTimestamp: 20210821072808Z
entryCSN: 20210821072808.785098Z#000000#000#000000
modifiersName: cn=admin,dc=takahashi,dc=lab	管理者を確認
modifyTimestamp: 20210821072808Z

base.ldapを作る。
# base.ldif (2021/08/21)
cat << 'EOL' > base.ldif
dn: ou=people,dc=takahashi,dc=lab
objectClass: organizationalUnit
ou: people

dn: ou=group,dc=takahashi,dc=lab
objectClass: organizationalUnit
ou: group
EOL

LDAPサーバにbase.ldifを登録する。(管理者がわからないときはslapcatで確認する。)
-Wは実行時にパスワード入力プロンプトが出る。 -w xxxxxxにLDAP管理者のパスワードを記述するとパスワード入力プロンプトは省略できる。
ldapadd -x -D cn=admin,dc=takahashi,dc=lab -W -f base.ldif
#または
#ldapadd -x -D cn=admin,dc=takahashi,dc=lab -w xxxxxx -f base.ldif
base.ldifの登録に成功すると adding new entry と表示する。
adding new entry "ou=people,dc=takahashi,dc=lab"

adding new entry "ou=group,dc=takahashi,dc=lab"
登録内容を確認する。
slapcat 
dn: ou=people,dc=takahashi,dc=labとdn: ou=group,dc=takahashi,dc=labを確認する。
root@He:~/LDAP# slapcat 
dn: dc=takahashi,dc=lab
objectClass: top
objectClass: dcObject
objectClass: organization
o: takahashi.lab
dc: takahashi
structuralObjectClass: organization
entryUUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
creatorsName: cn=admin,dc=takahashi,dc=lab
createTimestamp: 20210821072808Z
entryCSN: 20210821072808.785098Z#000000#000#000000
modifiersName: cn=admin,dc=takahashi,dc=lab
modifyTimestamp: 20210821072808Z

dn: ou=people,dc=takahashi,dc=lab
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
entryUUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
creatorsName: cn=admin,dc=takahashi,dc=lab
createTimestamp: 20210821073112Z
entryCSN: 20210821073112.631738Z#000000#000#000000
modifiersName: cn=admin,dc=takahashi,dc=lab
modifyTimestamp: 20210821073112Z

dn: ou=group,dc=takahashi,dc=lab
objectClass: organizationalUnit
ou: group
structuralObjectClass: organizationalUnit
entryUUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
creatorsName: cn=admin,dc=takahashi,dc=lab
createTimestamp: 20210821073112Z
entryCSN: 20210821073112.643006Z#000000#000#000000
modifiersName: cn=admin,dc=takahashi,dc=lab
modifyTimestamp: 20210821073112Z
間違えた時は"ou=people"と"ou=group"を削除する。base.ldifを修正した後、再登録する。
ldapdelete -x -D cn=admin,dc=takahashi,dc=lab "ou=people,dc=takahashi,dc=lab" -W
ldapdelete -x -D cn=admin,dc=takahashi,dc=lab "ou=group,dc=takahashi,dc=lab" -W

ユーザ登録

ユーザ用初期パスワードを生成
mkdir ~/LDAP;cd ~/LDAP
#password生成
cd ~/LDAP;slappasswd -s xxxxxxxx > xxxxxxxx.ssha

ユーザ登録用スクリプトmyldapadd.shでユーザ情報他を生成する。
#!/bin/bash
#~/LDAP/myldapadd.sh usename
#  uid = username(serial number) i.e. 12345
SUFFIX='dc=takahashi,dc=lab'
USERLDIF='ldapuser.ldif'
CN=$1
USERDIR=/NFS/$CN
PASS=`cat ../PASS.pw`

#------------
# ldapuser.ldif
    echo "dn: uid=$CN,ou=people,$SUFFIX" >> $USERLDIF
    echo "objectClass: inetOrgPerson" >> $USERLDIF
    echo "objectClass: posixAccount" >> $USERLDIF
    echo "objectClass: shadowAccount" >> $USERLDIF
    echo "cn: $CN" >> $USERLDIF
    echo "sn: $CN" >> $USERLDIF
    echo "userPassword: $PASS" >> $USERLDIF
    echo "loginShell: /bin/bash" >> $USERLDIF
    echo "uidNumber: $CN" >> $USERLDIF
    echo "gidNumber: $CN" >> $USERLDIF
    echo "homeDirectory: $USERDIR" >> $USERLDIF
    echo >> $USERLDIF

#ldapgroup.ldif
    echo "dn: cn=$CN,ou=group,$SUFFIX" >> $USERLDIF
    echo "objectClass: posixGroup" >> $USERLDIF
    echo "cn: $CN" >> $USERLDIF
    echo "gidNumber: $CN" >> $USERLDIF
    echo "memberUid: $CN" >> $USERLDIF
    echo >> $USERLDIF

#user dir(home dir)
    mkdir $USERDIR
    chmod 700 $USERDIR
    cp -R /etc/skel/* $USERDIR/ 
    cp -R /etc/skel/.[A-z]* $USERDIR/
    ln -s /tmp $USERDIR/.cache
    chown -R $CN:$CN $USERDIR

ユーザ登録は年1回(または2回)程度と仮定する。
登録年月日ごとにディレクトリを分ける。
#
mkdir ~/LDAP/20220502
cd ~/LDAP/20220502
ユーザ情報の生成・登録作業を行う。一件づつ登録してもよいが、ユーザが多いときはスクリプト(user.sh)を作成してもよい。

#!/bin/bash
#cd ~/LDAP/20220502;./user.sh
#2022/05/02 myldapadd.shを修正 ldapファイルを簡略

#delete students  旧ユーザを削除
#ldapdelete -x -D "cn=admin,dc=takahashi,dc=lab" -w aabn1055 "cn=xxxxx,ou=Group,dc=takahashi,dc=lab"
#ldapdelete -x -D "cn=admin,dc=takahashi,dc=lab" -w aabn1055 "uid=xxxxx,ou=people,dc=takahashi,dc=lab"
#rm -rf /NFS/xxxxx

#古いldapuser.ldifがあるときは削除
echo > ldapuser.ldif

#add students 新規ユーザを登録用ldifファイルを生成
#passwordを指定  USERPASSWORD
cp ../USERPASSWORD.ssha ../PASS.pw

# ユーザ21000を登録----ldap.ldifを生成
../myldapadd.sh 21000

#add students 113xx 連番で登録
#for SN in `seq 11301 11337`;do
#  ../myldapadd.sh $SN
#done

#ldifファイルを登録
ldapadd -x -D cn=admin,dc=takahashi,dc=lab -w aabn1055 -f ldapuser.ldif
ldapsearch -x -b dc=takahashi,dc=lab

ユーザ削除

ユーザを指定して、ユーザ情報とグループを削除
#ldapdelete -x -D "cn=admin,dc=takahashi,dc=lab" -w xxxxxxxx "uid=10300,ou=people,dc=takahashi,dc=lab"
#ldapdelete -x -D "cn=admin,dc=takahashi,dc=lab" -w xxxxxxxx  "cn=10300,ou=Group,dc=takahashi,dc=lab"

ユーザ確認

#全員を表示
#ldapsearch -x -b dc=takahashi,dc=lab
#ユーザ(uid)を指定して表示
#ldapsearch -x -b "uid=10300,ou=people,dc=takahashi,dc=lab"


LDAPサーバ マルチマスタ(Debian11.3.0)

2022/5/2


マルチマスタ構成

LDAPサーバ1台では不安だとの声が聞こえた。2台構成(プロバイダ[旧名マスタ]/コンシューマ[旧名スレーブ])としてもよいが、ユーザ登録ができるのはプロバイダに限定される。
できれば、
 ・ユーザ認証はプロバイダAでもプロバイダBでもできる
 ・プロバイダAでユーザ登録するとプロバイダBに反映される
 ・プロバイダBでユーザ登録するとプロバイダAに反映される
 ・プロバイダAでユーザ登録し、ユーザ未登録のプロバイダBを接続すると、プロバイダBにユーザ登録が複製される。
 ・プロバイダは2台に制限するつもりはない。最大数で構成する。(現在使用可能数は6台)
みたいなことを実現したい。 これを実現するのがマルチマスタリプリケーションらしい。
これまでの手順でプロバイダAができているので、同じ手順でプロバイダB,..,Fをつくる。プロバイダBはユーザ登録は省略する。

準備

すべてのプロバイダに共通のbase.ldifをコピーし、1台目と同じ手順でldapプロバイダの初期設定をする。
ユーザ登録はまだしない。6台すべての設定が終わった後に行う。
apt -y install slapd ldap-utils
mod_syncprov.ldif,syncprov.ldifを新規に登録する。 mod_syncprov.ldif,syncprov.ldifは共通なので、1台目で作成したものをコビーしてよい。
cat << 'EOF' > mod_syncprov.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: syncprov.la
EOF

cat << 'EOF' > mod_syncprov.ldif
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
master.ldifをつくる。
olcServerID:は重複してはいけない。IPアドレス下位3桁(xxx.xxx.xxx.XXX)にでもしておけば間違えることはないだろう。
providerは参照すべきプロバイダを指定する。
・参照すべきプロバイダは LDAP#1はLDAP2を参照, LDAP#2はLDAP#3を参照, ..., LDAP#5はLDAP#6を参照, LDAP#6はLDAP#1を参照 のような循環設定
・同期に失敗したとき リトライは30分後に5回 さらに失敗したときは300分後に3回( retry="30 5 300 3")
・同期は5分ごと( interval=00:00:05:00)
とする。
cat << 'EOF' > master.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 101

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://xx.xx.xx.xx:389/
  bindmethod=simple
  binddn="cn=admin,dc=takahashi,dc=lab"
  credentials=xxxxxxxx
  searchbase="dc=takahashi,dc=lab"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

EOF

ldapmodify -Y EXTERNAL -H ldapi:/// -f master.ldif 

Server World(https://www.server-world.info/query?os=Debian_10&p=openldap&f=1)