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/wwwchown webusr01 /var/hosts/www.exsample.jp/www3.sshd の設定変更上の例の webusr01 のように、頭に web と付くユーザだけ chroot することにする/etc/ssh/sshd_config の一番下に、以下の設定を追加。# override default of no subsystems#Subsystem sftp /usr/libexec/openssh/sftp-serverSubsystem sftp internal-sftpMatch User web*ChrootDirectory ~※最初に書かれていた Subsystem の行はコメントにする。4.sshd の再起動(例)service sshd restart
これで、頭に web とついたユーザは chroot されるようになる。
ちなみに、色々ググりながら設定したんだけど、ForceCommand で実行プログラムを指定すれば Subsystem の設定を上書くので、Subsystems の設定行を直接変更することはないでぇ!つまり、
# override default of no subsystemsSubsystem sftp /usr/libexec/openssh/sftp-serverMatch User web*ChrootDirectory ~ForceCommand internal-sftp
こういう設定でいけるはずやでぇ!と書かれているサイトがあったんだけど、うちの環境では、
error: subsystem: cannot stat /usr/libexec/openssh/sftp-server: No such file or directorysubsystem 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-serverSubsystem sftp internal-sftp
としなきゃダメだったな。うーん・・・
あ、もしかして、webusr01 のログインシェルに /sbin/nologin を設定してるから???
まあ、とりあえず望んでた動きにはなっているのでこのまま行くけど・・・
コメントする