OS 起動時や DNF 更新時に所有権や権限が標準(root:root)に上書きされてリセットされてしまいます。
そのため、下記対処をしています。
1. OS 起動時:「tmpfiles.d に上書き設定を入れる。」
2. DNF 更新時:「DNF プラグインを使って、自動で chown を掛け直して元の権限に戻す。」
1. OS 起動時:「tmpfiles.d に上書き設定を入れる。」
~]# vi /etc/tmpfiles.d/httpd-webadmin.conf
# Type Path Mode User Group Age Argument z /var/www/html 0755 himari himari - -
・OS 起動時: systemd-tmpfiles がこの設定を読み込み、自動的に himari:himari で維持してくれます。
・DNF も tmpfiles の定義を参照・尊重するため、パッケージ更新時の上書きも防げることもありますが、RPM のインストールコマンドが最後に上書きする可能性もあるため、完全ではありません。
2. DNF 更新時:「DNF プラグインを使って、自動で chown を掛け直して元の権限に戻す。」
プラグインのインストール
~]# dnf install -y python3-dnf-plugin-post-transaction-actions
アクション定義ファイルの作成: /etc/dnf/plugins/post-transaction-actions.d/ 配下に設定ファイルを作成します。
~]# vi /etc/dnf/plugins/post-transaction-actions.d/httpd-fix.action
ファイル内に以下を記述して保存します。
# パッケージ名:処理タイミング:実行コマンド httpd*:any:/bin/systemd-tmpfiles --create /etc/tmpfiles.d/httpd-webadmin.conf
・httpd 全体の更新に備えるため httpd* とワイルドカード指定しています。
・DNF プラグイン側でも systemd-tmpfiles コマンドを呼ぶようにして、権限やユーザー名の定義を tmpfiles.d の 1 箇所に集約しています。
※ その他の方法:「systemd.path(監視メカニズム) を利用する。」
これだけで、OS 起動時と DNF 更新時の両方に対応できるのですが、手動コマンド・他ツールによる変更時にも瞬時に戻されます。それがあまり良くないかと思い、今回は採用しませんでした。
監視定義
~]# vi /etc/systemd/system/fix-webroot-perm.path
[Unit] Description=Watch /var/www/html for ownership and permission changes [Path] # パス自体の変更や配下の変更を監視 PathChanged=/var/www/html [Install] WantedBy=multi-user.target
実行処理
~]# vi /etc/systemd/system/fix-webroot-perm.service
[Unit] Description=Restore webadmin ownership for /var/www/html [Service] Type=oneshot ExecStart=/bin/chown himari:himari /var/www/html [Install] # OS起動時(マルチユーザーモード到達時)に自動実行させる設定 WantedBy=multi-user.target
有効化コマンド
~]# systemctl daemon-reload ~]# systemctl enable --now fix-webroot-perm.path ~]# systemctl enable --now fix-webroot-perm.service