Debian
OpenSSH

OpenSSH 6.2を使って公開鍵認証もLDAPで行いたい。

More than 5 years have passed since last update.

公開鍵認証も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に公開鍵として渡すことができる。設定は次の様な感じ。


/etc/ssh/sshd_config

AuthorizedKeysCommand /usr/lib/ssh-command/find_key.sh

AuthorizedKeysCommandUser root

AuthorizedKeysCommandに指定するコマンドのパスには制限があり、root以外が書き込み権限のあるディレクトリなどに置かれているとエラーになる。


LDAPから公開鍵を取得する

AuthorizedKeysCommandを使ってLDAPサーバから鍵を取得する簡単なシェルスクリプトを書いた。sedだけでがんばろうとしたけどあきらめてRubyを使った。LDAPのパスワードはlibnss-ldap.secretに書いているものを使っている。


/usr/lib/ssh-command/find_key.sh

#!/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だったり外部サービスだったりいろんなものをバックエンドに使えると思う。