原始文件上下文为/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
。