OpenSSH を rssh で sftp 専用にする

ネットワーク上でファイルの転送を行う用途には、昔から ftp が使用されてきました。しかし ftp にはパスワードやデータのやりとりが暗号化されていないというセキュリティ上の問題があるため、最近では anonymous ftp 以外の用途では使用されなくなってきていて、その代わりとして SSH を使用する scp や sftp が使用されることがあります。

ただ、SSH は元々 Telnet の代わりにリモートシェルを扱うためのプロトコルとして作られたため、ファイル転送機能だけが必要な場合は、本来のリモートシェルの機能がセキュリティの面で問題となります*1

そこで、シェルを使用させずに scp や sftp のみ許可するために作られたのが rssh (日本語ページ)です。

rssh は制限付きシェルとして実装されており、OpenSSH を直接変更する必要がありません。また chroot も可能なので、安全にファイル転送サービスを提供することができます*2

以下は、Debian lenny 環境において sftp,scp サービスを chroot で提供する場合の設定例です。

許可するファイル転送サービスの設定

設定ファイル /etc/rssh.conf でコメントアウトされている allow* のうち、許可するサービスを有効にします。

alloscp
allosftp
#allowcvs
#allowdist
#allowsync

umask の設定

umask はデフォルトで 022 が設定されています。必要があれば設定ファイルを変更します。

umask 022

chroot の設定

chroot を行うパスを設定ファイルに記入します。

chrootpath = "/srv/rssh_root"

chroot 環境で最小限必要なバイナリやライブラリ等のコピーは、rssh に添付されている mkchroot.sh が行ってくれます。

# mkdir /srv/rssh_root
# /usr/share/doc/rssh/examples/mkchroot.sh /srv/rssh_root

chroot 環境のログが取得できるように、syslogd に追加のソケットを指定します。

# syslogd -a /srv/rssh_root/dev/log

ユーザ毎の設定

ユーザ毎に、許可するサービス・umask・chroot パスを設定することも可能です。以下は、h2onda ユーザに scp,sftp を許可し、/srv/rssh_root に chroot する設定です。詳細は man rssh.conf を参照。

user = "h2onda:022:00011:/srv/rssh_root"

ユーザの作成

ユーザを作成します。ホームディレクトリが chroot パスの配下に、シェルを rssh に設定します。以下は Debian でのユーザ追加の例なので、Red Hat 等では適宜変更してください。

# adduser --home /srv/rssh_root/home/h2onda --shell /usr/bin/rssh h2onda


これで、h2onda ユーザは chroot で隔離され、scp と sftp のみが実行可能になります。

ただ、自分が試した Debian lenny の rssh パッケージは、ログイン時に chroot を実行する rssh_chroot_helper コマンドに suid ビットが立っていなかったため、ログイン直後にセッションが切断される問題が発生しました。他の環境で発生するかどうかは分かりませんが、ご注意を。

# chmod u+s /usr/lib/rssh/rssh_chroot_helper


また、本家のページにも書かれていますが、Windows でよく使用される WinSCP は、scp 実行時に内部で別のコマンドも実行しているらしく、rssh を使用した環境では使用できないようです。sftp モードで使用するか、Filezilla を使いましょう。

*1:商用 SSH には、scp や sftp のみを使用するための機能があるようですが。

*2:そういえば、OpenSSH Chroot Patchなんてものもありましたね…。