Apache2, PHP-FPM, Suexec

Gespeichert von Erik Wegner am/um Sa, 21.01.2017 - 11:04
Body

Nach dem Wechsel auf Ubuntu 16.04 LTS sollte eine weitere Sicherheitsfunktion genutzt werden. Jede PHP-Webseite soll als eigenständiger Benutzer ausgeführt werden, damit ein Einbruch nicht die übrigen Webseiten betrifft.

Ziele

Folgende Ziele werden umgesetzt:

  1. Jede Webseite nutzt einen PHP-Prozess mit eigener Benutzerkennung.
  2. Jede Webseite nutzt einen eigenen Benutzer für die Dateien.

Erforderliche Pakete:

Folgende Pakete werden benötigt:

  • libapache2-mod-fastcgi
  • php-fpm
  • apache2-suexec-custom

Diese Pakete werden nicht mehr benötigt:

  • libapache2-mod-php
  • libapache2-mod-fcgid

Umsetzung

Benutzer hinzufügen

Für den virtuellen Host wird eine neue Gruppe und ein neuer Benutzer erzeugt:

addgroup --system www-drupal8
adduser --system --home /home/www-drupal8 www-drupal8

FPM-Pool konfigurieren

PHP-FPM (FastCGI Process Manager) sorgt für den Start und die Überwachung der PHP-Prozesse, die der Apache über die Fast-CGI-Schnittstelle anspricht. Im Verzeichnis pool.d wird festgelegt, unter welcher Benutzerkennung der Prozess läuft. Eine zusätzliche Datei /etc/php/7.1/fpm/pool.d/drupal8.conf stellt den weiteren Pool bereit.

[drupal8]
user = www-drupal8
group = www-drupal8

listen = /run/php/php7.1-fpm-drupal8.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Apache konfigurieren

Etwas umständlich ist der Webserver zu konfigurieren. Über eine neue Datei /etc/apache2/conf-available/php7-fcgi.conf wird die Zuordnung der PHP-CGI-Prozesse gesteuert.

<IfModule mod_fastcgi.c>

        # Common
        Action php7-fcgi /php7-fcgi
        Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
        FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.1-fpm.sock -pass-header Authorization
        <Location /php7-fcgi>
                Require all granted
        </Location>

        # Drupal 8
        Action php7-drupal8 /php7-drupal8
        Alias /php7-drupal8 /usr/lib/cgi-bin/php7-drupal8
        FastCgiExternalServer /usr/lib/cgi-bin/php7-drupal8 -socket /run/php/php7.1-fpm-drupal8.sock -pass-header Authorization
        <Location /php7-drupal8>
                Require all granted
        </Location>

</IfModule>

Anschließend wird der virtuellen Host in der Datei /etc/apache2/sites-available/100-drupal8.conf eingestellt. Wichtig sind die Anweisungen SuexecUserGroup zum Wechsel des Benutzers des Apaches und AddHandler zur Zuweisung des richtigen PHP-Prozesses.

<VirtualHost *:443>
 DocumentRoot /srv/www/vhosts/drupal8
 ServerName drupal8

 SuexecUserGroup www-drupal8 www-drupal8
 AddHandler php7-drupal8 .php

 Include /etc/apache2/includes/ssl
 ServerAdmin webmaster@qwirl.eu
 CustomLog /var/log/apache2/drupal8-access_log combined
 ErrorLog /var/log/apache2/drupal8-error_log
 <Directory /srv/www/vhosts/drupal8>
  AllowOverride All
  Options FollowSymLinks
  Require all granted
 </Directory>
</VirtualHost>

Damit Suexec das richtige DocumentRoot-Verzeichnis kennt, wird es in der Datei /etc/apache2/suexec/www-drupal8 konfiguriert.

/srv/www/vhost/drupal8
# public_html/cgi-bin
# The first two lines contain the suexec document root and the suexec userdir
# suffix. If one of them is disabled by prepending a # character, suexec will
# refuse the corresponding type of request.
# This config file is only used by the apache2-suexec-custom package. See the
# suexec man page included in the package for more details.

Dienste konfigurieren und starten

a2enconf php7-fcgi
a2ensite 100-drupal8
systemctl enable php7.1-fpm
systemctl start php7.1-fpm
systemctl restart apache2

Zusand überwachen

systemctl status php7.1-fpm
● php7.1-fpm.service - The PHP 7.1 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.1-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sa 2017-01-21 08:46:08 CET; 2h 17min ago
     Docs: man:php-fpm7.1(8)
  Process: 18645 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 11765 (php-fpm7.1)
   Status: "Processes active: 0, idle: 11, Requests: 3247, slow: 0, Traffic: 0.5req/sec"
   CGroup: /system.slice/php7.1-fpm.service
           ├─11765 php-fpm: master process (/etc/php/7.1/fpm/php-fpm.conf)
           ├─18648 php-fpm: pool drupal8
           ├─18649 php-fpm: pool drupal8
           ├─18907 php-fpm: pool www
           ├─19236 php-fpm: pool drupal8
           ├─20705 php-fpm: pool www
           └─30262 php-fpm: pool www