RHEL8 上で nginx の "13: Permission Denied" エラーを 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! 🚀