4 votes

Nginx ne peut pas accéder au fichier .sock et au dossier public en amont.

Donné : boîte VPS Archlinux fraîche sur DigitalOcean. J'ai créé un utilisateur, 'app', et il y a un fichier, /home/app/webapp.sock créé par le binaire lancé par 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

Je ne veux pas exécuter cette application en tant qu'utilisateur http, car à un moment donné, je pourrais décider d'exécuter un autre serveur web sur cette machine sous un autre utilisateur, n'exposant que son fichier .sock à l'utilisateur http. Rails est connu pour avoir des failles de sécurité, et je voudrais donc éviter que l'utilisateur 'app' ne puisse accéder à son dossier personnel et à ses propres données.

J'ai un utilisateur sudo, 'sudoer', et il n'y a aucun moyen de lire même un fichier 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

Il a les droits 'r' pour 'others', pourquoi est-ce que 'sudoer' ne peut pas le 'cat' ?

Je suppose que c'est également la raison des erreurs nginx suivantes. Fichier statique :

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"

Contenu dynamique :

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"

Extrait de la configuration de nginx :

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

Est-ce une sécurité renforcée ? SELinux ? CGroups ? Qu'est-ce que je fais de mal ?

5voto

Michael Hampton Points 232226

Vous devez vérifier la permission, non seulement du socket (fichier) mais de tous les répertoires parents. Si tout d'entre eux refusent l'accès, votre demande échouera.

Par exemple :

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

1voto

mstoeckli Points 165

Mettez votre fichier sock dans /var/run et lorsque votre fichier sock est créé, vérifiez à quel utilisateur et à quel groupe il appartient. Dans votre cas, l'utilisateur doit être 'app'.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X