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:
- Jede Webseite nutzt einen PHP-Prozess mit eigener Benutzerkennung.
- 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