Nginx não pode acessar o arquivo .sock upstream e a pasta pública

Nginx não pode acessar o arquivo .sock upstream e a pasta pública

Dado: nova caixa Archlinux VPS na DigitalOcean. Criei um usuário, 'app', e há um arquivo /home/app/webapp.sockcriado pelo binário iniciado pelo systemd:

[Unit]
Description=Web application server
After=network.target

[Service]
Type=forking
User=app
PIDFile=/home/app/webapp.pid
ExecStart=/home/app/.gem/ruby/2.0.0/bin/thin -d --user app -e production --chdir /home/app/app --socket /home/app/webapp.sock --pid /home/app/webapp.pid --log /home/app/log/webapp.log start
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target

Não quero executar este aplicativo como usuário http, pois em algum momento posso decidir executar outro servidor web naquela máquina com um usuário diferente, expondo apenas seu arquivo .sock ao usuário http. Sabe-se que o Rails tem falhas de segurança, então eu gostaria de evitar que o usuário do 'aplicativo' saia de sua pasta pessoal e de seus próprios dados.

Eu tenho um usuário sudo, 'sudoer', e não há como ler nem mesmo um arquivo pid:

[sudoer@host ~]$ cat /home/app/webapp.pid
cat: /home/app/webapp.pid: Permission denied
[sudoer@host ~]$ sudo su - app
[app@host ~]$ ls -l webapp.pid
-rw-r--r-- 1 app app 5 Dec  7 19:33 webapp.pid

Tem direitos 'r' para 'outros', por que é que 'sudoer' não pode 'gatá-lo'?

Presumo que esse também seja o motivo dos seguintes erros do nginx. Arquivo estático:

2013/12/07 18:58:05 [error] 18114#0: *2 open() "/home/app/app/public/favicon.ico" failed (13: Permission denied), client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", host: "host.com"

Conteúdo dinâmico:

2013/12/07 20:49:00 [crit] 21581#0: *1 connect() to unix:/home/app/webapp.sock failed (13: Permission denied) while connecting to upstream, client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/app/webapp.sock:/favicon.ico", host: "host.com"

Trecho da configuração do nginx:

upstream webapp {
  server unix:/home/app/webapp.sock fail_timeout=0;
}
server {
  listen 80;
  root /home/app/app/public;

Isso é segurança reforçada? SELinux? Grupos CG? O que estou fazendo de errado?

Responder1

Você deve verificar a permissão, não apenas do soquete (arquivo), mas de todos os diretórios pais. Sequalquerdeles negarem acesso, sua solicitação falhará.

Por exemplo:

# ls -ld /home/app
drwx------. 8 root root 4096 Dec 7 21:33 /home/app

Responder2

Coloque seu arquivo sock /var/rune quando ele for criado, verifique a qual usuário e grupo ele pertence. Para o seu caso, o usuário deve ser 'app'

informação relacionada