Das chroot- und chdir-Verzeichnis von PHP-FPM

10

Ich richte php-fpm mit aktiviertem Chrooting ein. Jetzt sehe ich, dass es zwei Möglichkeiten gibt, und ich möchte wissen, was der genaue Unterschied ist.

Das Setup hat:

chroot = /var/www/domains/domain.tld/
; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
chdir = /docroot/

Warum gibt es hier zwei verschiedene Orte und auf welchen Pfad PHP zugreifen darf? Kann die PHP-Website zugreifen /var/www/domains/domain.tld/oder kann sie nur auf Dateien mit dem docrootVerzeichnis zugreifen .

===

Vielleicht gibt es einen konkreten Rat für mich. Ich möchte ein Setup wie dieses haben:

Webroot-Standort: /var/www/

domain.com/
 |---conf/
 |    |--nginx.conf
 |    |--php-fpm.conf
 |
 |---ssl/
 |---logs/
 |---session/
 |---domains/
       |---www/
       |---app/
       |---dev/

Hier wären die PHP-Fpm-Einstellungen:

chroot = /var/www/domain.com/
chdir  = /domains/www

Die Hauptfrage hier ist nun, ob die in der wwwSubdomain befindliche Anwendung auf die Dateien in devoder zugreifen kann app. Oder sogar die Dateien in der Sitzung, bei denen es sich um den Speicherpfad für die Sitzung handelt, oder die anderen Ordner wie SSL und Protokolle.

Saif Bechan
quelle

Antworten:

12
  • Chroot legt das 'root'-Verzeichnis fest - Sie können nicht über das root-Verzeichnis navigieren.
  • Chdir ändert einfach das Startverzeichnis - es ist weiterhin möglich, zu anderen Verzeichnissen (einschließlich den darüber liegenden) zu navigieren.
    • Wenn Sie keinen Chroot-Pfad angeben, gilt die 'echte' Wurzel - und Sie geben ein absolutes chdir an.
    • Wenn Sie einen Chroot-Pfad angeben, geben Sie einen Pfad relativ zum Chroot-Pfad an (der das Stammverzeichnis neu definiert).

Die von Ihnen vorgeschlagenen Einstellungen scheinen in Ordnung zu sein.

  • Der Startpfad wäre der Chroot-Pfad + der Chdir-Pfad
  • Die App kann auf alle Dateien unter dem Chroot-Pfad zugreifen (es sei denn, es gibt andere Einschränkungen - z. B. php_openbasedir, Berechtigungen usw.).

Als Randnotiz: Ihre PHP-Anwendung hat auch Zugriff auf Ihre nginx.conf und php-fpm.conf basierend auf der von Ihnen gezeigten Dokumentstruktur. Dies scheint etwas zu sein, das Sie möglicherweise ändern möchten (zumindest um die Dateien lesbar zu machen). nur für diesen Benutzer).

cyberx86
quelle
Ich werde sicherstellen, dass diese Dateien sicher sind. Gibt es übrigens einen Unterschied zwischen dieser Methode des Chrootings und dem Festlegen des php_openbasedir?
Saif Bechan
1
Ja - chroot gilt auf Betriebssystemebene und ist viel schwieriger zu umgehen. open_basedir ist PHP-spezifisch und muss in jeder Funktion überprüft werden, damit Exploits häufiger auftreten (z. B. durch Ausführen externer Skripte mit shell_exec). Zu diesem Thema gibt es auf der PHP-Website einen interessanten Sicherheitshinweis . Das heißt nicht, dass open_basedir nutzlos ist, wenn Sie chroot verwenden. In jedem Fall, in dem etwas außerhalb Ihres Skripts auftritt, kann es nützlich sein, ein anderes open_basedir als Ihren chroot-Pfad zu definieren. Chroot bietet möglicherweise auch eine bessere Leistung.
Cyberx86