SFTP で chroot する方法

こんにちは、masm11 です。

実はつい先日まで SFTP で chroot ができることを知りませんでした。 そこで今回は、SFTP での chroot の設定方法についてまとめてみたいと思います。

FTP, FTPS, SFTP...?

その前に、FTP にもいろいろ種類があって、混乱している方もいらっしゃるかもしれませんので、 一度ここで整理してみます。

  • FTP

    古き良き時代から存在する FTP です。当然のように、 ユーザ名やパスワードは生のままインターネットを流れます。

  • FTPS

    HTTP に HTTPS があるように、FTP にも FTPS があります。 HTTPS が TLS トンネルの中で HTTP 通信するのと同じように、 FTPS は TLS トンネルの中で FTP 通信を行います。 従って、ユーザ名やパスワードはしっかり暗号化されます。

    FTPS と SFTP で混乱してしまう方は、HTTPSFTPS も末尾が S で同類、と覚えると良いでしょう。

  • SFTP

    こちらは、SSH 接続の中で独自に FTP っぽいことをします。 FTP, FTPS とはかなり毛色が異なります。

    SSH 接続を使うので、認証にはパスワードでなく公開鍵認証を使う ことができます。もちろん暗号化はバッチリです。

chroot する意義

FTP, FTPS, SFTP は、ログインしてしまえば、そのサーバにあるファイルは、 どのファイルであろうとアクセスし放題です。しかし、これではセキュリティ的に 問題がある場合があります。そういう場合、特定のディレクトリ以下のみにアクセスを 限定したくなります。

そんな時に便利なのが chroot 機能です。この機能を使うと、 ユーザは、サーバが指定したディレクトリより上の階層にはアクセスできなくなります。

SFTP で chroot の設定をする

  1. ~/.ssh/authorized_keys に SSH 公開鍵を追加する

    chroot とは関係ありませんが、パスワードなしでログインできるようにします。

  2. /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
    

  3. /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 できることを知ったので、これからはこの方法で気軽に設定していきたいと思います!