こんにちは、masm11 です。
実はつい先日まで SFTP で chroot ができることを知りませんでした。 そこで今回は、SFTP での chroot の設定方法についてまとめてみたいと思います。
FTP, FTPS, SFTP...?
その前に、FTP にもいろいろ種類があって、混乱している方もいらっしゃるかもしれませんので、 一度ここで整理してみます。
FTP
古き良き時代から存在する FTP です。当然のように、 ユーザ名やパスワードは生のままインターネットを流れます。
FTPS
HTTP に HTTPS があるように、FTP にも FTPS があります。 HTTPS が TLS トンネルの中で HTTP 通信するのと同じように、 FTPS は TLS トンネルの中で FTP 通信を行います。 従って、ユーザ名やパスワードはしっかり暗号化されます。
FTPS と SFTP で混乱してしまう方は、
HTTPS
もFTPS
も末尾がS
で同類、と覚えると良いでしょう。SFTP
こちらは、SSH 接続の中で独自に FTP っぽいことをします。 FTP, FTPS とはかなり毛色が異なります。
SSH 接続を使うので、認証にはパスワードでなく公開鍵認証を使う ことができます。もちろん暗号化はバッチリです。
chroot する意義
FTP, FTPS, SFTP は、ログインしてしまえば、そのサーバにあるファイルは、 どのファイルであろうとアクセスし放題です。しかし、これではセキュリティ的に 問題がある場合があります。そういう場合、特定のディレクトリ以下のみにアクセスを 限定したくなります。
そんな時に便利なのが chroot 機能です。この機能を使うと、 ユーザは、サーバが指定したディレクトリより上の階層にはアクセスできなくなります。
SFTP で chroot の設定をする
~/.ssh/authorized_keys
に SSH 公開鍵を追加するchroot とは関係ありませんが、パスワードなしでログインできるようにします。
/etc/ssh/sshd_config
に以下を追記するMatch User someone ChrootDirectory /var/www/somedir ForceCommand internal-sftp -u 002
someone
は SFTP を使うユーザ、/var/www/somedir
が chroot 先です。-u 002
は umask の設定です。umask については、今回は説明を省略します。設定を変更したら sshd を再起動します。
sudo systemctl restart sshd
/var/www/somedir
のパーミッションを修正するsudo chown root:root /var/www/somedir sudo chmod 755 /var/www/somedir
chroot 先は
root:root
で 755 でなければならない仕様だそうです。
確認
以上で、sftp すると chroot しているはずです。
$ sftp サーバ名 Connected to サーバ名. sftp> pwd Remote working directory: / sftp> ls (省略)
もし、接続した直後に切断されてしまう場合は、何か設定が間違っています。サーバで、
sudo journalctl -f
を実行した状態でもう一度接続してみると、何かメッセージが出力されるかもしれませんので、確認してみてください。
まとめ
つい先日まで、SFTP で chroot できることを知らず、FTP は嫌だし FTPS は面倒いなー、と思っていました。 今回、SFTP で chroot できることを知ったので、これからはこの方法で気軽に設定していきたいと思います!