![如何自动将 .sock 文件的目标上下文设置为 **httpd_var_run_t** 以便 nginx 可以连接到套接字并对其进行写入?](https://linux22.com/image/230177/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E5%B0%86%20.sock%20%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%AE%E6%A0%87%E4%B8%8A%E4%B8%8B%E6%96%87%E8%AE%BE%E7%BD%AE%E4%B8%BA%20**httpd_var_run_t**%20%E4%BB%A5%E4%BE%BF%20nginx%20%E5%8F%AF%E4%BB%A5%E8%BF%9E%E6%8E%A5%E5%88%B0%E5%A5%97%E6%8E%A5%E5%AD%97%E5%B9%B6%E5%AF%B9%E5%85%B6%E8%BF%9B%E8%A1%8C%E5%86%99%E5%85%A5%EF%BC%9F.png)
原始文件上下文为/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
。