ubuntuusers.de

Berechtigungen entsprechend der Gegebenheit anpassen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

VolkerRaschek

Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Hallo zusammen, ich habe folgendes Problem. Ich möchte gerne für einen Freund auf meinem kleinen PC eine Seite hosten. Dazu habe ich für ihn einen eigenen Benutzer angelegt. Der Benutzer heißt "cms" und ist auch in der Gruppe "cms" drin.

Sein Heimatverzeichnis liegt unter /var/www/cms, wobei darunter noch zwei Verzeichnisse sind /var/www/cms/apache2-logs und /var/www/cms/www. In apache2-logs werden von der Seite die Logs gespeichert und unter www kann er seine Dateien hochladen. Die vhost Datei seiner Seite zeigt in /var/www/cms/www.

Er kann auf das Verzeichnis /var/www/cms mittels FTP Zugang zugreifen und so seine Dokumente hochladen. Ich habe in vsftpd eingestellt, dass er neue Dokumente mit den umask Berechtigungen 007 erstellen soll. Als ausgleich, dass www-data den Inhalt trotzdem richtig auslesen kann, habe ich den Benutzer www-data zusätzlich der Gruppe cms zugewiesen. Leider kann der Apache den Inhalt unter /var/www/cms/www immer noch nicht anzeigen.

Was habe ich falsch gemacht?

Gruß Volker

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Problem gelöst, da hätte ich auch vorher drauf kommen können die Dienste alle mal neu zu starten.

Volker

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

In so einem Fall, wo ein anderer User Zugriff auf einen Teil des Webservers hat, würde noch darauf achten, dass PHP nicht als Apache-Modul läuft, sondern als CGI oder FPM. Andernfalls führt eine Sicherheitslücke in dem CMS-VHost dazu, dass der Angreifer überall Zugriff hat, wo auch der Webserver Zugriff hat.

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

misterunknown schrieb:

In so einem Fall, wo ein anderer User Zugriff auf einen Teil des Webservers hat, würde noch darauf achten, dass PHP nicht als Apache-Modul läuft, sondern als CGI oder FPM. Andernfalls führt eine Sicherheitslücke in dem CMS-VHost dazu, dass der Angreifer überall Zugriff hat, wo auch der Webserver Zugriff hat.

Und wie macht man so was?

Gruß Volker

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

VolkerRaschek schrieb:

Und wie macht man so was?

Für die Variante SuExec/FastCGI gibt es eine gute Anleitung im Hetzner-Wiki. Es ist nicht ganz trivial einzurichten, lief aber bei mir 2 Jahre lang problemlos.

Die modernere Variante ist PHP-FPM (FastCGI-Process-Manager). Allerdings hab ich dafür noch keine vollständige Anleitung gefunden, daher bin ich dabei einen Blog-Artikel darüber zu schreiben – der ist aber noch nicht fertig. Grundsätzlich ist das aber kein Hexenwerk: (für PHP7 einfach die Version anpassen)

$ apt-get install libapache2-mod-fastcgi php5-fpm

Die Konfiguration von FPM liegt dann unter /etc/php5/fpm. Dort kannst du mal die php-fpm.conf überfliegen, dort sollte aber alles passen. Anschließend kannst du deine entsprechenden Pools konfigurieren. Diese liegen in /etc/php5/fpm/pool.d/. Als Beispiel dient der Pool www.conf, den ich allerdings nur als Referenz nutzen würde, und daher deaktivieren (da reicht ein mv www.conf www.conf_inactive). Bei mir sieht so eine Konfiguration dann so aus:

[cloud]
user = www-user-cloud
group = www-user-cloud
listen = /var/run/php5-fpm-cloud.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 512
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
;pm.status_path = /status
;ping.path = /ping
access.log = "/var/www/sites/cloud.misterunknown.de/logs/php-$pool.access.log"
access.log = "/var/www/sites/cloud.misterunknown.de/logs/php-$pool.access.log"
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
slowlog = "/var/www/sites/cloud.misterunknown.de/logs/php-$pool.slow.log"
security.limit_extensions = .php .php3 .php4 .php5

php_flag[display_errors] = off

php_admin_flag[log_errors] = on

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www-user-cloud@misterunknown.de
php_admin_value[error_log] = "/var/www/sites/cloud.misterunknown.de/logs/php-$pool.error.log"
php_admin_value[memory_limit] = 512M
php_admin_value[open_basedir] = "/var/www/sites/cloud.misterunknown.de:/var/www/sites/cloud.misterunknown.de/tmp:/data/owncloud:/dev/urandom"
php_admin_value[upload_tmp_dir] = "/var/www/sites/cloud.misterunknown.de/tmp"
php_admin_value[session.save_path] = "/var/www/sites/cloud.misterunknown.de/tmp"
php_admin_value[max_execution_time] = 600

Bei PHP-FPM kannst du keine separate php.ini pro Pool angeben, aber du kannst PHP-Werte direkt in der Pool-Konfiguration setzen. Neben der zusätzlichen Sicherheit, dass jeder PHP-Pool als eigener Nutzer läuft, kannst du noch das open_basedir setzen (PHP-Direktive). Damit verhinderst du, dass PHP auch außerhalb des DocumentRoots lesen kann (also dort, wo jeder System-Nutzer lesen könnte). Wenn du alle relevanten Pools konfiguriert hast, kannst du PHP-FPM neustarten.

/etc/init.d/php5-fpm restart

Die VHost-Konfiguration im Apache2 sieht dann so aus:

<VirtualHost *:443>
        ServerName cloud.misterunknown.de
        …
        DocumentRoot /var/www/sites/cloud.misterunknown.de/htdocs
        <Directory /var/www/sites/cloud.misterunknown.de/htdocs>
                Require all granted
                AllowOverride All
        </Directory>

        <FilesMatch "\.php$" >
                SetHandler "proxy:unix:/var/run/php5-fpm-cloud.sock|fcgi://localhost"
        </FilesMatch>

        <Proxy "fcgi://localhost">
        </Proxy>
        …
</VirtualHost>

Es kann sein, dass du das Apache2-PHP-Modul noch deinstallieren musst. Das weiß ich aber nicht genau, da das bei mir vorher schon nicht installiert war. Im Zweifelsfall kannst du aber einfach per phpinfo() nachschauen, wie PHP angesprochen wurde.

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Okay, ich habe das mal ausprobiert.

Es scheint zu funktionieren. Ich musste nur noch a2enmod proxy_fcgi aktivieren.

Ich habe größtenteils mal deine Konfiguration übernommen. Ich werde die aber noch den Gegebenheiten Anpassen.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

VolkerRaschek schrieb:

Es scheint zu funktionieren. Ich musste nur noch a2enmod proxy_fcgi aktivieren.

Guter Hinweis! Das fehlt auch noch in meinem meinem Blog-Entwurf.

VolkerRaschek

(Themenstarter)
Avatar von VolkerRaschek

Anmeldungsdatum:
19. August 2014

Beiträge: 358

Wohnort: Eifel

Sollte der Blogeintrag fertig sein würde ich den gerne mal lesen 👍

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

VolkerRaschek schrieb:

Sollte der Blogeintrag fertig sein würde ich den gerne mal lesen 👍

So, fertig 😉 https://misterunknown.de/blog/2016/10/apache-2-4-mit-php5-fpm-via-sockets.html

Antworten |