前回、レプリケーションさせたopenldapサーバを2台のサーバで起動させた。マルチマスター構成なので、どちらかさえ生きていればよいという冗長化がなされた状態だ。あとはクライアント側の設定をすればldapによる認証を利用できるようになる。何はともあれ、sshくらいはldap認証に切り替えないと恩恵が薄いので、まずはlocalでのsu認証とssh認証をldapに切り替えてみる。ssh用の公開鍵情報を登録できるように以下のような設定を追加する。どちらかのldapサーバで実行する前提。
sudo ssh ldap1
cat <<'EOF'> lpk.ldif
dn: cn=openssh-lpk-openldap,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk-openldap
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' D
ESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.
1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' DE
SC 'MANDATORY: OpenSSH LPK objectclass' SUP top AUXILIARY MUST ( sshPublicK
ey $ uid ) )
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f lpk.ldif
systemctl restart slapd
続いて、以下のような形でユーザーを登録してみる。今回はtestというユーザーで設定してみる。slappasswdでこのユーザー用パスワードのハッシュを予め用意しておく。それをuserPasswordの項目に指定する。さらにssh-keygenを使って、後悔鍵認証用の秘密鍵と公開鍵を生成する。そのうち、公開鍵の内容をsshPublicKeyの項目に指定する。ここでは新たに追加するuserとgroupの情報を準備している。これをldapaddで追加したら、念のためにldapsearchで確認を。具体的には以下のような感じ。
slappasswd
:
New password:
Re-enter new password:
{SSHA}jlW2ODGtkFUt5nmawF+GhS42cdnNdnES
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiGrC5hbGpCNqxEmuD4yMDBbo9EJXIJ7qYhVRpPEpVKFZJAk3FHNenZel/HLpiTUoGpQ6L+vgkhK7vFNN84b6O/0wZgjyxyk4Bqr5tq58sPck8xuQkJn+mq3lL2iDBOlRoNPmThmJpS5GPtCy6q1pL+Zqci8nqN62jRbLq1zUB73A3dYn5FNbNRwpnudvkNfxL70L0C6JgkRETDiOaTrWAwrLrDIJ2TGHeTBWVDmZAXcFpXPXXrG+XZlcDSx7ZJIWdPHzFl35JlU6/IzSWGvgwCfeg0zxBEas2l4eAUMQvP0gpPBcR0KRp9UnCZuIglcc84D+a+nVOMPQ3W0QCy9sp test@ldap1.domain.com
cat <<'EOF'> user.ldif
dn: uid=test,ou=Users,dc=domain,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ldapPublicKey
cn: Test
sn: User
userPassword: {SSHA}jlW2ODGtkFUt5nmawF+GhS42cdnNdnES
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test
sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiGrC5hbGpCNqxEmuD4yMDBbo9EJXIJ7qYhVRpPEpVKFZJAk3FHNenZel/HLpiTUoGpQ6L+vgkhK7vFNN84b6O/0wZgjyxyk4Bqr5tq58sPck8xuQkJn+mq3lL2iDBOlRoNPmThmJpS5GPtCy6q1pL+Zqci8nqN62jRbLq1zUB73A3dYn5FNbNRwpnudvkNfxL70L0C6JgkRETDiOaTrWAwrLrDIJ2TGHeTBWVDmZAXcFpXPXXrG+XZlcDSx7ZJIWdPHzFl35JlU6/IzSWGvgwCfeg0zxBEas2l4eAUMQvP0gpPBcR0KRp9UnCZuIglcc84D+a+nVOMPQ3W0QCy9sp test@ldap1.domain.com
dn: cn=test,ou=Group,dc=domain,dc=com
objectClass: posixGroup
cn: test
gidNumber: 1000
memberUid: test
EOF
ldapadd -x -wxxxxxxxx -D cn=manager,dc=domain,dc=com -f user.ldif
ldapsearch -x uid=test
ここまででサーバ側の設定は完了。幾つもユーザーを作りたければ、上記を参考にどんどん追加してしまって下さい。追加が終わったらクライアント側の設定を行うので、対象となるサーバに移動。必要なパッケージをインストールして、authconfigを流す。放っておくとsslで繋ごうとしてしまうので、それを止めておく。もちろんldapサーバをssl対応させるという方法でもOK。これで、local内でのsuによる認証はldapでのパスワード認証に切り替わるはず。確認しておくこと。
sudo ssh ldap1
yum install -y authconfig openldap-clients nss-pam-ldapd openssh-ldap
authconfig --enableldap --enableldapauth --ldapserver=ldap1,ldap2 --ldapbasedn=dc=nodoka,dc=org --enablemkhomedir --update
echo 'ssl no' >> /etc/openldap/ldap.conf
su - nodoka
Password:
次はsshをldapに対応させる。先ほどのldap.confを/etc/sshにも配置する。差分が出ると面倒なので、シンボリックリンクにしておく。ssh-ldap-helperを使うと、設定した公開鍵が参照できるかどうかわかるので確認。ここで公開鍵情報が表示されない場合は、どこかしら設定が間違えているので見直す。最後にsshdサーバに設定を追加する。認証鍵の確認に使うコマンドに/usr/libexec/openssh/ssh-ldap-wrapperを指定する。このwrapperの中身を確認すればわかるんだけど、要はssh-ldap-helperを実行してるだけ。
ln -s /etc/openldap/ldap.conf /etc/ssh
/usr/libexec/openssh/ssh-ldap-helper -s test
:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiGrC5hbGpCNqxEmuD4yMDBbo9EJXIJ7qYhVRpPEpVKFZJAk3FHNenZel/HLpiTUoGpQ6L+vgkhK7vFNN84b6O/0wZgjyxyk4Bqr5tq58sPck8xuQkJn+mq3lL2iDBOlRoNPmThmJpS5GPtCy6q1pL+Zqci8nqN62jRbLq1zUB73A3dYn5FNbNRwpnudvkNfxL70L0C6JgkRETDiOaTrWAwrLrDIJ2TGHeTBWVDmZAXcFpXPXXrG+XZlcDSx7ZJIWdPHzFl35JlU6/IzSWGvgwCfeg0zxBEas2l4eAUMQvP0gpPBcR0KRp9UnCZuIglcc84D+a+nVOMPQ3W0QCy9sp test@ldap1.domain.com
vi /etc/ssh/sshd_config
:
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper
AuthorizedKeysCommandUser root
systemctl restart sshd
これでsshでもldap認証を使えるようになる。秘密鍵を持っていれば公開鍵認証でログインできるはず。もちろんsshdサーバ側で公開鍵認証を許可する設定は必要。たぶんデフォルトで許可されていたように記憶してるけど。どこでもldap認証を使いたいなら、この設定を全サーバで行う必要がある。面倒だからchefでrecipe書いて全サーバに適用しました。物理サーバはそれほど数ないんだけど、コンテナで動いているサーバが結構あるんだよね。次回は更に適用範囲を広げていきたい。とりあえずsambaかな。