CentOS サーバ(CentOS 6.5 + OpenSSH 5.3p1 という環境)で、特定ユーザの SFTP 接続を chroot させるための設定のメモ。
今回、FTP サーバを立ち上げていないサーバに、外注の Web デザイナーさんにデータのアップロードをしてもらうことになった。そのためだけに FTP サーバをセットアップするのもなあ・・・ということで、SFTP で接続してもらうことにした。となると、SFTP 接続してきた特定のユーザだけ chroot するよう設定が必要だよね。
つまり、そのユーザは自分がデータをアップロードするディレクトリから、他の上位ディレクトリには移動できなくする・・・というわけね。
もちろん当社に協力していただいているデザイナーさんに、よそのディレクトリに移動して大事なデータを盗み見たりするような人はいませんが、念の為にね(笑)
1.データアップロード用のディレクトリ作成(root で)
(例)mkdir -p /var/hosts/www.exsample.jp ※ /var/hosts/www.exsample.jp の所有者は root であること!
2.chroot するユーザの作成
(例)useradd -g 7000 -s /sbin/nologin -u 7001 -d /var/hosts/www.exsample.jp webusr01
※パスワードも忘れずに!
3.chroot 先のディレクトリに、webusr01 で触れる子ディレクトリを作っておく。
(上の例では、/var/hosts/www.exsample.jp 自体は root ユーザのものなので、webusr01 ではファイルを書き込んだりできない)
(例)
mkdir /var/hosts/www.exsample.jp/www
chown webusr01 /var/hosts/www.exsample.jp/www
3.sshd の設定変更
上の例の webusr01 のように、頭に web と付くユーザだけ chroot することにする
/etc/ssh/sshd_config の一番下に、以下の設定を追加。
# override default of no subsystems
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User web*
ChrootDirectory ~
※最初に書かれていた Subsystem の行はコメントにする。
4.sshd の再起動
(例)service sshd restart
これで、頭に web とついたユーザは chroot されるようになる。
ちなみに、色々ググりながら設定したんだけど、ForceCommand で実行プログラムを指定すれば Subsystem の設定を上書くので、Subsystems の設定行を直接変更することはないでぇ!つまり、
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
Match User web*
ChrootDirectory ~
ForceCommand internal-sftp
こういう設定でいけるはずやでぇ!と書かれているサイトがあったんだけど、うちの環境では、
error: subsystem: cannot stat /usr/libexec/openssh/sftp-server: No such file or directory
subsystem request for sftp failed, subsystem not found
というエラーになったで。(ForceCommand はちゃんと書いてたけど)
chroot 先には /usr/libexec/openssh/sftp-server は無いから当然 "No such file or directory" になるわけで。
結局、手順例に書いたように、
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
としなきゃダメだったな。うーん・・・
あ、もしかして、webusr01 のログインシェルに /sbin/nologin を設定してるから???
まあ、とりあえず望んでた動きにはなっているのでこのまま行くけど・・・