公開鍵管理の概要
読者の皆さんの多くはリモートメンテナンスのために、
公開鍵認証のメリットは、
たとえば管理対象のサーバが100台あるとすれば、
OpenSSHのインストール
sshデーモンと聞いて皆さんが真っ先に思いつくのはOpenSSHでしょう。もともとOpenBSD向けのソフトウェアでしたが、
本稿執筆時のOpenSSHの最新バージョンは4.
公開鍵をLDAP上に格納し、
% tar zxfv openssh-4.7p1.tar.gz % cd openssh-4.7p1 % patch -p2 < ../openssh-lpk-4.6p1-0.3.9.patch % ./configure --with-ldap && make # make install
今回は便宜上、
% ldd /usr/local/sbin/sshd | egrep '(ldap|lber)' libldap-2.2.so.7 => /usr/lib/libldap-2.2.so.7 (0x00a8d000) liblber-2.2.so.7 => /usr/lib/liblber-2.2.so.7 (0x0035c000)
% grep -i ldap /usr/local/etc/sshd_config
なお、
# USE=LDAP emerge openssh
とすればLDAP対応版のOpenSSHがインストールできますし、
# rpmbuild --rebuild openssh-4.3p2-12mdv2007.0.src.rpm --with ldap
のような形でバイナリパッケージを作成することができます。詳細については上記パッチ配布サイトのドキュメントを参照してみてください。後々のメンテナンスを考えるとパッケージからの導入をお勧めします。
スキーマ設定
今回の目標は、
過去の記事でも述べましたように、
しかし、
http://
include /etc/openldap/schema/openssh-lpk_openldap.schema
なお、
ではデータを登録してみます。普段ssh接続に使用している公開鍵ファイル、
公開鍵、秘密鍵の作成
次のように、
% ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/nomo/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/nomo/.ssh/id_dsa. Your public key has been saved in /home/nomo/.ssh/id_dsa.pub. The key fingerprint is: c3:ca:8b:58:8b:1a:6c:84:8b:8b:bd:06:e1:1e:20:4f nomo@rx8
この操作で作成される~/.ssh/
次にLDAPサーバ側での操作です。本連載の第2回でUNIXアカウントをLDAPサーバ側に登録しました。同じユーザツリーの中に公開鍵情報を登録してみましょう。
次のように、
dn: uid=sshuser,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
objectClass: ldapPublicKey
uid: sshuser
cn: sshuser
userPassword: sshuser
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/sshuser
sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAJ5sBOzM/PCkETefX7yzrs+oEVOp3hwuBSpL96pbkfoyQ5jvMABT6aGzXqQUTZu00Gke+G+CJeOg3rw9K7+ghrNuB4Rv33l1LdILjTTMFqDsvMo02Un6DKv/EvAW++rarKDDU5DMJOEPqkOWTsPb683WP77fHcBxKsALVtVAFTMzAAAAFQDVPmzJd39IYvKMWQsJQvzPefUX8wAAAIEAliBMDP2SFtPoAZMAbCtAwWtQmXh7C/+CJwrQEJMDYb1Pp+7jaOk+7AgsGMTA2abtSsPDvvhlrNXOyqx+EMYxibwnX4dnGS7NQAsQhqUmvqzzKfySD/UvJ6GQYtB9FMpju0L/qH5B5jtdfwggXTaGRXuadnzAZ7rrOOMvosqyhc8AAACBAInNQo10pbrnkp9grL+Db2/Rp1JXVajN02isPzfpS7uX9rohAlyTVLAjlwLwTGrp6CFwG4/t9e7jxlIo4Wm2r7LXgLr9u7+dg+oMENJpYkt/0NtLBq40dICE8yhha58cQau5z98Ajc6dO9yvB2Bp6C3oDIiumPq/e2IMGjYYrtcP nomo@rx8
ではこのエントリをLDAP上に登録します。
% ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f sshuser.ldif
次にsshdプロセスがLDAPサーバを検索できるよう、
UseLPK yes
LpkServers ldap://10.0.100.10
LpkUserDN ou=people,dc=example,dc=com
LpkGroupDN ou=group,dc=example,dc=com
準備ができたら、
# /usr/local/sbin/sshd
% ssh [email protected] Enter passphrase for key '/home/nomo/.ssh/id_dsa': Last login: Fri Nov 9 23:30:14 2007 from 10.0.100.1 -bash-3.00$
このように、
- sshサーバがユーザ名(sshuser)を受け取る
- LpkUserDNやLpkGroupDN以下からsshuserのエントリを検索
- もし見つかれば、
sshPublicKey属性を取得し、 その値を公開鍵として扱う - あとは通常通り認証
うまくいかない場合はLDAPサーバのログと照らし合わせたり、
Nov 10 02:40:53 localhost slapd[31307]: conn=2 fd=10 ACCEPT from IP=10.0.100.11:32831 (IP=0.0.0.0:389)
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=0 BIND dn="" method=128
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=0 RESULT tag=97 err=0 text=
Nov 10 02:40:53 localhost slapd[31307]: conn=3 fd=11 ACCEPT from IP=10.0.100.11:32832 (IP=0.0.0.0:389)
Nov 10 02:40:53 localhost slapd[31307]: conn=3 op=0 BIND dn="" method=128
Nov 10 02:40:53 localhost slapd[31307]: conn=3 op=0 RESULT tag=97 err=0 text=
Nov 10 02:40:53 localhost slapd[31307]: conn=3 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=shadowAccount)(uid=sshuser))"
Nov 10 02:40:53 localhost slapd[31307]: conn=3 op=1 SRCH attr=uid userPassword shadowLastChange shadowMax shadowMin shadowWarning shadowInactive shadowExpire shadowFlag
Nov 10 02:40:53 localhost slapd[31307]: conn=3 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=1 SRCH base="ou=people,dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(objectClass=ldapPublicKey)(uid=sshuser))"
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=1 SRCH attr=sshPublicKey
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=2 SRCH base="ou=people,dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(objectClass=ldapPublicKey)(uid=sshuser))"
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=2 SRCH attr=sshPublicKey
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=3 SRCH base="ou=people,dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(objectClass=ldapPublicKey)(uid=sshuser))"
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=3 SRCH attr=sshPublicKey
Nov 10 02:40:53 localhost slapd[31307]: conn=2 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
Nov 10 02:40:58 localhost slapd[31307]: conn=2 op=4 SRCH base="ou=people,dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(objectClass=ldapPublicKey)(uid=sshuser))"
Nov 10 02:40:58 localhost slapd[31307]: conn=2 op=4 SRCH attr=sshPublicKey
Nov 10 02:40:58 localhost slapd[31307]: conn=2 op=4 SEARCH RESULT tag=101 err=0 nentries=1 text=
Nov 10 02:40:59 localhost slapd[31307]: conn=2 fd=10 closed
Nov 10 02:40:59 localhost slapd[31307]: conn=3 fd=11 closed
メンテナンス
公開鍵情報を1か所で管理できるのが今回の一番のメリットですが、
ページの都合上、
動作確認ができればcrontabなどに登録し、
#!/usr/bin/perl
use Net::LDAP;
$ldap = Net::LDAP->new ("localhost");
$rs = $ldap->search (base => "dc=example,dc=com",
filter => "(&(homeDirectory=*)(sshPublicKey=*))");
@entries = $rs->entries;
foreach $entr ( @entries ) {
$pubkey = $entr->get_value("sshPublicKey");
$home = $entr->get_value("homeDirectory");
$keyfile = "$home/.ssh/authorized_keys2";
if ( -f $keyfile ) {
print "updating $keyfile\n";
open(OUT, ">$keyfile");
print OUT "$pubkey\n";
close(OUT);
}
}
まとめ
今回のポイントは以下の通りです。
- OpenSSHにLDAP認証用のパッチを当てる必要がある
- 公開鍵用の情報は標準スキーマに登録されていないため独自で定義する
サーバ数が1台や2台など小規模な環境の場合、
スキーマの追加方法などもわかりましたので、