sshの認証をRSA鍵で行う場合、ふつうは接続先の全サーバのホームディレクトリにユーザの公開鍵を書き込んでおかなくてはいけない。これまでは全サーバのホームディレクトリ自体をNFSで共有するという荒業で済ませていたが、NFSのマウントが外れているときにログインできなかったりしていざというときのメンテナンスに支障を来たしていた。公開鍵をLDAPから参照すればこの問題は解決する。
この機能はssh_lpk(LDAP Public Key)といわれているが、Open SSHに統合されておらずパッチとして提供されている。CentOSほか主要ディストリビューションでも取り込んでいないようだ。Open SSHのソースとパッチでMakeしてもいいが、今回はhttp://mirror.proserve.nl/repo/centos/5/i386/で公開されていたCentOS用のRPMを使った。(最初は同じところにあったSRPMからリビルドしたが起動時にセグメンテーションフォルトするので断念。)
sshサーバの作業
まずRPMをダウンロード。もっと新しいバージョンのものもあったが無用なトラブルを避けたいのでCentOS5の採用バージョンと同じものを選んだ。
[root@localhost tmp]# wget http://mirror.proserve.nl/repo/centos/5/i386/openssh-4.3p2-26.lpk.i686.rpm [root@localhost tmp]# wget http://mirror.proserve.nl/repo/centos/5/i386/openssh-askpass-4.3p2-26.lpk.i686.rpm [root@localhost tmp]# wget http://mirror.proserve.nl/repo/centos/5/i386/openssh-clients-4.3p2-26.lpk.i686.rpm [root@localhost tmp]# wget http://mirror.proserve.nl/repo/centos/5/i386/openssh-server-4.3p2-26.lpk.i686.rpm
まず現在インストールされているOpenSSHを削除する。
[root@intra ishii]# rpm -e openssh-clients [root@intra ishii]# rpm -e openssh-server 警告: /etc/ssh/sshd_config は /etc/ssh/sshd_config.rpmsave として保存されした。 [root@intra ishii]# rpm -e openssh
そしてLPK版のOpenSSHをインストールする。
[root@localhost tmp]# rpm -Uvh openssh-*.rpm
/etc/ssh/sshd_confに以下の設定を追加。ここで見栄えをよくしようと余計なタブを2個いれたためsshdの起動時にldap public key [LDAP] could not parse /etc/ldap.confなどというエラーがでて何時間も無駄にしてしまった...。
... UseLPK yes LpkLdapConf /etc/ldap.conf LpkServers ldap://intra LpkUserDN ou=People,dc=example,dc=com LpkGroupDN ou=Groups,dc=example,dc=com LpkForceTLS no ...
ここまで出来たらsshdを再起動。
[root@localhost tmp]# service sshd restart sshd を停止中: [ OK ] sshd を起動中: [ OK ]
ldapサーバの作業
ldapサーバはプログラム的には変更の必要はない。RSA鍵を格納するためのスキーマを用意し、ディレクトリにRSA鍵を追加するだけでOKだ。
まずスキーマをダウンロードして、openldapの所定の場所にコピーする。
ishii@intra:/tmp$ wget http://dev.inversepath.com/openssh-lpk/openssh-lpk_openldap.schema ishii@intra:/tmp$cp openssh-lpk_openldap.schema /etc/openldap/schema/
次にopenldapが上記のスキーマを読み込むように/etc/openldap/slapd.confに以下の一行を追加する。
include /etc/openldap/schema/openssh-lpk_openldap.schema
そしてopenldapを再起動。
[root@intra ~]# service ldap restart
slapd を停止中: [ OK ]
slapd の設定ファイルをチェック中: config file testing succeeded
[ OK ]
slapd を起動中: [ OK ]
次にエントリ追加のためのldifファイルを作る。sshPublicKeyは~/.ssh/authorized_keysの該当ユーザのエントリを改行など含めずにそのままコピーする。
ishii@intra:/tmp$ cat modify.ldif dn: uid=ishii,ou=People,dc=grandarbre,dc=net changetype: modify add: objectClass: objectClass: ldapPublicKey - add: sshPublicKey: sshPublicKey: ssh-rsa XXX(略)XXXX= ishii
そしてエントリを更新する。
ldapmodify -x -h localhost -D "cn=Manager,dc=grandarbre,dc=net" -W -f modify.ldif
エントリがちゃんと更新されたか検索して確認をしておこう。objectClass: ldapPublicKeyとsshPublicKey: ...が追加されていればOK。
ishii@intra:/tmp$ ldapsearch -H ldap://intra -x -b"dc=grandarbre,dc=net" "(objectClass=posixAccount)(objectClass=ldapPublicKey)(uid=ishii)"
おなじLDAP検索の試験をsshサーバ(=LDAPのクライアント)からも試しておこう。
動作確認
それでは動作を確認しよう。別のサーバから上記で設定したsshサーバにsshしてみる。
ishii@www:~$ ssh 192.168.0.185 Enter passphrase for key '/home/ishii/.ssh/identity': Last login: Sun Feb 22 00:15:25 2009 from www.grandarbre.net [ishii@localhost ~]$
ちゃんとRSA鍵でsshが出来た。/var/log/secureにも以下のようにログが残っている。192.168.1.1はssh元のIPアドレスだ。
Feb 22 00:15:36 localhost sshd[4472]: Accepted publickey for ishii from 192.168.1.1 port 49155 ssh2