らくがきちょう

なんとなく

VirtualHost 毎に SFTP ユーザを分けた Web サーバを構築する

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

これで設定完了です。