nginx가 소켓에 연결하고 쓸 수 있도록 .sock 파일의 대상 컨텍스트를 **httpd_var_run_t**로 자동 설정하려면 어떻게 해야 합니까?

nginx가 소켓에 연결하고 쓸 수 있도록 .sock 파일의 대상 컨텍스트를 **httpd_var_run_t**로 자동 설정하려면 어떻게 해야 합니까?

원본 파일 컨텍스트는 /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.

관련 정보