zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【CentOS6】chrootでsftp専用のアカウントを追加する

【前提】

1台のWebサーバにドキュメントルートを複数作成し、それぞれ個別のお客様にご利用いただくことになった。
他のお客様のドキュメントルートが見えないようにするために、

・sftp+chroot

レンタルサーバ的な運用を行ってみる。

【方法メモ】

・sftpdグループにマッチしたら、sftpのみを許可してhome以上の階層に遷移させない(chroot)設定

chrootとは:
chrootとは、UNIXオペレーティングシステムにおいて、現在のプロセスとその子プロセス群に対してルートディレクトリを変更する操作である。 ルートディレクトリを別のディレクトリに変更されたプロセスは、その範囲外のファイルにはアクセスできなくなるため、この操作をchroot監獄などとも呼ぶ。"
chroot - Wikipedia
https://ja.wikipedia.org/wiki/Chroot

mkdir /opt/hogehoge

# hogehoge用グループの作成(apacheも所属させておく)
groupadd hogehoge
gpasswd -a apache hogehoge

# シェルへログイン不可ユーザを作成(-sオプションでログインシェルを/sbin/nologinにする)
useradd -g hogehoge -d /opt/hogehoge/ -s /sbin/nologin user-hogehoge

# 作成したユーザをapacheグループにも所属
gpasswd -a user-hogehoge apache

# ユーザにパスワードを設定
passwd user-hogehoge
Match条件とChroot先を以下の様にしてsshd_configに追記

vi /etc/ssh/sshd_config

# Subsystem sftp      /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp 

Match Group hogehoge User *hogehoge
ChrootDirectory /opt/hogehoge
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp -f AUTHPRIV -l VERBOSE -u 0002
オプションについて確認
Subsystem       sftp    internal-sftp
→SFTP の接続を処理するサブシステムを、標準の sftp-server から sshd 内部の internal-sftp に変更

X11Forwarding no		:X11転送させない(GUIを外部から使わない)
AllowTCPForwarding no	:ポートフォワーディングさせない
ForceCommand internal-sftp -f AUTHPRIV -l VERBOSE -u 0002
			-f AUTHPRIV	:syslogのfacilityを認証(AUTHPRIV)に指定する
			-l VERBOSE	:ログレベル
			-u 0002		:umask
chrootディレクトリのユーザーとグループは root:root、権限が755である必要があるので確認

ls -ld /opt/hogehoge

sftpユーザのため、chrootしたディレクトリ直下にディレクトリ(ここではdata)を配置し、sftpして編集できるようにする
cd /opt/hogehoge
chown -R apache:hogehoge data
find data -type d -exec chmod 2775 {} \;
find data -type f -exec chmod g+w {} \;


あとは上記 /opt/hogehoge/data をドキュメントルートにしてサイト構築

テスト

user-hogehogeアカウントでssh接続しようとしする
→接続できない

WinSCPなどでsftp接続した場合
→接続できるが、Chrootされていて他のディレクトリは見えない

ログについて

ファシリティはAUTHPRIVとなっている。AUTHPRIVは認証周りなので、
/etc/rsyslog.conf

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

/var/log/secure
に出力されることになる。

Apr 21 12:14:27 hogehoge sshd[1428]: opendir "/htdocs/wp-content" [postauth]
Apr 21 12:14:27 hogehoge sshd[1428]: closedir "/htdocs/wp-content" [postauth]

こんな感じ