ScpOnlyの設定方法

scponly ではなく、 OpenSSH の設定で実現します。
以前は scponly で実現をしていましたが、OpenSSH 4.9 からは chroot の機能がビルトインされているので、 scponlyをインストールする必要はありません。

設定手順

OpenSSHの設定ファイル

onlyuser という名前のユーザーが 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 onlyuser
    ChrootDirectory /var/www
    ForceCommand internal-sftp

Match User は対象ユーザー、ChrootDirectory は許可するディレクトリを指定します。
ちなみに、ここでForceCommandで internal-sftpを指定してるから、上記の標準設定はいらないんじゃない?と思ったのですが、標準設定を変えないとうまくいきませんでした。

許可ディレクトリのパーミッション

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

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

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

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