CentOS Stream 9 にhttpd2.4.51 で1ユーザー1ドメイン権限を実現する

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

CentOS Stream 9 にインストールしたhttpdを1ドメイン1ユーザー方式にしたいと思います。

ん?1ユーザー1ドメイン?なんのこっちゃ?
ってなりますか?

1ユーザーとは、Linuxのユーザーです。
1ドメインとは、httpdに設定するサイトです。

ん-ーと、なので、httpdにはVertialHost機能を使って複数サイトを配置していくのですが、標準の apache ユーザーをそのまま使っていたのでは、サイトAとサイトBで同じ実行権限では色々困りますよね、ってことです。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2022-03-28
サーバ さくらのVPS 2G
OS CentOS Stream 9
cat /etc/redhat-release
CentOS Stream release 9

確認

/usr/sbin/suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=1000
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_SYSLOG
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=1000
 -D AP_USERDIR_SUFFIX="public_html"

ディレクトリを作る

先に確認した DOC_ROOT より下層でないとなので、次のようにディレクトリを作成しておきます。

mkdir /var/www/users
chmod 0711 /var/www/users
chown apache:apache /var/www/users

FastCGI(mod_fcgid)

FastCGIは、httpdからPHPをCGIモードで実行できるようにします。

CGIモードの何が嬉しいかと言うと、PHPの実行ユーザーを変えれるようになることです。

dnf install mod_fcgid

インストールが完了したら設定を変えておきます。

vi /etc/httpd/conf.d/fcgid.conf

下記を末尾に追記しつつ数字を調整します。

FcgidIdleTimeout 600
FcgidProcessLifeTime 600
FcgidMaxProcesses 50
FcgidMaxProcessesPerClass 8
FcgidMinProcessesPerClass 0
FcgidConnectTimeout 600
FcgidIOTimeout 600
FcgidIdleScanInterval 10
FcgidMaxRequestLen 1610612736

FcgidMaxRequestLen は、PHPの post_max_size や upload_max_filesize にも関わってくるので、だいたい同じ数字にしていたら良いです。

注意

PHP を dnf | yum で入れている場合は、 モジュール版PHPを止めないとCGIにならないです。

# 確認
ls -li /etc/httpd/conf.d

# リネームして無効化
mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.stop

# 勝手に作られないように空ファイルを置いておく
touch /etc/httpd/conf.d/php.conf

# 確認
ls -li /etc/httpd/conf.d

ユーザー・ドメイン作成スクリプト

ここで配布するスクリプトは完全自己責任でご利用ください。
ダウンロードして利用することで発生するいかなる問題も責任を負いません。

スクリプトのダウンロード

スクリプトの中身を読んで書いている内容が理解できない方の利用はご遠慮ください。

https://aulta.co.jp/data/user_add-20220329.zip

▲よりダウンロードできます。

ダウンロードしたら解凍して /root 直下に配置します。

ls -la /root/user_add/
chown -R root:root /root/user_add
chmod 0700 /root/user_add
chmod 0600 /root/user_add/*
chmod 0700 /root/user_add/*.sh
ls -la /root/user_add/

次のようにパーミッションも変更します。
sh が 0700 、その他は 0600 です。

ユーザー・ドメインを追加する

# 移動
cd /root/user_add/

# インストールしているPHPのバージョンを確認する
ls -la /usr/local/lib

# 設定を変更する
vi ./config.sh

最低限変更が必要なのは次の3つです。

# 設定:追加するユーザー
USER_NAME=example_com

# 設定:登録するドメイン
DOMAIN_NAME=sample.example.com

# 設定:PHPのバージョン
# ls -la /usr/local/lib
PHP_VERSION=8.0.11

設定を変更したら実行します。

# 実行
./execute.sh
上記の内容でユーザーを作成します。よろしいですか? [yes/no]

こちらのように出ますので、「yes」と打って Enter で作成が始まります。

バーチャルホストの設定

次のようにして作成した conf の場所を確認できます。

httpd -S

たぶん作成したファイルが原因でエラーが出ているかもしれません。

AH00526: Syntax error on line 65 of /etc/httpd/conf.d/vhosts/sample.example.com.conf:
SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty

SSL証明書がおかしいエラーですね。そもそも証明書をまだ設定していないのでそうなります。

ちなみにこの時点では、httpd は restart もしていませんので、作成した conf は反映されていない状態です。

vi /etc/httpd/conf.d/vhosts/sample.example.com.conf

このファイルには、 sample.example.com の1ドメイン分だけを記述します。
だいたい埋まってますので、足らずの細かい調整を行ってください。

ユーザーの設定

設定したユーザーは作成されていますので次のようにして確認できます。

ls -la /home

SFTPできるようにすると便利です。
authorized_keys に公開鍵を設定するだけです。

vi /home/作成したユーザー/.ssh/authorized_keys

httpdの再起動で反映する

# エラーが出ていないことを確認して
httpd -S

# 再起動する
systemctl restart httpd.service