openssh 4.9以降で正式にサポートされたchroot sshで公開鍵認証を使う場合の罠

ref.

chroot するディレクトリを /chroot の例

↑のエントリにも書いたように、以前のpatch版のchrootの場合は sshd_configには特別に記述をせずに、/etc/passwdに

hoge:x:1000:1000::/chroot/./home/hoge:/bin/bash

と書くだけだった。

これに対してopenssh 4.9 以降では、sshd_configに

Match user  hoge
  ChrootDirectory /chroot

と書いて、/etc/passwd には 設定するディレクトリ、/chroot からのパスである/home/hoge を記述する。

hoge:x:1000:1000::/home/hoge:/bin/bash

chroot ユーザで公開鍵認証するとき

ユーザの実際のホームディレクトリは /chroot/home/hoge なので、当然公開鍵は /chroot/home/hoge/.ssh/authorized_keys になる。

ところが、このhogeユーザで鍵認証しようとしたところ、sshdが探すファイルは /home/hoge/.ssh/authorized_keys だった。( /etc/passwd に /home/hoge と書いているため? )

つまり、

  1. hoge ユーザが鍵認証を要求
  2. sshd は /etc/passwdに従って /home/hoge/.ssh/authorized_keys を探す
  3. hoge は/chroot 以下にホームディレクトリがあるので、公開鍵がないため認証できない
  4. (ここから先はパスワード認証を許可している場合) hoge の パスワード認証を行う
  5. sshd は Match user hoge を設定を読んで、ChrootDirectory /chroot を適用
  6. hoge は /chroot をroot とした環境にログイン

っていう感じに。

対策

じゃあ、Match user の設定に AuthorizedKeysFile も書けばいいじゃん。

Match user  hoge
  ChrootDirectory /chroot
  AuthorizedKeysFile /chroot/homge/hoge/.ssh/authorized_keys

と思ってやってみたけど、AuthorizedKeysFile は Match 内で使えないのでダメでした。

というわけで今のところ思いつくのは

  • ln -s /chroot/home/hoge /home/hoge とsymlinkを張る
  • 公開鍵だけ /home/hoge/.ssh/authorized_keys に作っておく

のどっちかかなー。とりあえずsymlink張ってお茶を濁す感じで。