====== 概要 ====== * クラスター計算機では、各計算ノードにも使用者のユーザーアカウントを作る必要があります。 * ユーザー数や計算ノードが多いととんでもなく面倒なので、管理ノードでユーザー情報を一元管理します。その仕組みがLDAP (Lightweight Directory Access Protocol)です。 * ここではLDAPの実装としてOpenLDAPを使用します。 ====== 管理ノードでの作業 ====== ===== OpenLDAPのインストールと初期設定 ===== ソフトウェアのインストール $ sudo apt install slapd ldap-utils 以下を聞かれるので設定 * Administrator password: 任意 初期設定 $ sudo dpkg-reconfigure slapd * Omit OpenLDAP server Configuration?: No * DNS domain name: cluster.internal など(任意) * プライベートLANの名前と思えばよい。 * 世の中(インターネットの中)にある他のドメイン名と衝突しなければなんでもよい。 * そのため、固定IPと対応する公開ドメイン名をもらったのなら、それを使うのが一般的。 * たとえば、固定IPとともに taro-lab.phys.daigaku.ac.jp という公開ドメイン名をもらったとして、そのまま使うのもありだし、管理ノードの個別名と明確に区別したいということであれば cluster.taro-lab.phys.daigaku.ac.jp みたいにする。 * LDAPサーバーがプライベートLANで閉じることが確約しているのなら、hogehoge.internal や hogehoge.home.arpa が広く使われている、らしい * https://en.wikipedia.org/wiki/.internal * クラスタ計算機のドメインなので、ここでは cluster.internal としておく * Organization name: Computer cluster * このドメインが何を表すかの覚書。好きな名前にしてよろしい * Administration password: インストール時に入力したもの * Do you want the database to be removed when slapd is purged?: No * slapdをアンインストールしたときにデータベースを残すかどうか。 * Move old database?: Yes * 古いデータベースを別名にして残すかどうか。 ちゃんと設定されたか確認 $ sudo slapcat dn: dc=cluster,dc=internal objectClass: top objectClass: dcObject objectClass: organization o: Computer cluster dc: cluster structuralObjectClass: organization entryUUID: e186be3c-fea8-1040-8619-d5206caf5213 creatorsName: cn=admin,dc=cluster,dc=internal createTimestamp: 20260617145927Z entryCSN: 20260617145927.614662Z#000000#000#000000 modifiersName: cn=admin,dc=cluster,dc=internal modifyTimestamp: 20260617145927Z ===== 基本構造作成 ===== 組織単位を作成し、LDAPに追加する。 $ nano base.ldif dn: ou=people,dc=cluster,dc=internal objectClass: organizationalUnit ou: people dn: ou=groups,dc=cluster,dc=internal objectClass: organizationalUnit ou: groups dn: ou=hosts,dc=cluster,dc=internal objectClass: organizationalUnit ou: hosts LDAPで * ユーザー * グループ を管理します。 $ ldapadd -x -D cn=admin,dc=cluster,dc=internal -W -f base.ldif ちゃんと設定されたか確認。 $ sudo slapcat dn: dc=cluster,dc=internal objectClass: top objectClass: dcObject objectClass: organization o: Computer cluster dc: cluster structuralObjectClass: organization entryUUID: e186be3c-fea8-1040-8619-d5206caf5213 creatorsName: cn=admin,dc=cluster,dc=internal createTimestamp: 20260617145927Z entryCSN: 20260617145927.614662Z#000000#000#000000 modifiersName: cn=admin,dc=cluster,dc=internal modifyTimestamp: 20260617145927Z dn: ou=people,dc=cluster,dc=internal objectClass: organizationalUnit ou: people structuralObjectClass: organizationalUnit entryUUID: 2b271ea6-fea9-1040-8d53-7d7e6af5b904 creatorsName: cn=admin,dc=cluster,dc=internal createTimestamp: 20260617150131Z entryCSN: 20260617150131.139400Z#000000#000#000000 modifiersName: cn=admin,dc=cluster,dc=internal modifyTimestamp: 20260617150131Z dn: ou=groups,dc=cluster,dc=internal objectClass: organizationalUnit ou: groups structuralObjectClass: organizationalUnit entryUUID: 2b27ad3a-fea9-1040-8d54-7d7e6af5b904 creatorsName: cn=admin,dc=cluster,dc=internal createTimestamp: 20260617150131Z entryCSN: 20260617150131.143063Z#000000#000#000000 modifiersName: cn=admin,dc=cluster,dc=internal modifyTimestamp: 20260617150131Z dn: ou=hosts,dc=cluster,dc=internal objectClass: organizationalUnit ou: hosts structuralObjectClass: organizationalUnit entryUUID: 2b27ed4a-fea9-1040-8d55-7d7e6af5b904 creatorsName: cn=admin,dc=cluster,dc=internal createTimestamp: 20260617150131Z entryCSN: 20260617150131.144703Z#000000#000#000000 modifiersName: cn=admin,dc=cluster,dc=internal modifyTimestamp: 20260617150131Z ===== ユーザーの追加 ===== ハッシュ化されたユーザーの初期パスワードを設定する。 $ slappasswd New password: Re-enter new password: {SSHA}9VhiMfY0h9+SiAzqqCRIYGnKedgMUfH5 ユーザー情報の作成。 $ nano user.ldif dn: cn=taro,ou=groups,dc=cluster,dc=internal objectClass: posixGroup cn: taro gidNumber: 10000 dn: uid=taro,ou=people,dc=cluster,dc=internal objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount cn: Taro Yamada sn: Yamada uid: taro uidNumber: 10000 gidNumber: 10000 homeDirectory: /home/taro loginShell: /bin/bash userPassword: {SSHA}9VhiMfY0h9+SiAzqqCRIYGnKedgMUfH5 uidとgidは、ユーザーIDとグループIDのこと。 OS自体が持っているIDとの衝突を避けるため、LDAPを使うときは10000番台から始めることが多い。 1グループ1ユーザーで作るとわかりやすいので、ここではtaroというグループを作って、そこにtaroというユーザーを登録している。 Linuxのグループの機能を使いたいなら、あるグループを作ってそこに複数のユーザーをまとめてもよい。 $ ldapadd -x -D cn=admin,dc=cluster,dc=internal -W -f user.ldif ちゃんと登録されているか確認 $ sudo slapcat 正しく登録されていれば、今まで入力した情報がすべて表示されます。 以下で述べるLDAPユーザの自動homeディレクトリ作成機能を利用しないなら、手動で作成する。 $ sudo mkdir /home/taro $ sudo chown 10000:10000 /home/taro ===== ユーザーの削除 ===== $ ldapdelete -x -W -D "cn=admin,dc=cluster,dc=internal" 'cn=taro,ou=groups,dc=cluster,dc=internal' $ ldapdelete -x -W -D "cn=admin,dc=cluster,dc=internal" 'uid=taro,ou=people,dc=cluster,dc=internal' 確認 $ sudo slapd ====== LDAPクライアント ====== * 最近はLDAPクライアントとしてSSSDが推奨されているらしいが、設定が面倒なので昔ながらのnscd+nslcdを使う。 * まず管理ノードで作業し、次に計算ノードで行う。 - 必要なパッケージをインストール $ sudo apt install -y libnss-ldapd libpam-ldapd * LDAP server URI: ldap://192.168.0.1/ * LDAP server search base: dc=cluster,dc=internal * Name services to configure: passwd, group, shadow (スペースキーでチェックを入れられます) - (管理ノードのみ)PAM(Pluggable Authentication Modules)の認証設定 $ sudo pam-auth-update * 「LDAP Authentication」を有効化(通常は自動で有効化済み) * Create home directory on login を有効化 - (管理ノードのみ)nscd+nslcdを再起動 $ sudo systemctl restart nslcd nscd - ユーザーが見えるか確認 $ getent passwd taro taro:x:10000:10000:Taro Yamada:/home/taro:/bin/bash * あるいは $ id taro * uidとgidが見えます。 - ユーザーに切り替えるには $ su - taro ==== トラブルシューティング ==== * 環境:Ubuntu Desktop 26.04 追加したtaroのログインに失敗します。 $ su - taro Password: su: Authentication failure /var/log/syslogを見ると $ cat /var/log/syslog (略) 2026-05-14T16:16:19.302517+09:00 kanri kernel: audit: type=1400 audit(1778742979.300:545): apparmor="DENIED" operation="connect" class="file" profile="unix-chkpwd" name="/att/unix-chkpwd/run/nslcd/socket" pid=16833 comm="unix_chkpwd" requested_mask="wr" denied_mask="wr" fsuid=0 ouid=0 となっていたので、管理ノード・計算ノードのAppArmorを修正しました。 === 解決策1 === $ sudo nano /etc/apparmor.d/unix-chkpwd (略) include if exists /att/unix-chkpwd/run/nslcd/socket rw, #この行を追加 } $ sudo apparmor_parser -r /etc/apparmor.d/unix-chkpwd === 解決策2 === $ echo "/att/unix-chkpwd/run/nslcd/socket rw," | sudo tee -a /etc/apparmor.d/local/unix-chkpwd $ sudo systemctl reload apparmor ====== おまけ ====== ===== ホスト名の共有 ===== LDAPでは、ユーザー情報だけでなくホスト名も共有できます。 通常はDNSサーバーを使って名前解決すべきなのであまり推奨されません。 しかし、DNSサーバーを立てる必要がない分だけ楽にクラスター計算機が構築できます。 ==== 管理ノードでの作業 ==== - LDAPでホスト情報を扱えるようにする。 dn: ou=hosts,dc=cluster,dc=internal objectClass: organizationalUnit ou: hosts $ ldapadd -x -D cn=admin,dc=cluster,dc=internal -W -f base-hosts.ldif - 個別のホスト情報を登録(LDIFファイルには必要な分だけ書いてください。) dn: cn=head,ou=hosts,dc=cluster,dc=internal objectClass: top objectClass: ipHost objectClass: device cn: head ipHostNumber: 192.168.0.1 dn: cn=node11,ou=hosts,dc=cluster,dc=internal objectClass: top objectClass: ipHost objectClass: device cn: node11 ipHostNumber: 192.168.0.11 dn: cn=node12,ou=hosts,dc=cluster,dc=internal objectClass: top objectClass: ipHost objectClass: device cn: node12 ipHostNumber: 192.168.0.12 $ ldapadd -x -D "cn=admin,dc=cluster,dc=internal" -W -f hosts.ldif ==== 管理・計算ノードでの作業 ==== libnss-ldapdをインストールするときにhostsも共有するか聞かれますが、そこで共有しないようにしてしまった人向け。 - /etc/nsswitch.confのhostsにldapを追加 # /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. passwd: files systemd ldap group: files systemd ldap shadow: files systemd ldap gshadow: files systemd hosts: files dns ldap networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis - nscd, nslcdの再起動 $ sudo systemctl restart nslcd nscd - ホストが反映されているか確認 $ getent hosts ====== 参考資料 ====== * https://server-network-note.net/2022/11/openldap-client-ubuntu22-04lts-server/ * https://zenn.dev/iasl/articles/1d35c87a66ee35