为什么 nginx 无法访问 CentOS 7 上的 puma 套接字?

Por*_*ori 8 rails permissions ruby nginx centos-7

所以我在Ruby on Rails应用程序/var/www/所拥有的nginx755权限。所述应用程序旨在通过 puma 部署。

像这样:

rvmsudo -u nginx bundle exec puma -e production -d -b unix:///var/www/my_app/tmp/sockets/my_app.socket
Run Code Online (Sandbox Code Playgroud)

套接字的权限是:

srwxrwxrwx. 1 nginx nginx 0 Nov  6 09:43 tmp/sockets/my_app.sock
Run Code Online (Sandbox Code Playgroud)

进程当然归nginx所有:

nginx     7335  0.0  8.8 536744 90388 ?        Sl   09:43   0:00 puma 2.9.2 (unix:///var/www/my_app/tmp/sockets/my_app.sock)
Run Code Online (Sandbox Code Playgroud)

我的nginx配置配置如下:

upstream my_app {
  server unix:///var/www/my_app/tmp/sockets/my_app.sock;
}

server {
  listen 80;
  server_name www.example.com example.com;
  root /var/www/my_app/public;

  location / {
    proxy_pass http://my_app;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
Run Code Online (Sandbox Code Playgroud)

所有这些和我的应用程序仍然被拒绝权限。

connect() to unix:///var/www/my_app/tmp/sockets/my_app.sock failed (13: Permission denied) while connecting to upstream,
Run Code Online (Sandbox Code Playgroud)

我也以 root 用户的身份尝试了所有这些。但它仍然不起作用。

有谁知道我做错了什么?

Por*_*ori 12

哈利路亚!这一切都被证明是一个专门与 nginx 相关的 SELinux 政策问题。经过数小时的挖掘,我通过运行发现了这样的否认:

sudo grep nginx /var/log/audit/audit.log
Run Code Online (Sandbox Code Playgroud)

消息看起来像这样:

type=AVC msg=audit(1415283617.227:1386): avc:  denied  { write } for  pid=1683 comm="nginx" name="my_app.sock" dev="tmpfs" ino=20657 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_run_t:s0 tclass=sock_file
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我找到了Axilleas 的一篇精彩文章。

要创建包含必要权限的策略,我必须安装audit2allow并运行:

grep nginx /var/log/audit/audit.log | audit2allow -M nginx
Run Code Online (Sandbox Code Playgroud)

完成后,我最终确定了政策:

semodule -i nginx.pp
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不得不运行这个过程两次才能访问我的应用程序,因为需要进一步的策略。尽管如此,这就是解决方案。

此外,还有另一篇由Sergiy Krylkov 撰写的好文章。

故事寓意:学习 SELinux。