
Dado: nova caixa Archlinux VPS na DigitalOcean. Criei um usuário, 'app', e há um arquivo /home/app/webapp.sock
criado 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/run
e quando ele for criado, verifique a qual usuário e grupo ele pertence. Para o seu caso, o usuário deve ser 'app'