chrootsshの導入

私が自宅のサーバにchrootsshを導入した時のメモです。
9月20日頃、opensshのセキュリティホールに対応済みのchrootsshを導入しました。
最新版は、3.7p1です。(2003-09-27現在)

chrootsshとは、FTPでのchrootを、sshで使えるようにしているもので、それ単体で
通常のopensshと同様の機能とディレクトリのアクセス制限の機能を提供します。
※導入したサーバー環境はRed Hat Linux 8.0です。

0.参考サイト

今回、chrootsshを導入するにあたって、以下のサイトを参考にしました。

1) Howto : configure openssh with the chroot patch
http://mail.incredimail.com/howto/openssh/

2) FreeBSDでChroot patch for ssh
http://nadmin.org/howto/chrooted-ssh.html

1.chrootsshの取得

http://chrootssh.sourceforge.net/
からソースをダウンロードします。

参考サイトの両方とも、標準のopensshにパッチを当てるインストール方法が記述さ
れていますが、ここからダウンロードしたソースは修正済みのsshのようです。
パッチを当てる必要はないようです。

2.インストール

ダウンロードしたソースを展開してインストールします。
私はすでにrpmでopensshを導入していましたので、重複を避けるために、
/usr/local/ssh以下にインストールすることにしました。

 # tar zxvf openssh-3.6.1p1-chroot.tar.gz
 # cd openssh-3.6.1p1
 # ./configure --prefix=/usr/local/ssh
 # make
 # make install

ここまでの段階では特にエラーはでませんでした。
バイナリや設定ファイルの場所は、それぞれ指定できます。
詳しくは、INSTALLファイルを読んで下さい。

3.サービスの設定

initファイルをコピーします。

 # cp contrib/redhat/sshd.init /etc/init.d/chrootsshd

すでに導入しているsshとの重複を避けるために、ファイル名をchrootsshdとしました。
ここですぐにサービスを起動せずに、initファイルの中身を確認します。
起動ファイル内のパスとインストールしたパスが異なると起動ができないからです。

変更した場所は以下の通りです。

 #上の方にあるパスの設定部分
 #KEYGEN=/usr/bin/ssh-keygen
 KEYGEN=/usr/local/ssh/bin/ssh-keygen
 
 #SSHD=/usr/sbin/sshd
 SSHD=/usr/local/ssh/sbin/sshd
 
 #RSA1_KEY=/etc/ssh/ssh_host_key
 RSA1_KEY=/usr/local/ssh/etc/ssh_host_key
 
 #RSA_KEY=/etc/ssh/ssh_host_rsa_key
 RSA_KEY=/usr/local/ssh/etc/ssh_host_rsa_key
 
 #DSA_KEY=/etc/ssh/ssh_host_dsa_key
 DSA_KEY=/usr/local/ssh/etc/ssh_host_dsa_key
 
 #PID_FILE=/var/run/sshd.pid
 PID_FILE=/var/run/chrootsshd.pid
 # 各関数(start,stopなど)の中に
# ロックファイルのパスが記述されているところ #[ "$RETVAL" = 0 ] && touch /var/lock/subsys/sshd [ "$RETVAL" = 0 ] && touch /var/lock/subsys/chrootsshd

修正を終えたら起動してみます。

 # /etc/init.d/chrootsshd start

ここで特にエラーがでなければ起動していると思います。
起動を確認したらサービスに追加します。

 # chkconfig --add chrootsshd

これでサービスの起動は可能になっていると思いますが、
sshdの細かい設定はきちんと行う必要があります。
設定の方法は、標準のopensshと同じです。

4.chrootするユーザの設定

chrootしてディレクトリのアクセスを制限するユーザの設定を行います。
新規にユーザを作成する場合は以下のように行います。

 # mkdir /home/user1
 # useradd user1 -d /home/user1/./
 # passwd user1
 # chown user1:user1 /home/user1
 # chmod 700 /home/user1

useraddをするときに、ホームディレクトリが存在しないと追加できなかったので、
先にディレクトリを作成してからuseraddを実行しました。
そのままでは、権限などがrootのままなので、chownとchmodをしました。

これでuser1がchrootするユーザとして追加されました。
./を末尾に付けているユーザのアクセスが制限されるそうです。

次に、このままでは接続ができないので、
接続に最低限必要なファイルを、
/home/user1以下にコピーします。
実際のルートからのパスと、
/home/user1以下の構造が一致するようにした方が無難だと思います。

 # mkdir /home/user1/bin
 # cp /bin/sh /home/user1/bin/sh

私がコピーしたファイルは以下の通りです。

 /bin/bash
 /bin/chgrp
 /bin/chmod
 /bin/chown
 /bin/cp
 /bin/groups
 /bin/ls
 /bin/mkdir
 /bin/mv
 /bin/ping
 /bin/pwd
 /bin/rm
 /bin/scp
 /bin/sh
 /bin/ssh
 /etc/group
 /etc/passwd
 /lib/ld-linux.so.2
 /lib/libacl.so.1
 /lib/libattr.so.1
 /lib/libcrypt.so.1
 /lib/libcrypto.so.2
 /lib/libdl.so.2
 /lib/libnsl.so.1
 /lib/libnss_compat.so.2
 /lib/libnss_files.so.2
 /lib/libresolv.so.2
 /lib/libtermcap.so.2
 /lib/libutil.so.1
 /lib/i686/libc.so.6
 /usr/bin/groups
 /usr/bin/id
 /usr/bin/rsync
 /usr/lib/libpopt.so.0
 /usr/lib/libz.so.1
 /usr/local/libexec
 /usr/local/libexec/sftp-server

実際には必要の無いファイルがあると思いますが、
細かくテストする時間がないので、そのままにしています。
大まかな設定は以上です。
sshやWinSCPなどで接続して、きちんとアクセスが制限されていたら成功です。