特定のユーザのみSFTPでchrootする

アイキャッチ AWS EC2

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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

skitch

SFTPユーザで問題なく作業できるか、chrootの設定になっているか

ディレクトリ作成

dir2

ファイル作成

file2

skitch

問題なさそうですね。

まとめ

環境によってはシンボリックリンクを貼るのでapacheの設定でOptions FollowSymLinksの追加設定は必要かもしれません。
またディレクトリ構造などの条件によっては要件を満たさないこともあるかもしれませんが
OpenSSHのchroot機能をつかって特定ユーザのみSFTPでchrootする方法をご紹介しました。