openldap サーバの openssh 連携

前回、レプリケーションさせた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かな。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)