川崎と申します。
困った時の ML 頼みですみませんが、よろしくお願いします。長くて済みませ
ん。下の方に [知りたいこと] をまとめております。

[背景]
あるノード A に ssh でログインして、ここからさらに ssh で別のノードへ
ログインするようにしています。いわゆる踏み台サーバで、ここまでは問題な
く動作しています。(当たり前ですが)
今、ノード A を踏み台として使うだけのユーザについて、OpenSSH の
ChrootDirectory の機能を使って、ノード A のディレクトリツリーへのアク
セスを制限したいものと思って、設定を試しています。
環境は以下の通りです。
  FreeBSD 8.2-RELEASE-p1 i386
  OpenSSH_5.2p1 FreeBSD-openssh-portable-5.2.p1_3,1, OpenSSL 1.0.0d 8 Feb 2011
  (ports の security/openssh-portable から最近入れたもの)

[やったこと]
ノード A 上のユーザ user1 について、ChrootDirectory の対象にするため、
/usr/local/etc/ssh/sshd_config に以下を追加しました。

    Match User user1
      ChrootDirectory /home/user1
      AllowTcpForwarding no
      X11Forwarding no

さらに、user1 のホームディレクトリ (/home/user1) に、必要と思われるファ
イル群を準備しました。動作してから不要ファイルを消すつもりで、多めにコ
ピーしています。また、/home/user1 と /usr/home/user1 が混在しているよ
うに見えますが、シンボリックリンク (/home@ -> usr/home) で実体は同じで
す。

    # cd /home/user1
    # chown root:wheel .
    # cp -pr /bin /sbin /lib /libexec /etc /tmp .
    # mkdir usr
    # cp -pr /usr/bin /usr/sbin /usr/lib /usr/libexec usr
    # mkdir dev
    # mount -t devfs devfs /usr/home/user1/
    # mkdir -p home/user1
    # chown user1:group1 home/user1

この user1 の /usr/home/user1/etc/passwd の行は次の通りです。
    user1:*:10000:10000:User &:/home/user1:/bin/tcsh
ついでに /usr/home/user1/etc/group には group1 があります。
    group1:*:10000:
ChrootDirectory の外側では、user1 は LDAP 上にエントリがあって
/etc/passwd などにはエントリがありませんが `id user1` や `finger
user1` で情報を表示できています。
内側でも /var/run/utmp を /usr/home/var/run/utmp にコピーすれば id や
finger が正しい答えを返します。

これで、ノード A に user1 としてログインして、(/usr/home/kawasaki)/bin
の下のコマンドなどを実行することができます。(全部は試していませんが)

[困っていること]
ところが、この状態でノード A 上の user1 として、/usr/bin/ssh (もともと
FreeBSD に付いてきた方のもの。為念) を使ってさらに別のノード B へログ
インしようとすると、下記のエラーが出てうまく行きません。

  nodeA-user1-tcsh> ssh -vvv another.node.example.jp
              (中略)
  debug1: read_passphrase: can't open /dev/tty: Permission denied
  Host key verification failed.

この時に、(/usr/home/user1)/dev/tty は、たしかに user1 からは読み書き
できません。
  > ls -l /dev/tty
  crw--w----  1 root  tty    0,  93 May 19 15:58 /dev/tty

ChrootDirectory の設定を入れなければ、/dev/tty のオーナーが user1 になっ
ているので、その状態であればノード A からの ssh が成功します。

[試してみたこと]
devfs を使って /usr/home/user1/dev/tty のオーナーを user1 にしたり、
モードを 0666 にしてみたりしましたが、

  ChrootDirectory の外側から見ると指定通りのオーナーやモードになるが
  内側(user1)から見ると root:tty 0640 のままになっている。

というちょっと不思議なことになっています。

[知りたいこと]
ChrootDirectory の内側の user1 から見て、/dev/tty の読み書きができるよ
うにするためには、どうすれば良いでしょうか?
あるいは、こういう「踏み台」を作る別の方法があれば教えてください。



よろしくお願いします。

-- 
moto kawasaki <m...@kawasaki3.org>


メールによる返信