Die Abkürzung LAMP steht für Linux, Apache, MySQL und PHP. Dabei handelt es sich um einen standardisierten Webserver. Im Folgenden wird die Installation und Konfiguration unter einem Enterprise Linux Derivat wie Rocky Linux im Detail beschrieben.
Zunächst wird Apache wie folgt installiert:
dnf install httpd
Der Zugriff auf den Webservice muss in der Firewall erlaubt werden:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
Daraufhin kann MySQL, in Form von MariaDB installiert werden:
dnf install mariadb-server
Nun kann der Dienst initial gestartet werden:
systemctl start mariadb.service
Beide Dienste müssen für den automatischen Start beim Systemstart aktiviert werden:
systemctl enable httpd
systemctl enable mariadb
Zur Absicherung der Standardinstallation wird mysql_secure_installation aufgerufen.
Bei der Passwortabfrage kann Enter eingegeben werden, da bisher noch kein Passwort definiert wurde.
Da Unix Sockets nicht zur Authentifizierung verwendet werden sollen, wird diese Frage mit n beantwortet.
Das Root Passwort zum Zugriff auf den MariaDB Server sollte geändert werden.
Alle weiteren Fragen können jeweils mit y oder ENTER beantwortet werden. Aufgrund dessen werden anonyme Benutzer und die mitgelieferte Testdatenbank entfernt und Remote-Root-Logins werden deaktiviert. Abschliessend werden die neuen Regeln geladen, damit die Änderungen von MySQL angewendet werden.
Die Anmeldung an der MySQL-Konsole kann wie folgt geprüft werden. Dabei wird das zuvor vergebene Passwort abgefragt.
mysql -u root -p
Durch die Eingabe von exit oder quit wird die Konsole verlassen.
Nun kann PHP mit einigen grundlegenden Modulen installiert werden:
dnf install php-{common,gmp,fpm,curl,intl,pdo,mbstring,gd,xml,cli,zip,mysqli}
Mithilfe von php -v kann die installierte Version überprüft werden.
Für jede Webseite wird ein entsprechendes Verzeichnis unter /var/www erstellt. Im folgenden Beispiel gehen wir von hostname.domain.tld aus, welches an die persönlichen Bedürfnisse angepasst werden muss.
mkdir /var/www/hostname.domain.tld
Daraufhin wird im Verzeichnis /etc/httpd/conf.d eine VirtualHost Konfigurationsdatei erstellt
/etc/httpd/conf.d/hostname.domain.tld.conf
<VirtualHost *:80>
ServerName hostname.domain.tld
ServerAlias www.hostname.domain.tld
ServerAdmin webmaster@hostname.domain.tld
DocumentRoot /var/www/hostname.domain.tld
ErrorLog "logs/error_log"
CustomLog "logs/access_log" combined
</VirtualHost>
Mit dem Befehl apache2ctl configtest kann die Konfiguration auf Gültigkeit hin überprüft werden. Nach den Anpassungen muss der Webserver-Dienst neu geladen werden:
systemctl reload httpd
Nun kann eine einfache HTML-Datei im Verzeichnis des Virtual Hosts erstellt werden, um die Funktion der Webseite zu prüfen:
/var/www/hostname.domain.tld/index.html
<h1>It works!</h1>
<p>This is the landing page.</p>
Zugriff via Filezilla
Zur Installation der Webanwendung kann FileZilla verwendet werden. Dazu muss zunächst der SSH-Key hinterlegt werden. Dies erfolgt unter Einstellungen / Verbindung / FTP / SFTP. Dort wählt man den Punkt Schlüsseldatei hinzufügen... und gibt den Pfad zu dem zu verwendenden SSH-Private-Key an.
Als Ziel gibt man in den Verbindungsparametern beim Punkt Server das Zielsystem in der Form sftp://hostname.domain.tld an. Als Benutzername wird der gewünschte Account eingetragen. Die restlichen Felder (inklusive Passwort) können leer gelassen werden, da der Verbindungsaufbau mithilfe des SSH-Schlüssels erfolgt. Standardmässig öffnet sich die Verbindung im Home-Verzeichnis des Nutzers.
Im Verzeichnisbaum wechselt man in das Webroot (in diesem Beispiel: /var/www/hostname.domain.tld) und lädt dort die Webapplikation hoch.
Let's Encrypt Zertifikate
Zur Einrichtung eines SSL-Zertifikats wird Certbot verwendet, welches zunächst aus dem EPEL Repository installiert werden muss:
dnf install certbot python3-certbot-apache
Nach der Installation muss der Webserver-Dienst neu gestartet werden:
systemctl restart httpd
Das Zertifikat kann nun wie folgt beantragt werden:
certbot --apache -d hostname.domain.tld
Bei Bedarf können mit dem Parameter -d weitere Aliase angegeben werden, wie beispielsweise www.hostname.domain.tld. Diese müssen in der VirtualHost Konfigurationsdatei ebenfalls angegeben werden.
Beim ersten Aufruf wird nach einer E-Mail-Adresse gefragt. Hier kann die Adresse des Webmaster angegeben werden. Die Nutzungsbedingungen können durch die Eingabe von A akzeptiert werden. Die Aufforderung zum Teilen der E-Mail-Adresse wird verneint.
Nach einer erfolgreichen Erstellung werden die Zertifikatspfade ausgegeben. Darüber hinaus wird durch das Apache Plugin automatisch eine entsprechende SSL VirtualHost Konfiguration /etc/httpd/conf.d/hostname.domain.tld-le-ssl.conf erstellt und Anfragen auf HTTP automatisch auf HTTPS umgeleitet.
Die Erneuerung der Zertifikate kann automatisch über einen systemd-Timer erfolgen. Dieser muss dazu aktiviert und gestartet werden:
systemctl enable certbot-renew.timer
systemctl start certbot-renew.timer
Alle aktiven Timer lassen sich mit folgendem Befehl ausgeben:
systemctl list-timers
.htaccess
Viele Webanwendungen setzen Parameter über Konfigurationen in sogenannten .htaccess Dateien. Damit diese interpretiert werden können, muss dies in der Apache Konfiguration über den Parameter AllowOverride AuthConfig erlaubt werden:
/etc/httpd/conf.d/hostname.domain.tld-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
...
<Directory /var/www/hostname.domainname.tld>
AllowOverride All
</Directory>
...
</VirtualHost>
</IfModule>
Dabei muss lediglich innerhalb der VirtualHost Konfiguration die Directory Detektive ergänzt werden, alle weiteren Einträge können beibehalten werden.
phpMyAdmin
Zur grafischen Verwaltung der Datenbank eignet sich phpMyAdmin. Die Installation erfolgt ebenfalls aus dem EPEL-Repository mit folgendem Befehl:
dnf install phpmyadmin
Das Paket enthält eine Beispielkonfiguration für den Webserver, welche wie folgt bearbeitet werden sollte, um die Anwendung zusätzlich mit einer Passwortabfrage zu schützen:
/etc/httpd/conf.d/phpMyAdmin.conf
...
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
Require local
AllowOverride All
</Directory>
...
Es muss lediglich die Zeile AllowOverride All zum entsprechenden Abschnitt hinzugefügt werden. Alle weiteren Einträge können belassen werden.
Daraufhin kann eine .htaccess Datei mit folgendem Inhalt erstellt werden:
/usr/share/phpMyAdmin/.htaccess
AuthType Basic
AuthName "Restricted Access"
AuthUserFile /etc/phpMyAdmin/.htpasswd
<RequireAny>
Require valid-user
</RequireAny>
Das Passwort für den Zugriff kann mit dem Befehl htpasswd aus dem Paket httpd-tools erstellt werden:
dnf install httpd-tools
htpasswd -c /etc/phpMyAdmin/.htpasswd webmaster
In obigem Beispiel wird als Benutzername webmaster verwendet.
Abschliessend sollte die Webserver-Konfiguration neu eingelesen werden:
systemctl restart httpd
Der Zugriff auf phpMyAdmin erfolgt über https://hostname.domain.tld/phpMyAdmin
Datenbank Zugriff
Webapplikationen mit Datenbankzugriff sollten nicht den MySQL Root Benutzer verwenden. Es kann wahlweise über die MySQL Konsole (mysql -u root -p) oder phpMyAdmin eine Datenbank und ein Benutzer erstellt werden:
create database mydatabase;
SELECT PASSWORD('mypassword');
CREATE USER 'mydbuser'@'localhost' IDENTIFIED VIA mysql_native_password USING '41-digit hexadecimal number';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'mydbuser'@'localhost';
FLUSH PRIVILEGES;
Anstelle der 41-digit hexadecimal number wird die Ausgabe von SELECT PASSWORD eingefügt.
SELinux
Standardmässig ist auf einem Enterprise Linux System das Sicherheits-Framework SELinux aktiv. Sollte eine Webapplikation beispielsweise in der Lage sein, Daten in ein /uploads Verzeichnis schreiben zu können, dann muss dazu neben den Dateisystemberechtigungen der SELinux-Kontext auf das Verzeichnis oder die Datei gesetzt werden.
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/hostname.domain.tld/uploads(/.*)?"
restorecon -Rv /var/www/hostname.domain.tld/
tolle Anleitung! Könnte ich auch nur Port 443 öffnen? Am Ende lassen wir ja eh nur https trafic durch. Gruß Jochen
Nette Anleitung;)
Vlt kann man bei dem Titel des Artikels noch grundlegende Absicherungmöglichkeiten des Server einfügen? Sozusagen das kleine ABC: fail2ban, Portknocking, SQL Root Access?
Gibt es einen Grund, nicht docker-compose dafür zu verwenden?