2012-08-09
_ SFTP で chroot する
とあるサーバーにファイルをコピーするのに SFTP を利用するときに,アップロード用のディレクトリ以外は見せたくなかったので,chroot できるように設定した.条件としては,アップロードするユーザーは SFTP 専用のユーザーとし,それ以外の操作はできないようにする.また,認証は公開鍵認証とする.以下,設定手順の覚え書き.
ユーザーの作成
まずは SFTP 専用のユーザーを作成し,鍵ファイルを作成する.
# useradd sftpuser # su - sftpuser $ mkdir .ssh $ chmod 700 .ssh $ ssh-keygen $ cat id_rsa.pub >> authorized_keys
SFTP の設定
sftp 時に chroot できるように OpenSSH サーバーの設定を変更する.特定のユーザーの場合において,強制的に internal-sftp を利用するよう指定し,さらに ChrootDirectory を指定することで,クライアントに対してファイルシステムのルートディレクトリを変更することができる.
# sshd_config Match User sftpuser ForceCommand internal-sftp ChrootDirectory /opt/sftpuser
ここでは Match ブロックの条件を User とし,特定のディレクトリに対して chroot したが,Group や Host などでも条件を指定できるので,状況に応じて使い分けできる.ChrootDirectory についても %u でユーザー名の指定もできる.
ワーキングディレクトリの作成
chroot の上位ディレクトリはすべて root が所有していなければならず,他のユーザーやグループが書き込みできるようになっていない必要がある.
# mkdir /opt/sftpuser # chown root.root /opt/sftpuser # chmod 755 /opt/sftpuser
書き込み用のディレクトリの作成
ワーキングディレクトリは SFTP ユーザーは書き込み権限をもたないため,書き込み可能なディレクトリを作成する.
# mkdir /opt/sftpuser/files # chown sftpuser.sftpuser /opt/sftpuser/files # chmod 755 /opt/sftpuser/files
これで当初の目的のとおりの環境を作成することができた.実際に WinSCP など SFTP に対応したクライアントでアクセスすると,chroot 先の上位ディレクトリには移動できず,書き込み可能なディレクトリにのみファイルをアップロードできた.
上記は以下のサイトを参考にしました.