LDAP サーバで管理する情報
posixアカウント(uid,gid,groups)
ssh
sudo
autofs
dsidm -b "dc=uedagp,o=riken.go.jp" uedagp organizationalunit create --ou automount
automountの設定項目はhttps://docs.oracle.com/cd/E19504-01/805-0673/6j0msjnjf/index.htmlを参照。
# automount.ldif
# master map entry
dn: automountMapName=auto.master,ou=automount,dc=uedagp,o=riken.go.jp
objectClass: automountMap
automountMapName: auto.master
# home map entry
dn: automountMapName=auto.home,ou=automount,dc=uedagp,o=riken.go.jp
objectClass: automountMap
automountMapName: auto.home
# home mount point
dn: automountKey=/-,automountMapName=auto.master,ou=automount,dc=uedagp,o=riken.go.jp
objectClass: automount
automountKey: /-
automountInformation: auto.home --timeout=600
# Mount 192.168.1.1:/home to /home
dn: automountKey=/home,automountMapName=auto.home,ou=automount,dc=uedagp,o=riken.go.jp
objectClass: automount
automountKey: /home
automountInformation: -fstype=nfs4,rw,soft,intr 192.168.1.1:/home
description: home directory
以下のコマンドで読み込ませる。
ldapadd -x -D "cn=Directory Manager" -W -f automount.ldif
上記の設定と同等の設定をクライアント側のファイルで行うと以下のようになる。
# /etc/auto.master
...
+auto.master
/- auto.home --timeout=60
および
# /etc/auto.home
/home -fstype=nfs4,rw,soft,intr 192.168.1.1:/home
つまり、
# /etc/<automountMapName>
<automountKey> <automountInformation>
のように解釈される。
automount配下の情報が匿名検索で取得できるようにaci (Access Control Instruction) を設定する。そのために、sudoers_sci.ldif を作成する。
# automount_sci.ldif
dn: ou=automount,dc=uedagp,o=riken.go.jp
changetype: modify
add: aci
aci: (targetattr="cn || ou || description || automountMapName || automountKey || automountInformation || objectClass")(targetfilter="(objectClass=*)")(version 3.0; acl "Enable anyone automount read"; allow (read, search, compare)(userdn="ldap:///anyone");)
以下のコマンドで読み込ませる。
ldapadd -x -D "cn=Directory Manager" -W -f automount_aci.ldif
以下のコマンドで匿名検索して、automountの設定情報が正しく表示されていれば良い。
ldapsearch -H ldap://localhost -b "ou=automount,dc=uedagp,o=riken.go.jp" -x
dsidm uedagp organizationalunit create --ou SUDOers
sudoのデフォルトオプションとsudoを許可するグループを設定するため、sudoers.ldif を作成する。
# sudoers.ldif
dn: cn=defaults,ou=SUDOers,dc=uedagp,o=riken.go.jp
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_keep+=SSH_AUTH_SOCK
dn: cn=%admins,ou=SUDOers,dc=uedagp,o=riken.go.jp
objectClass: top
objectClass: sudoRole
cn: %admins
sudoUser: %admins
sudoHost: ALL
sudoCommand: ALL
このファイルでは、sudoコマンドのデフォルトオプションを"cn=defaults,ou=SUDOers,dc=uedagp,o=riken.go.jp"エントっりの"sudoOption"で設定するとともに、adminsグループに属するユーザに対して、任意のホストで任意のコマンドを実行することを許可している。
作成した sudoers.ldif を読み込んで変更を適用する。
ldapmodify -x -D "cn=Directory Manager" -W -f sudoers.ldif
以下のコマンドで検索して、上で登録した cn=defaults や cn=%admins が見えれば成功である。
ldapsearch -D "cn=Directory Manager" -W -H ldap://localhost -b "ou=SUDOers,dc=uedagp,o=riken.go.jp" -x
しかし、初期状態では匿名ユーザによる検索は許可されていないため、以下のコマンドで検索するとcn=defaults や cn=%admins は見えないはずである。
ldapsearch -H ldap://localhost -b "ou=SUDOers,dc=uedagp,o=riken.go.jp" -x
そこで、SUDOers配下の情報が匿名検索で取得できるようにaci (Access Control Instruction) を設定する。そのために、sudoers_sci.ldif を作成する。
# sudoers_sci.ldif
dn: ou=SUDOers,dc=uedagp,o=riken.go.jp
changetype: add
add: aci
aci: (targetattr="cn || sudoOption || sudoUser || sudoHost || sudoCommand || description || objectClass")(targetfilter="(objectClass=sudoRole)")(version 3.0; acl "Enable anyone SUDOers read"; allow (read, search, compare)(userdn="ldap:///anyone");)
このファイルでは、"ou=SUDOers,dc=uedagp,o=riken.go.jp"配下の"objectClass=sudoRole"であるエントリについて、属性"cn || sudoOption || sudoUser || sudoHost || sudoCommand || description || objectClass"の値を"read, search, compare" することを、匿名ユーザを含む任意のユーザ("userdn="ldap:///anyone")に対して許可している。
作成した sudoers_sci.ldif を読み込んで変更を適用する。
ldapmodify -x -D "cn=Directory Manager" -W -f sudoers_sci.ldif
再び匿名ユーザで検索して、cn=defaults や cn=%admins のエントリとそれらの属性値(sudoOption, sudoUser, sudoHost, sudoCommand)が全て見えれば成功である。
ldapsearch -H ldap://localhost -b "ou=SUDOers,dc=uedagp,o=riken.go.jp" -x "(cn=*)"
・ sudo を許可するユーザを adminsグループに加える。
dsidm -b "dc=uedagp,o=riken.go.jp" uedagp group add_member admins <dn of the user>
/etc/exports に NFS で共有するディレクトリの設定を書く。
# /etc/exports
/export 192.168.1.0/255.255.255.0(rw,fsid=0,no_root_squash,async)
/export/home 192.168.1.0/255.255.255.0(rw,nohide,no_root_squash,async)
このファイルで、fsid=0と指定したディレクトリ(ここでは/export)がNFSサーバのルートとなる。そこで、NFSで共有するディレクトリをこの/exportディレクトリ配下に置く必要がある。そのために、/homeを/export/homeにバインドマウントする。
# /etc/fstab
...
/home /export/home none bind 0 0
mkdir -p /export/home としてマウントポイントを作成した後、systemctl daemon-reload で変更を反映し、mount -a でマウントを行う。
mkdir -p /export/home
systemctl daemon-reload
mount -a
ls /export/home としてマウントが正常に行われているか確認する。
設定ファイル:/etc/sssd/sssd.conf
新規ユーザを追加して、SSSDクライアントから見えるか確認する:dsidm uedagp user create
パスワードを使ったSSH接続ができるかを確認する:ssh test@ucems01
接続先で sudo ができるかを確認する:sudo ls
LDAPサーバに戻りログインシェルの変更した後、再びssh接続をして変更が反映されるか確認する:dsidm uedagp user modify test add:loginShell:/bin/zsh
SELinuxを有効にしたシステムで、別ホスト上のホームディレクトリをNFSを用いて参照していた場合、$HOME/.ssh/authorized_keys へのアクセスがSELinuxにより拒否されて公開鍵認証ができない問題が発生した。
公開鍵認証ができない問題が発生したときに、サーバ側のログを確認するには、サーバの/etc/ssh/sssd_config で
# /etc/ssh/sssd_config
...
SyslogFacility AUTH
LogLevel DEBUG
...
とした後、
systemctl restart sshd
として設定を反映させる。その後、サーバへのsshログインを試すと、/var/log/messagesに詳細なログが出力される。
ここで、
# /var/log/messages
...
... SELinux is preventing /usr/sbin/sshd from read access on the file authorized_keys ...
...
と記載されていれば、SELinuxにより公開鍵認証が拒否されている。NFSを用いてホームディレクトリをマウントしている場合は、このメッセージの後に記載されている指示に従って、SELinuxにホームディレクトリにNFSを使用していることを伝えるブール変数を設定する。
setsebool -P use_nfs_home_dirs 1
設定したら、
systemctl restart sshd
として設定を反映させる。これで、公開鍵認証ができるようになっているはずである。