O contexto do arquivo original /run/unicorn.sock
é tcontext=system_u:object_r:var_run_t:s0
Como faço para que o contexto do arquivo seja automaticamente system_u:object_r: httpd_var_run_t :s0 quando inicio a unidade de soquete para que o servidor nginx possa se conectar e gravar no arquivo de soquete sem ser negado pelo SELinux.
Aqui está o daemon de soquete que criei em/usr/lib/systemd/system/unicorn.socket
[Unit]
Description=unicorn socket
[Socket]
ListenStream=/run/unicorn.sock
[Install]
WantedBy=sockets.target
e o correspondente/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
Notei o arquivo de soquete do php-fpm em /run/php-fpm
Quando o systemd cria arquivos e diretórios, ele usa sua política selinux para atribuir rótulos. Isso significa que o primeiro passo é atualizar seu banco de dados de políticas selinux com informações sobre o soquete:
Dada uma unidade de soquete como esta:
E uma unidade de serviço como esta:
Isso nos leva:
Também tive que instalar o seguinte módulo de política selinux:
Para instalar o módulo (assumindo que ele esteja armazenado
nginx_unix_socket.te
):Isso deve ser tudo que você precisa. Eu tenho na minha configuração nginx:
Com isso instalado,
curl localhost
conecta-se com sucesso ao serviço gunicorn vinculado ao/run/unicorn.sock
.