Oracle Linux, nginxにおける403 Forbiddenの対処(SELinux)

nginxが403 Forbiddenを返す場合,一般には,パーミッションが原因なことが多いが,環境によってはSELinuxが原因のこともある様子。 SELinuxが有効(Enforcing)だと,パーミッションは問題なくてもファイルへアクセスが遮断されることがある。

実際Oracle LinuxではSELinuxが有効になっていて,外部から展開したhtmlなどが403になるという現象が起きる。

SELinuxが原因の場合の対処は,ググってもあまり情報がなく,または安易にSELinuxを無効にされていることが多いようだったので,残しておく。

原因の切り分け方

getenforceと打ってEnforcingと返ってくればSELinuxは有効になっている。 コマンドが見つからなければSELinuxは有効ではないかも。(他の原因の可能性が高い)

$ getenforce
Enforcing

一時的に,SELinuxを緩和するには,以下で動作モードをPermissiveに切り替えれば良い。

$ sudo setenforce Permissive

これで解決したならSELinuxが原因だといえる。

これでも問題は解決するが,Permissiveは許可しない動作もログを残して実行するので,セキュリティレベルは落ちる。 ちゃんと対処することが必要。

設定状況の確認:SELinuxコンテクストの確認

SELinuxがEnforcingのときは,事前に許可した動作以外を禁止される。 SELinuxで許可されているかどうかはSELinux コンテキストを確認すればなんとなくわかる。 確認は以下でできる。

$ ls -Z
-rw-r--r--. root root unconfined_u:object_r:usr_t:s0   403.html
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

この場合,index.htmlにはアクセスできるが,403.htmlは403になる。

対処の仕方:SELinuxコンテクストの修正

一般的なディレクトリに入れておけばrestoreconで良しなにやってくれる。

$ sudo restorecon -RF /var/www/html

これでnginxの403の問題は解決するはず。

余談

ちなみに,nginxでのアクセスの場合は,user_tの部分がhttpd_sys_content_tになっていればよかった。

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 ok.html
-rw-r--r--. root root unconfined_u:object_r:var_t:s0   403.html

ok.htmlはアクセスできたが,403.htmlはアクセスできなかった(403が返ってきた)。