LAMP - Apache

Apache einrichten

Diese Handbuchseite basiert auf Apache 2.4.46.

Unserem Beispiel aus der Installationsanleitung entsprechend, wollen wir einen “LAMP-Testserver für Entwickler” aufsetzen, der über LAN direkt mit dem Arbeitsplatz-PC verbunden ist. Darüber hinaus soll es aus Gründen der Sicherheit für den Server keine Verbindung zu einem lokalen Netzwerk oder gar zum Internet geben.
Einzige Ausnahme: Der Server wird temporär und ausschließlich für System- und Software- Aktualisierungen über eine zweite Netzwerkschnittstelle mit dem Internet verbunden.

Apache im Dateisystem

Debian hat die Dateien des Apache entsprechend ihrer Funktion vollständig in das Dateisystem integriert.

Wichtig ist die Unterscheidung zwischen den verwendeten Variablen ServerRoot und DocumentRoot.

“ServerRoot” ist das Konfigurationsverzeichnis, also /etc/apache2/.
“DocumentRoot” beinhaltet die Webseitendaten, also /var/www/html/.

Verbindung zum Server

Die Verbindung zwischen Testserver und PC wird in das IPv4-Netzwerksegment 192.168.3.xxx gelegt, während die Internetverbindung des PC außerhalb dieses Netzwerksegmentes erfolgt. Die verwendeten Daten sind:

Server
IP: 192.168.3.1/24
Name: server1.org
Alias: www.server1.org

PC
IP: 192.168.3.10/24
Name: pc1

Wir legen von der Datei /etc/hosts auf dem Server und auf dem PC eine Sicherungskopie an und fügen beiden die notwendigen Zeilen hinzu.

Als nächstes geben wir im NetworkManager die Daten für den Server in die rot umrandeten Feldern ein. Die Methode wird von “Automatisch (DHCP)” auf “Manuell” geändert und in die Adressfelder tragen wir die zu Beginn genannten Werte ein.

Server - Dateneingabe im NetworkManager

Zusätzlich sollte im Reiter “Allgemein” die Option “Automatisch mit Priorität verbinden” aktiviert sein.
Sinngemäß nehmen wir am PC die entsprechenden Einstellungen für die verwendete LAN-Schnittstelle vor.

Am PC testen wir die Verbindung in der Konsole mit

$ ping -c3 www.server1.org

und bei Erfolg prüfen wir gleich die Funktion von Apache, indem wir in die Adresszeile des Webbrowsers http://www.server1.org/index.html eingeben.

Die Apache-Begrüßungsseite mit “It works!” sollte erscheinen.

Apache Konfiguration

Die Konfigurationsdateien und -verzeichnisse befindet sich im “ServerRoot” Verzeichnis /etc/apache2/.
Die zentrale Konfigurationsdatei ist apache2.conf. Sie wird in der Regel nicht bearbeitet, da viele Konfigurationen in separaten Dateien vorliegen. Die Aktivierung und Deaktivierung erfolgt über Sym-Links. Das hat den Vorteil, dass eine Reihe verschiedener Konfigurationen vorhanden sind und nur die benötigten eingebunden werden.

Bei den Konfigurationsdateien handelt es sich um Textdateien, welche mit einem Editor und Root-Rechten angelegt bzw. editiert werden. Der Name der Datei darf beliebig sein, aber die Dateiendung muss “.conf” lauten. Die gültigen Direktiven, die in den Konfigurationsdateien verwendet werden dürfen, beschreibt die Apache Dokumentation ausführlich.

Die Dateien liegen in den Verzeichnissen

/etc/apache2/conf-available,
/etc/apache2/mods-available und
/etc/apache2/sites-available.

Ihre Aktivierungs-Links finden wir in

/etc/apache2/conf-enable,
/etc/apache2/mods-enable und
/etc/apache2/sites-enable.

Um eine .conf-Datei zu aktivieren bzw. deaktivieren benutzen wir die Befehle a2enconf und a2disconf. Das erstellt oder entfernt die Aktivierungs-Links.

a2enconf NAME_DER_DATEI.conf 

Aktiviert die Konfiguration. Die Deaktivierung erfolgt entsprechend mit:

a2disconf NAME_DER_DATEI.conf 

In gleicher Weise verfahren wir bei Modulen und Virtual-Hosts mit den Befehlen a2enmod, a2ensite und a2dismod, a2dissite.

Der Apache Webserver liest mit dem Befehl

systemctl reload apache2.service

die geänderte Konfiguration ein.

Nun kommen wir wieder auf unseren “LAMP-Testserver für Entwickler” zurück und passen die Konfiguration an die Serverdaten an.

  1. Datei /etc/apache2/apache2.conf

    Es ist eine der wenigen Ausnahmen die apache2.conf zu editieren. Wir fügen zu Beginn des Abschnitts “Global configuration” die folgende Zeile ein:

    ServerName 192.168.3.1

    Hiermit teilen wir dem Apache-Webserver die IP-Adresse mit, unter der das Entwicklungsprojekt erreichbar sein soll und unterdrücken Umleitungen zur IP 127.0.1.1 mit Fehlermeldungen.

  2. Neue sites-Datei

    Mit dem Texteditor unserer Wahl erstellen wir die Datei
    /etc/apache2/sites-available/server1.conf z. B.

    mcedit /etc/apache2/sites-available/server1.conf

    und fügen den folgenden Inhalt ein, speichern die Datei und beenden den Editor.

    <VirtualHost *:80>
    ServerName server1.org
    ServerAlias www.server1.org
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error_server1.log
    CustomLog ${APACHE_LOG_DIR}/access_server1.log combined
    </VirtualHost>

    Anschließend stellen wir die Konfiguration auf den neuen “VirtualHost” um und geben die Änderungen dem Apache Webserver bekannt.

    # a2ensite server1.conf 
      Enabling site server1.
    [...]
    
    # a2dissite 000-default.conf 
      Site 000-default disabled.
    [...]
    
    systemctl reload apache2.service

Benutzer und Rechte

Der Apache Webserver läuft mit <user> und <group> www-data.www-data und “DocumentRoot” gehört unmittelbar nach der Installation root.root.
Um Benutzern Schreibrechte für die in “DocumentRoot” enthaltenen Dateien zu gegeben, sollte dafür eine neue Gruppe angelegt werden. Es ist nicht sinnvoll die bestehende Gruppe “www-data” zu nutzten, da mit den Rechten dieser Gruppe Apache läuft.
Wir nennen die neue Gruppe work.

Mit CMS

Wird ein Content-Management-System (Software zur gemeinschaftlichen Bearbeitung von Webseiten-Inhalten) hinzugefügt, bereiten wir “DocumentRoot” entsprechend vor:

  1. Gruppe anlegen und dem Benutzer zuweisen.

    groupadd work
    adduser <user> work
    chgrp work /var/www/html

    Um die neuen Rechte zu aktivieren, muss man sich einmal ab- und neu anmelden oder als Benutzer den Befehl newgrp verwenden.

    $ newgrp work
  2. SGID-Bit für “DocumentRoot” setzen,
    damit alle hinzukommenden Verzeichnisse und Dateien die Gruppe work erben.

    chmod g+s /var/www/html
  3. Eigentümer und Dateirechte anpassen,
    damit Unbefugte keinen Zugriff erhalten und der Apache Webserver einwandfrei läuft.
    Wir schauen uns die derzeitigen Rechte an:

    # ls -la /var/www/html
    insgesamt 24
    drwxr-sr-x 2 root work  4096 9.Jan 19:32 .
                 (DocumentRoot mit SGID-Bit)
    drwxr-xr-x 3 root root  4096 9.Jan 19:04 ..
                 (Das übergeordnete Verzeichnis /var/www)
    -rw-r--r-- 1 root work 10701 9.Jan 19:04 index.html
    -rw-r--r-- 1 root work    20 9.Jan 19:32 info.php

    Wir ändern für “DocumentRoot” den Eigentümer zu “www-data”, geben der Gruppe Schreibrecht und entziehen allen anderen auch das Leserecht. Alles rekursiv.

    chown -R www-data /var/www/html
    chmod -R g+w /var/www/html
    chmod -R o-r /var/www/html

    Das Ergebnis überprüfen wir noch einmal.

    # ls -la /var/www/html
    insgesamt 24
    dr-xrws--x 2 www-data work  4096 9.Jan 19:32 .
    drwxr-xr-x 3 root     root  4096 9.Jan 19:04 ..
    -rw-rw---- 1 www-data work 10701 9.Jan 19:04 index.html
    -rw-rw---- 1 www-data work    20 9.Jan 19:32 info.php

    Jetzt haben in “DocumentRoot” nur Mitglieder der Gruppe work Schreibrecht, der Apache Webserver kann die Dateien lesen und schreiben, allen anderen wird der Zugriff verweigert.

  4. Nachteile dieser Einstellungen

    Beim Anlegen neuer Verzeichnisse und Dateien unterhalb “DocumentRoot” ist der Eigentümer der jeweilige User und nicht www-data. Dadurch kann der Apache-Webserver die Dateien nicht lesen.
    Abhilfe schafft eine Systemd Path Unit, die Änderungen unterhalb “DocumentRoot” überwacht und die Eigentümer- und Dateirechte anpasst. (Siehe das Beispiel in der Handbuchseite Systemd-Path.)

Ohne CMS

Bei statischen Webseiten ist ein Content-Management-System vielfach nicht notwendig und bedeutet nur ein weiteres Sicherheitsrisiko und erhöhten Wartungsaufwand. Zusätzlich zu den zuvor getätigten Einstellungen kann dem Apache-Webserver das Schreibrecht an “DocumentRoot” entzogen werden, um die Sicherheit zu stärken, denn für den Fall, dass ein Angreifer eine Lücke in Apache findet, erhält er dadurch keine Schreibrechte in “DocumentRoot”.

chmod -R u-w /var/www/html

Sicherheit - Apache Standard

Wichtige Absicherungen enthält die Datei /etc/apache2/apache2.conf bereits standardmäßig.

Die nachfolgenden drei Direktiven verhindern den Zugang zum root-Dateisystem und geben dann die beiden vom Apache-Webserver verwendeten Verzeichnisse /usr/share und /var/www frei.

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Die Optionen “FollowSymLinks” und “Indexes” bergen ein Sicherheitsrisiko und sollten geändert werden, sofern sie nicht unbedingt notwendig sind. Siehe weiter unten.

Die folgende Direktive unterbindet die Anzeige der Dateien .htaccess und .htpasswd.

<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

Sicherheit - weitere Konfigurationen

HTTPS verwenden

Ohne HTTPS geht heute kein Webseitenprojekt an den Start.
Wie man ein Zertifikat erlangt beschreibt die Webseite HTTP-Guide ausführlich und leicht verständlich.

Wir legen zuerst die nötigen Ordner innerhalb “DocumentRoot” an:

cd /etc/apache2/
/etc/apache2/# mkdir ssl ssl/certs ssl/privat

In diesen legen wir die Certifikatsdatei server1.org.crt und den privaten Schlüssel server1.org.key ab.

Dann sichern wir die Verzeichnisse gegen unbefugten Zugriff.

/etc/apache2/# chown -R root.root ssl
/etc/apache2/# chmod -R o-rwx ssl
/etc/apache2/# chmod -R g-rwx ssl
/etc/apache2/# chmod u-w ssl/certs/server1.org.crt
/etc/apache2/# chmod u-w ssl/private/server1.org.key

Der ls-Befehl zur Kontrolle:

/etc/apache2/# ls -la ssl
   insgesamt 20
   drwx------ 5 root root 4096 25. Jan 18:17 .
   drwxr-xr-x 9 root root 4096 25. Jan 18:43 ..
   drwx------ 2 root root 4096 25. Jan 18:16 certs
   drwx------ 2 root root 4096 25. Jan 18:16 private

/etc/apache2/# ls -l ssl/certs
   -r-------- 1 root root 1216 25. Jan 15:27 server1.org.crt

Sicherheits Tipps

Integration in Apache2

Das ssl-Modul ist in Apache per default aktviert. Es genügt die Datei
/etc/apache2/sites-available/server1.conf zu bearbeiten.

Die erweiterte server1.conf weist dann folgenden Inhalt auf:

<VirtualHost *:80>
 ServerName server1.org
 ServerAlias www.server1.org
 Redirect / https://server1.org/
</VirtualHost>

<VirtualHost *:443>
 ServerName server1.org
 ServerAlias www.server1.org
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html
 ErrorLog ${APACHE_LOG_DIR}/error_server1.log
 CustomLog ${APACHE_LOG_DIR}/access_server1.log combined

 SSLEngine on
 SSLProtocol all -SSLv2 -SSLv3
 SSLCertificateFile    /etc/apache2/ssl/certs/server1.org.crt
 SSLCertificateKeyFile /etc/apache2/ssl/private/server1.org.key

   <Directory "/var/www/html">
    Order deny,allow
    Deny from all
    Allow from 192.168.3.10
    Allow from 192.168.3.1
   </Directory>

   <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
   </FilesMatch>

   <Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
   </Directory>
</VirtualHost>

Für den Fall, dass unser fertiges Projekt später bei einem Hoster ohne Zugriff auf “ServerRoot” liegt (das ist die Regel), können wir in “DocumentRoot” die Datei .htaccess um eine Rewrite-Anweisung ergänzen bzw. die Datei mit der Rewrite-Anweisung anlegen.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Quellen Apache

apache.org - Dokumentation (teilweise deutsch)
apache.org - Konfigurationsdateien
apache.org - SSL Howto
HTTPS Guide - Servercertifikate erstellen und integrieren

Zuletzt bearbeitet: 2021-07-12