Nginxで権限が正しいはずなのに、(13: Permission denied)がでた話
はじめに
Nginxを挟み、リバースプロキシの設定を行っている途中に、権限がないと出てしまったお話です。
下記の図の構成となっており、Nginx の権限がないという状態の解決までの道のりを記載しています。
環境
OS : AlmaLinux-9.5
アクセスを行ったら、(13: Permission denied) が出た
Nginx の エラーログを確認すると、権限が不足していると出ている。
Nginx の設定では、Proxy を行う設定しか行っていないため、フォルダの権限は関係ないと判断。
また、curl で proxy 先の React への通信は問題なくできることが、確認できているため別の問題があると切り分けを行いました。
2025/02/10 06:40:18 [crit] 294764#294764: *1 connect() to [::1]:8080 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://[::1]:8080/", host: "localhost"
2025/02/10 06:40:18 [crit] 294764#294764: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost"
別の原因を調べてみた
webページを調べてみると、SELinux が有効になっていると出るというのを見かけました。
そこで、SELinux が有効になっているかと、ログの確認を行いました。
# setstatus
SELinux status: enabled
~~~
type=AVC msg=audit(1739137218.211:97729): avc: denied { name_connect } for pid=294764 comm="nginx" dest=8080 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket permissive=0
type=SYSCALL msg=audit(1739137218.211:97729): arch=c000003e syscall=42 success=no exit=-13 a0=b a1=55efb7e94bb0 a2=1c a3=7fffcde25cfc items=0 ppid=294763 pid=294764 auid=4294967295 uid=990 gid=989 euid=990 suid=990 fsuid=990 egid=989 sgid=989 fsgid=989 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)ARCH=x86_64 SYSCALL=connect AUID="unset" UID="nginx" GID="nginx" EUID="nginx" SUID="nginx" FSUID="nginx" EGID="nginx" SGID="nginx" FSGID="nginx"
SELinux が有効になっており、audit で denied のエラーが出ていることの確認ができました。
SELinux を無効化すれば解決することもできますが、今回は有効化した状態のまま許可を接続をできるようにします。
解決方法(SELinuxのパラメータを変更する)
現状のSELinux のパラメータを全量確認する
getsebool -a
見てみると、今回の要件では Nginxからリバースプロキシ できれば良いので、https_can_network_relay
を有効にすることで解決できそうなのでパラメータを設定します。
setsebool httpd_can_network_relay on
設定できたことを確認する
getsebool -a | grep httpd_can_network_relay
httpd_can_network_relay --> on
問題なく設定できたことを確認し、再度接続を行ってみると問題なく表示することができました。
最後に
SELinux を扱ったことがなかったため、この設定を見つけるのに少し時間がかかってしました。
しかし、SELinuxにどんな設定があるのか、少し学ぶことができたのでよかったのかなと思います。
また、もっとよい方法やふさわしい設定があるようでしたら教えていただきたいです。
Discussion