
Dado: caja VPS Archlinux nueva en DigitalOcean. Creé un usuario, 'aplicación', y hay un archivo /home/app/webapp.sock
creado por el binario iniciado por 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
No quiero ejecutar esta aplicación como usuario http, ya que en algún momento puedo decidir ejecutar otro servidor web en esa máquina con un usuario diferente, exponiendo solo su archivo .sock al usuario http. Se sabe que Rails tiene fallas de seguridad, por lo que me gustaría evitar que el usuario de la 'aplicación' acceda a su carpeta de inicio y a sus propios datos.
Tengo un usuario sudo, 'sudoer', y no hay forma de leer ni siquiera un archivo 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
Tiene derechos 'r' para 'otros', ¿por qué ese 'sudoer' no puede 'catarlo'?
Supongo que esta también es la razón de los siguientes errores de nginx. Archivo 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"
Contenido 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"
Extracto de la configuración de nginx:
upstream webapp {
server unix:/home/app/webapp.sock fail_timeout=0;
}
server {
listen 80;
root /home/app/app/public;
¿Se trata de una seguridad reforzada? SELinux? ¿Grupos C? ¿Qué estoy haciendo mal?
Respuesta1
Debes verificar el permiso, no solo del socket (archivo) sino de todos los directorios principales. Sicualquierde ellos niegan el acceso, su solicitud fallará.
Por ejemplo:
# ls -ld /home/app
drwx------. 8 root root 4096 Dec 7 21:33 /home/app
Respuesta2
Coloque su archivo de calcetín /var/run
y cuando se cree su archivo de calcetín verifique a qué usuario y grupo pertenece. Para su caso, el usuario debería ser 'aplicación'