特定のユーザのみSFTPでchrootする
はじめに
webサイトのドキュメントルートをLinuxユーザのホームディレクトリ配下のディレクトリにして
運用しているサイトは結構あると思います。
しかしそのドキュメントルート配下の特定のディレクトリのみ
他のユーザも編集したいなんてことがあります。
そのような条件の場合にOpenSSHのchroot機能を使って
特定のユーザのみSFTPでchrootする方法を紹介します。
※OpenSSHのchroot機能はOpenSSH4.2.9以降から使用できるようになっています。
http://www.openssh.com/txt/release-4.9
要件
簡単に要件を箇条書きに書いていきます。
・既存ユーザ
websiteuser
・既存ユーザのホームディレクトリ
/home/www/websiteuser
・ドキュメントルート
/home/www/websiteuser/htdocs/
・SFTPユーザでchrootさせたいユーザ
sftpuser
・SFTPユーザでchrootしたいディレクトリ
/home/www/websiteuser/htdocs/website-sftp/
既存ユーザ(websiteuser)でも、SFTPユーザ(sftpruser)でも編集可能にする
ただし、opensshでchrootを使用する場合下記条件があります。
chrootするディレクトリは所有者をroot:root、パーミッションを755にする
この条件のためドキュメントルート以下のディレクトリをchrootすることを難しくしていますが
回避策として、シンボリックリンクで対応します。
設定方法
SFTPユーザを作成する
$ sudo useradd sftpruser $ sudo passwd sftpuser
プライマリグループは既存ユーザのグループにする
もしくはドキュメントルートのディレクトリやファイルのグループと同じグループにしましょう。
$ sudo usermod -g websiteuser sftpuser
chroot用のディレクトリ作成(既存ユーザ、SFTPユーザがともに書き込めるディレクトリ)
$ sudo mkdir -p /home/chroot-sftpuser/website-sftp
所有者、グループ、パーミッション変更
対象のディレクトリはsftpユーザ、既存ユーザともに書き込めるようにします。
$ sudo chown sftpuser:websiteuser /home/chroot-sftpuser/website-sftp $ sudo chmod 775 /home/chroot-sftpuser/website-sftp
シンボリックリンクをはる
$ sudo ln -s /home/chroot-sftpuser/website-sftp /home/www/websiteuser/htdocs/
sshd_configを修正する
$ sudo vi /etc/ssh/sshd_config # override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-server #コメントアウトします。 Subsystem sftp internal-sftp Match User sftpuser ChrootDirectory /home/chroot-sftpuser ForceCommand internal-sftp -u 002 Match User websiteuser ForceCommand internal-sftp -u 002
umaskの設定もできるようです。
sshdの再起動
$ sudo service sshd restart
確認
SFTPクライアントを使用して確認してみましょう。
既存ユーザで問題なく作業できるか
ディレクトリ作成
dir1
ファイル作成
file1
SFTPユーザで問題なく作業できるか、chrootの設定になっているか
ディレクトリ作成
dir2
ファイル作成
file2
問題なさそうですね。
まとめ
環境によってはシンボリックリンクを貼るのでapacheの設定でOptions FollowSymLinksの追加設定は必要かもしれません。
またディレクトリ構造などの条件によっては要件を満たさないこともあるかもしれませんが
OpenSSHのchroot機能をつかって特定ユーザのみSFTPでchrootする方法をご紹介しました。