最近サーバーを組んでいて SELinux に悩まされたのでまとめておきます。気が向いた時に調べて追記しようと思います。
SELinux が動いていると疑う時
SELinux はサーバー会社等の設定により最初から無効になっていることもありますが、有効になっていると正しい設定をしなくては辛い目にあいます。
- パーミッション的には正しいのに書き込みや読み込み、実行ができない
(PHPでファイルを生成できない、WordPress のプラグインを更新できない) - 外部と通信できない
(外部のDBに接続できない、WordPress のテーマやプラグインの資金追加画面で不明なエラーが発生)
SELinux が動いているか確認
getenforce
- Disabled … 無効
- Enforcing … 有効
- Permissive … 無効だが警告が表示される
有効化と無効化
もしパーミッション関連で問題がないのに思わぬ出来事が発生しているなら、SELinux の設定によるものなのかどうか確認するために一時的に無効化することができます。
setenforce [番号]
- 0 … 一時的に無効化(Permissive)
- 1 … 一時的に有効化(Enforcing)
ただし、上記の設定は再起動するともとに戻ってしまいます。設定をずっと保存しておきたい場合は、下記のファイルを開いてSELINUX=
の部分を修正します。
sudo vim /etc/selinux/config
SELINUX=DISABLED
… 無効SELINUX=PERMISSIVE
… 無効だが警告が表示されるSELINUX=ENFORCING
… 有効
コンテキスト
SELinux はディレクトリごとに「コンテキスト」と呼ばれるラベルが設定されています。そのコンテキストを見ることで、ディレクトリがどんな制御を許可/禁止されているのかわかります。
コンテキスト確認
ls
またはls -l
のエイリアスll
の-Z
オプションでコンテキストが確認できます。-a
で隠しファイル表示すると見やすいです。
ls -Zal
書き込みできないときは httpd_sys_rw_content_t にラベルを付け替えるとか、外部通信を許可するにはsetsebool -P httpd_can_network_connect=1
にするとかありますが、自分なりにもう少し理解した上で書きたいので、続きはまたいずれ。。
各種変更
書き込み権限
WordPress など、nginx や apache からの書き込みを行う必要がある場合は httpd_sys_content_t
から変更します。
変更
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/<WordPressのディレクトリ>/wp-content(/.*)?"
wp-content
, wp-admin
, wp-includes
それぞれ設定します。
反映
sudo restorecon -R /var/www/<WordPressディレクトリ>/
反映後、ls -lZ
で変更できたか確認してください。ちなみに新規ディレクトリの作成時は、親フォルダのコンテキストに従って設定されるため特別な変更は必要ないみたいです。
http 外部通信
WordPress でプラグインの追加、テーマの追加を行う際は外部との通信を行う必要がありますが、通信禁止になっていると管理画面から各種追加が行えなくなります。
sudo setsebool -P httpd_can_network_connect=1
httpd_can_network_connect=1
にすることで通信を許可します。(p
フラグは permanent オプション)