RHEL8 上で nginx の "13: Permission Denied" エラーを SELinux 設定で解決する方法

RHEL8 上で nginx の "13: Permission Denied" エラーを SELinux 設定で解決する方法

岩佐 孝浩
岩佐 孝浩
3 min read
nginx SELinux

はじめに

EC2 の RHEL8 インスタンスで nginx を設定し、1080 などの標準外ポートにトラフィックをルーティングしようとすると、13: Permission denied エラーが発生する場合があります。この問題は、多くの場合 SELinux に起因します。

問題の概要

nginx.conf ファイルにプロキシ設定を追加した後、nginx を起動しようとすると、以下のエラーが発生しました。

systemd[1]: Starting The nginx HTTP and reverse proxy server...
nginx[1626]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx[1626]: nginx: [emerg] bind() to 0.0.0.0:1080 failed (13: Permission denied)
nginx[1626]: nginx: configuration file /etc/nginx/nginx.conf test failed
systemd[1]: nginx.service: Control process exited, code=exited status=1
systemd[1]: nginx.service: Failed with result 'exit-code'.
systemd[1]: Failed to start The nginx HTTP and reverse proxy server.

このエラーは、SELinux が nginx に標準外ポートのバインドを許可していない場合に発生します。

nginx.conf における設定変更

以下は、nginx.conf ファイルに加えた変更内容です。

--- nginx.conf.old      2021-08-27 23:04:42.527667800 +0900
+++ nginx.conf  2021-08-28 01:20:38.088408400 +0900
@@ -45,6 +45,12 @@
         include /etc/nginx/default.d/*.conf;

         location / {
+            proxy_set_header Host                   $host;
+            proxy_set_header X-Real-IP              $remote_addr;
+            proxy_set_header X-Forwarded-Host       $host;
+            proxy_set_header X-Forwarded-Server     $host;
+            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
+            proxy_pass http://xxx.xxx.xxx.xxx:1080;
         }

         error_page 404 /404.html;

解決方法

この問題を解決するには、SELinux ポリシーを更新して nginx がカスタムポート 1080 を使用できるようにする必要があります。以下のコマンドを実行してください。

sudo semanage port -a -t http_port_t -p tcp 1080

semanage コマンドが見つからない場合のトラブルシューティング

sudo: semanage: command not found というエラーが表示された場合は、以下のコマンドで必要なパッケージをインストールしてください。

sudo dnf provides /usr/sbin/semanage
sudo dnf install policycoreutils-python-utils

インストールが完了したら、再度 semanage コマンドを試してください。

まとめ

nginx の “13: Permission denied” エラーは、SELinux を利用している場合によく発生する問題です。SELinux ポリシーを適切に設定することで、標準外ポートへのバインドを安全に許可し、システムのセキュリティを損なうことなく問題を解決できます。SELinux を無効化するかどうかはユースケースによって異なりますが、ほとんどのシナリオでは SELinux ポリシーを調整する 方法が最適です。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023