元のファイルのコンテキストは/run/unicorn.sock
tcontext=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
。