CentOS の OpenSSH で chroot を設定する

Posted on

SSH が使えるサーバで SFTP だけ許可しつつ、参照できるディレクトリを制限する chroot を設定してみます。

scponly じゃなくて OpenSSH を使いましょう

以前は scponly というツールが主流だったようですが、OpenSSH 4.9 から chroot の機能がビルトインされていますので、わざわざ scponly を使う必要はありません。 OpenSSH のバージョンは V オプションで確認できます。

$ ssh -V
OpenSSH_6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

そもそも Red Hat 系 Linux には scponly の公式パッケージがなく、ソースからビルドしようにも最新の GCC ではコンパイルに失敗します。公式サイトもなくなっているので、もうメンテナンスされていないと思います。

設定手順

ここでは分かりやすいように、designer ユーザーが SFTP で Apache の公開領域 (/var/www/) だけ操作できるように設定します。

まず /etc/ssh/sshd_config を変更します。 SFTP の接続を処理するサブシステムを、標準の sftp-server から sshd 内部の internal-sftp に変更します。

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

次に末尾に以下の 3 行を追加します。

Match User designer
    ChrootDirectory /var/www
    ForceCommand internal-sftp

Match User は対象ユーザー、ChrootDirectory は許可するディレクトリを指定します。

ここで注意しないといけないのは、ChrootDirectory で指定するディレクトリは root ユーザーだけが書き込みできる状態でなければなりません。所有者が一般ユーザーだったり、権限が 777 だと /var/log/secure に以下のようなエラーが吐かれます。

sshd[17779]: fatal: bad ownership or modes for chroot directory "/var/www"

問題なければ上書きして sshd をリスタートします。これで設定完了です。 SFTP クライアントから接続すると /var/www/ 配下しか操作できないはずです。また、ssh コマンドで接続すると以下のようなエラーになります。

$ ssh designer@localhost
This service allows sftp connections only.
Connection to localhost closed.

もしうまくいかない場合は secure ログを確認すると何かヒントがあるかもしれません。