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 ログを確認すると何かヒントがあるかもしれません。