如何自动将 .sock 文件的目标上下文设置为 **httpd_var_run_t** 以便 nginx 可以连接到套接字并对其进行写入?

如何自动将 .sock 文件的目标上下文设置为 **httpd_var_run_t** 以便 nginx 可以连接到套接字并对其进行写入?

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

相关内容