CentOS5でssh認証のRSA鍵をLDAPで集中管理する

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