2009/10/20

ssh で HostBased 認証を行うには ssh-keysign に setuid する必要がある

ssh で特定ホストからの login を、ユーザに依存せずに許可する場合には、HostBased 認証を使うと便利です。

例えば「他のマシンへ root ユーザとして ssh で login し、rsync でバックアップを取る」などの場合に利用したりします。

HostBased 認証の設定ですが、ssh プロトコルバージョン2を利用する場合、基本的には、「login される側(サーバ)」では、
  • /etc/ssh/sshd_config で HostbasedAuthentication yes に設定
  • /etc/ssh/ssh_known_hosts へクライアントホストの公開鍵を登録
  • /etc/ssh/shosts.equiv へクライアントのホスト名(またはIPAddress)を記載
と設定し、一方「login する側(クライアント)」では、「/etc/ssh/ssh_config」へ該当サーバ限定用の設定として、
EnableSSHKeysign yes
Host foo.example.com
 HostbasedAuthentication yes
 PreferredAuthentications hostbased,publickey,password
と書きます(2011/05/02: 上記EnableSSHKeysignの位置を修正しました)。

ssh プロトコルバージョン2 を使った HostBased 認証を有効にする場合、クライアント側 ssh_config の EnableSSHKeysign が1つのポイントです。この指示により、ssh コマンドが ssh-keysign コマンド経由でローカルホストキーへアクセスすることが可能になります。

ただし、ssh-keysign が適切にホストキーを読み込むためには、ssh-keysign が root へ setuid されている必要があります。ここが第2のポイントです。

少なくとも FreeBSD 6.4 ならびに 7.2 では、デフォルトでは、このコマンドは setuid されていません。すなわち、sshd/ssh 側の設定を適切に行っても、上記 FreeBSD をクライアントにした場合、デフォルトのままでは、HostBased 認証を使って login 出来ない、ということになります。

対応は簡単で、該当コマンドを setuid するだけです。
# chmod u+s /usr/libexec/ssh-keysign
# ls -l /usr/libexec/ssh-keysign 
-r-sr-xr-x  1 root  wheel  23308 Nov 26  2008 /usr/libexec/ssh-keysign
これで上記FreeBSD でも HostBased 認証で login 出来るようになります。

このあたりは、ssh(1)FILES や、ssh-keysign(8)DESCRIPTIONで丁寧に言及されているのですが、一部 Linux では ssh-keysign がデフォルトで root へ setuid されていたため、今まで気がつきませんでした。

もし FreeBSD で HostBased認証がうまくいかない、とハマった場合には、/usr/libexec/ssh-keysign の permission を確認してみてください。

0 件のコメント:

コメントを投稿