Linux 上の Web サーバを作り、VirtualHost の DocumentRoot 毎にユーザを chroot させる… という設定を行ってみます。
仕様
- サーバ自体は CentOS7 + Apache 2.4 系で構築します。
- SFTP ユーザは SFTP のみ可能(SSH 不可)とします。
- 各々のユーザが chroot するディレクトリは以下とします。
site1 のユーザ
ユーザ名 | ディレクトリ |
---|---|
site1-user1 | /var/www/site1/htdocs/ |
site1-user2 | /var/www/site1/htdocs/ |
site2 のユーザ
ユーザ名 | ディレクトリ |
---|---|
site2-user1 | /var/www/site2/htdocs/ |
site2-user2 | /var/www/site2/htdocs/ |
Apache のインストール
Apache をインストールします。
yum -y install httpd
ユーザを作成する
ユーザを作成します。ログインシェルには /sbin/nologin を指定し、SSH アクセス出来ないようにします。また、後の手順で作成する Web サーバの DocumentRoot は複数のユーザが書き込み&実行出来るように apache グループとしました。
useradd site1-user1 -g apache -s /sbin/nologin
useradd site1-user2 -g apache -s /sbin/nologin
useradd site2-user1 -g apache -s /sbin/nologin
useradd site2-user2 -g apache -s /sbin/nologin
ユーザ毎にパスワードを設定しておきます。場合によっては公開鍵方式を用います(今回は手軽に検証する為、パスワード認証方式にしました)。
passwd site1-user1
passwd site1-user2
passwd site2-user1
passwd site2-user2
VirtualHost 毎の DocumentRoot を作成する
VirtualHost 毎の DocumentRoot を作成します。ディレクトリ毎の所有者は以下とします。
ディレクトリ | ユーザ | グループ |
---|---|---|
/var/www/site1 | root | root |
/var/www/site1/htdocs | apache | apache |
/var/www/site2 | root | root |
/var/www/site2/htdocs | apache | apache |
SFTP で chroot するディレクトリはユーザ/グループともに「root」にしておく必要があるようです。但し、配下のディレクトリはその限りではありませんので上記のようなオーナー設計にしています。
mkdir -p /var/www/site1/htdocs
mkdir -p /var/www/site2/htdocs
chown -R apache:apache /var/www/site1/htdocs
chown -R apache:apache /var/www/site2/htdocs
chmod g+sw /var/www/site1/htdocs
chmod g+sw /var/www/site2/htdocs
SFTP を設定する
/etc/ssh/sshd_config を以下のように修正します。
変更前
以下の箇所を探します。
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
変更後
下記のように書き換えます。同一プロジェクトの別ユーザが下記込みを行えるように、ファイル/ディレクトリ作成時のパーミッションを 775(umask 002)に設定しています。また、chroot は以下のように設定しています。
- site1 で始まるユーザは chroot 先を /var/www/site1 とする
- site2 で始まるユーザは chroot 先を /var/www/site2 とする
具体的には以下のように修正しました。
# override default of no subsystems
Subsystem sftp internal-sftp -u 002
Match User site1*
ChrootDirectory /var/www/site1
Match User site2*
ChrootDirectory /var/www/site2
Apache に VirtualHost 設定を追加する
/etc/httpd/conf.d/vhosts.conf を以下の内容で新規作成し、VirtualHost 設定を追加します。
<VirtualHost *:80>
ServerName site1.example.local
DocumentRoot /var/www/site1/htdocs
ErrorLog logs/site1-error_log
CustomLog logs/site1-access_log combined
</VirtualHost>
<VirtualHost *:80>
ServerName site2.example.local
DocumentRoot /var/www/site2/htdocs
ErrorLog logs/site2-error_log
CustomLog logs/site2-access_log combined
</VirtualHost>
デーモンの起動
sshd を再起動し、設定修正を反映します。また、Apache を起動&自動起動設定しておきます。
systemctl restart sshd.service
systemctl start httpd.service
systemctl enable httpd.service
これで設定完了です。
コメント