nginxがソケットに接続して書き込むことができるように、.sockファイルのターゲットコンテキストを**httpd_var_run_t**に自動的に設定するにはどうすればよいですか?

nginxがソケットに接続して書き込むことができるように、.sockファイルのターゲットコンテキストを**httpd_var_run_t**に自動的に設定するにはどうすればよいですか?

元のファイルのコンテキストは/run/unicorn.socktcontext=system_u:object_r:var_run_t:s0 です。

ファイルコンテキストを自動的にsystem_u:object_rにする方法:httpd_var_run_t:s0 nginx サーバが SELinux によって拒否されず、ソケットファイルに接続して書き込みできるようにソケットデバイスを起動するとき。

これは私が作ったソケットデーモンです。/usr/lib/systemd/system/unicorn.socket

[Unit]
Description=unicorn socket

[Socket]
ListenStream=/run/unicorn.sock

[Install]
WantedBy=sockets.target

そしてそれに対応する/usr/lib/systemd/system/unicorn.service

[Unit]
Description=unicorn daemon
Requires=unicorn.socket
After=network.target

[Service]
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/product-catalog
ExecStart=/home/ec2-user/product-catalog/venv/bin/gunicorn \
          --access-logfile - \
          -k uvicorn.workers.UvicornWorker \
          --workers 3 \
          --bind unix:/run/unicorn.sock \
          app:app


[Install]
WantedBy=multi-user.target

php-fpmのソケットファイルが/run/php-fpmにあることがわかりました。

ベストアンサー1

systemdがファイルとディレクトリを作成するときは、selinuxポリシーを使用してラベルを割り当てます。つまり、最初のステップは、ソケットに関する情報を使用してselinuxポリシーデータベースを更新することです。

semanage fcontext -a -t httpd_var_run_t /var/run/unicorn.sock

次のソケットユニットが与えられた場合:

[Unit]
Description=unicorn socket

[Socket]
ListenStream=/run/unicorn.sock
SocketUser=nginx
SocketGroup=nginx
SocketMode=0660

[Install]
WantedBy=sockets.target

次のサービスユニットもあります。

[Service]
Type=exec
User=nginx
Group=nginx
WorkingDirectory=/srv/app
ExecStart=gunicorn --bind unix:/run/unicorn/unicorn.sock app:app

これにより、次のような結果が得られます。

[root@localhost system]# ls -lZ /run/unicorn.sock
srw-rw----. 1 nginx nginx system_u:object_r:httpd_var_run_t:s0 0 Mar 20 21:49 /run/unicorn.sock

また、次のselinuxポリシーモジュールをインストールする必要がありました。

module nginx_unix_socket 1.0;

require {
        type httpd_t;
        type unconfined_service_t;
        class unix_stream_socket connectto;
}

#============= httpd_t ==============
allow httpd_t unconfined_service_t:unix_stream_socket connectto;

モジュールを取り付けるには(に保存されていると仮定nginx_unix_socket.te):

checkmodule -M -m -o nginx_unix_socket.mod nginx_unix_socket.te
semodule_package -o  nginx_unix_socket.pp -m nginx_unix_socket.mod
semodule -i nginx_unix_socket.pp

これが必要なすべてです。私のnginx設定には次のものがあります。

location / {
        proxy_pass http://unix:/run/unicorn.sock;
}

完了すると、curl localhostバインドされたgunicornサービスに正常に接続されます/run/unicorn.sock

おすすめ記事