公開鍵認証もLDAPで行いたい。LDAPを使うと各サーバの認証情報を一元管理できるけど、公開鍵認証を行ってる場合、公開鍵も一元管理できると便利だ。OpenSSHはLDAPに対応していないので、OpenSSH-LPKというパッチを当てて対応する必要があるんだけど、OpenSSH 6.2からはパッチを当てなくても良くなったと聞いてやってみることにした。
Wheezy-backportsからDebian WheezyにOpenSSH 6.4を入れる
Debian WheezyのOpenSSHは6.0なので、Wheezy-backportsからインストールする。
$ sudo echo "deb http://ftp.jp.debian.org/debian wheezy-backports main" >> /etc/apt/sources.list
$ sudo aptitude update
$ sudo aptitude install -t wheezy-backports openssh-server
AuthorizedKeysCommandを使う
AuthorizedKeysCommand
にコマンドを指定することで、コマンドの実行結果をOpenSSHに公開鍵として渡すことができる。設定は次の様な感じ。
AuthorizedKeysCommand /usr/lib/ssh-command/find_key.sh
AuthorizedKeysCommandUser root
AuthorizedKeysCommand
に指定するコマンドのパスには制限があり、root以外が書き込み権限のあるディレクトリなどに置かれているとエラーになる。
LDAPから公開鍵を取得する
AuthorizedKeysCommand
を使ってLDAPサーバから鍵を取得する簡単なシェルスクリプトを書いた。sedだけでがんばろうとしたけどあきらめてRubyを使った。LDAPのパスワードはlibnss-ldap.secretに書いているものを使っている。
#!/bin/bash
uri=ldap://10.0.XXX.XXX/
binddn="cn=admin,dc=harukasan,dc=jp"
bindpw=$(cat /etc/libnss-ldap.secret)
base="dc=harukasan,dc=jp"
uid=$1
ldapsearch -LLL -H ${uri} -w "${bindpw}" -D "${binddn}" -b "${base}" "(& (objectClass=posixAccount) (uid=${uid}))" "sshPublicKey" | ruby -e 'puts STDIN.read.gsub(/\n /,"").match(/sshPublicKey: (.+)/).to_a[1]'
まとめ
OpenSSH 6.2のAuthorizedKeysCommand
を使うと簡単に公開鍵を他のプロダクトから扱えて便利だ。こんなことよりもLDAPにスキーマを追加する方が大変だったんだけど、疲れたのでまた別の機会にしたい。別にLDAPに限らずRDBだったり外部サービスだったりいろんなものをバックエンドに使えると思う。