Nginx kann nicht auf die Upstream-Sock-Datei und den öffentlichen Ordner zugreifen

Nginx kann nicht auf die Upstream-Sock-Datei und den öffentlichen Ordner zugreifen

Gegeben: neue Archlinux VPS-Box auf DigitalOcean. Ich habe einen Benutzer „App“ erstellt und es gibt eine Datei, die /home/app/webapp.sockvon der von systemd gestarteten Binärdatei erstellt wurde:

[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

Ich möchte diese App nicht als HTTP-Benutzer ausführen, da ich mich irgendwann dazu entscheide, einen anderen Webserver auf dieser Maschine unter einem anderen Benutzer auszuführen und nur dessen .sock-Datei dem HTTP-Benutzer zugänglich zu machen. Rails weist bekanntermaßen Sicherheitslücken auf, daher möchte ich verhindern, dass der „App“-Benutzer irgendwohin außerhalb seines Home-Ordners und seiner eigenen Daten gelangt.

Ich habe einen Sudo-Benutzer, „sudoer“, und es gibt keine Möglichkeit, auch nur eine PID-Datei zu lesen:

[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

Es hat „r“-Rechte für „andere“, warum kann „sudoer“ es nicht „caten“?

Ich gehe davon aus, dass dies auch der Grund für die folgenden Nginx-Fehler ist. Statische Datei:

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"

Dynamischer Inhalt:

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"

Auszug aus der Nginx-Konfiguration:

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

Ist das verstärkte Sicherheit? SELinux? CGroups? Was mache ich falsch?

Antwort1

Sie müssen die Berechtigung nicht nur des Sockets (der Datei), sondern aller übergeordneten Verzeichnisse überprüfen. Wennbeliebigvon ihnen den Zugriff verweigern, wird Ihre Anfrage fehlschlagen.

Zum Beispiel:

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

Antwort2

Legen Sie Ihre Sock-Datei ein /var/runund prüfen Sie, wenn Ihre Sock-Datei erstellt ist, zu welchem ​​Benutzer und welcher Gruppe sie gehört. In Ihrem Fall sollte der Benutzer „app“ sein.

verwandte Informationen