Apache: Unterschied zwischen den Versionen
Zeile 227: | Zeile 227: | ||
127.0.0.3 project.localdomain project | 127.0.0.3 project.localdomain project | ||
... | ... | ||
− | Für mich hat diese Lösung jedenfalls funktioniert. | + | Für mich hat diese Lösung auf meinem Testrechner jedenfalls funktioniert. |
=== Virtuelle Hosts für Systembenutzer bereitstellen === | === Virtuelle Hosts für Systembenutzer bereitstellen === |
Version vom 28. Dezember 2020, 16:15 Uhr
Installation und Hinweise
- Installation
YAST: Filter / Paketkategorien / Einfacher Webserver mit Apache2
Damit werden alle benötigten Module automatisch installiert und konfiguriert.
- Konfiguration
Nicht mit YAST und nicht mit Webmin konfigurieren. Es entsteht ein Durcheinander, besonders was die Konfiguration der virtuellen Server betrifft.
Die zentrale Konfigurationsdatei ist zwar /etc/apache2/httpd.conf
, man soll aber eigene Anpassungen in der Datei /etc/apache2/httpd.conf.local
durchführen. Dann bleiben die Änderungen auch nach Updates erhalten.
Achtung:
- Damit
/etc/apache2/httpd.conf.local
eingebunden wird, muss in/etc/sysconfig/apache2
folgende Zeile eingetragen werden:
APACHE_CONF_INCLUDE_FILES="/etc/apache2/httpd.conf.local"
Authentifizierung über LDAP
- Apache Module mod_ldap und mod_authnz_ldap laden
Die Module brauchen nicht installiert werden, sie sind schon vorhanden.
In der Datei /etc/sysconfig/apache2
muss der Aufruf dieser Module eingetragen werden.
# /etc/sysconfig/apache2 APACHE_MODULES=" ... ldap authnz_ldap ... "
- Überprüfung
Nach Neustart des Apache2 Servers stehen die geladenen Module in der Datei /etc/apache2/sysconfig.d/loadmodule.conf
- Zugriffschutz definieren für ein Verzeichnis
Beispiele:
Zugriff für User aus der Gruppe hs_lehrer:
<Directory /srv/www/htdocs/divers> AuthType Basic AuthBasicProvider ldap AuthzLDAPAuthoritative on AuthName "Zugriff nur fuer Lehrerinnen und Lehrer" AuthLDAPURL "ldap://localhost:389/ou=Users,dc=network?uid" Require ldap-group cn=hs_lehrer,ou=Groups,dc=network Require ldap-attribute gidNumber=601 Require valid-user </Directory>
Zugriff für bestimmte User:
<Directory /srv/www/htdocs/dokuwiki> AuthType Basic AuthBasicProvider ldap AuthzLDAPAuthoritative on AuthName "IT Dokumentation HS Irgendwo" Require ldap-user grfe nedo kibe eifr AuthLDAPURL "ldap://localhost:389/ou=Users,dc=network?uid"
</Directory>
- Howto
Apache authentication and authorization using LDAP
Andere Konfigurationseinstellungen
- Zugriff für Localhost ermöglichen
Allow from 127.0.0.0/255.0.0.0 ::1/128
- Modul mod_userdir einbinden
Dadurch ist Zugriff auf die Webseiten der Benutzer möglich. Diese müssen sich im Homeverzeichnis unter public_html befinden. Die URL lautet dann z.B. für den Benuter hs_user: http://hs-irgendwo.at/~hs_user
Include /etc/apache2/mod_userdir.conf
Achtung: Falls virtuelle Server konfiguriert werden, so erfolgt die Einbindung von Userdir in der entsprechenden Konfigurationsdatei des betreffenden Virtuellen Servers:
# /etc/apache2/vhosts.d/hs-irgendwo.at.conf # ... <IfModule mod_userdir.c> UserDir public_html Include /etc/apache2/mod_userdir.conf </IfModule>
- Andere Einstellungen
RedirectMatch Permanent ^(.+)/favicon\.ico$ http://server.de/favicon.ico
#Disable HTTP TRACE / TRACK Methods (Cross-Site Tracing) TraceEnable off
- Verzeichnisindex
Definition einer HEADER.html für Anzeige von Verzeichnissen durch Änderung in der Datei /etc/apache2/mod_autoindex-defaults.conf
.
HeaderName /HEADER.html
In der Datei /srv/www/htdocs/HEADER.html
wird die Kodierung der Anzeige mit UTF-8 vorgegeben:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- Apache soll Softlinks folgen
In der Datei
/etc/apache2/default-server.conf
DocumentRoot konfigurieren:
Options FollowSymlinks
Apache Modul hinzufügen
- Eintrag in Konfiguration
Beispiel: Laden des Moduls php7 anstatt php5
pico /etc/sysconfig/apache2
APACHE_MODULES="authz_host actions alias auth_basic ssl php7 perl authn_core ..."
Weitere Informationen: http://enarion.net/web/apache/htaccess/mod_rewrite-on-suse/ am Beispiel mod_rewrite
Zugriffschutz
Zugriffschutz zentral konfigurieren
Änderungen an der Konfiguration werden in /etc/apache2/default-server.conf
geschrieben.
<Directory /srv/www/htdocs/dokuwiki> AuthType Basic AuthName "IT Dokumentation HS Irgendwo" AuthUserFile /srv/www/.authpass Require user root grfe nedo kibe eifr </Directory> <Directory /srv/www/htdocs/Lehrer> AuthType Basic AuthName "Lehrerbereich HS Irgendwo" AuthUserFile /srv/www/.authpass Require valid-user </Directory> <Directory /srv/www/htdocs/phpMyAdmin/libraries> AuthType Basic AuthName "phpMyAdmin" AuthUserFile /srv/www/.authpass Require user root grfe </Directory> <Directory /srv/www/htdocs/divers> AuthType Basic AuthName "Zugriffschutz Test" AuthUserFile /srv/www/htdocs/divers/.htpasswd Require valid-user </Directory>
Passwortdatei generieren
Passwortdatei: /srv/www/.authpass
Folgendes Shellscript kopiert die Lehrerpasswörter in obige Datei
# /usr/local/bin/htpasswd.sh for UserName in `grep 601 /etc/passwd | cut -d ":" -f 1` ; do grep $UserName: /etc/shadow | cut -d ":" -f 1,2 >> /srv/www/.authpass done
Passwortdatei über Kommandozeile
- Neue Passwortdatei erzeugen
htpasswd -c .htpasswd username # oder htpasswd2 -c .htpasswd username
- Weitere Benutzer hinzufügen
htpasswd .htpasswd username # oder htpasswd2 .htpasswd username
Anmerkung: Es waren zwei Konfigurationsänderungen nötig, um dies zu ermöglichen:
- Erstellung eines Softlinks /usr/sbin/htpasswd, der auf /usr/sbin/htpasswd2 verweist.
- Erstellung eines weiteren Softlinks /usr/bin/htpasswd, der auch auf /usr/sbin/htpasswd2 verweist.
- Setzen des SETUID Bits für die Datei /usr/sbin/htpasswd2
chmod u+s /usr/sbin/htpasswd2
Tool zum Erzeugen einer Passwortdatei für User
Mit dem Tool /vorlagen/HTML/phpaccess.php bzw. V:\HTML\phpaccess.php kann jeder User am Server seine persönliche Passwortdatei erzeugen.
Einfach diese Datei in das zu schützende Verzeichnis unterhalb von ~/public_html kopieren. Dieses Programm erzeugt sowohl die Datei .htaccess als auch die Passwortdatei .htpasswd.
- Benutzername: admin
- Passwort: admin
Benutzername und Passwort für den Administrator der zu schützenden Website sind in der Datei phpaccess.php gespeichert und sollten natürlich geändert werden.
PHP Konfiguration
Siehe Artikel: PHP
Virtuelle Server
Server für virtuelle Hosts konfigurieren
Folgende Zeilen in /etc/apache2/httpd.conf
oder in /etc/apache2/httpd.conf
einfügen:
NameVirtualHost * Include /etc/apache2/vhosts.d/*.conf
Damit wird der Webserver für namensbasierte virtuelle Hosts konfiguriert.
Virtuelle Hosts konfigurieren
Im Verzeichnis /etc/apache2/vhosts.d
braucht man für jeden virtuellen Server eine Konfigurationsdatei.
# Beispiel für eine Konfigurationsdatei eines virtuellen Hosts: # Dateiname: project.conf <VirtualHost *:80> ServerName project.gruber DocumentRoot /srv/www/htdocs/project # RewriteEngine On # RewriteCond %{HTTPS} !=on # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Directory "/srv/www/htdocs/project"> Options FollowSymLinks AllowOverride All Require all granted </Directory> <Location /> Options FollowSymLinks AllowOverride None </Location> </VirtualHost> <VirtualHost *:443> ServerName project.gruber DocumentRoot /srv/www/htdocs/project SSLEngine on SSLCertificateFile /etc/apache2/ssl.crt/server.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server.key <Directory "/srv/www/htdocs/project"> Options FollowSymLinks AllowOverride All Require all granted </Directory> <Location /> Options FollowSymLinks AllowOverride None </Location> </VirtualHost>
Namensauflösung
Für die Namensauflösung von Internet Domains sind diverse DNS Server zuständig. Betreibt man virtuelle Hosts aber auf einem Server im LAN bzw. auf einem Testrechner, muss man selber dafür sorgen, dass der jeweilige Hostname einer IP Adresse zugeordnet wird.
- Das geschieht am einfachsten in der Datei /etc/hosts:
# Beispiel für virtuelle Hosts 127.0.0.2 contao.localdomain contao 127.0.0.3 project.localdomain project ...
Für mich hat diese Lösung auf meinem Testrechner jedenfalls funktioniert.
Virtuelle Hosts für Systembenutzer bereitstellen
- Die UserDir Konfiguration erfolgt innerhalb eines virtuellen Hosts.
- Auch der Standardserver muss als virtueller Host konfiguriert werden, in unserem Fall ist das die Datei
hs-irgendwo.at.conf
# hs-irgendwo.at.conf <VirtualHost *> DocumentRoot /srv/www/htdocs <Directory "/srv/www/htdocs"> allow from all Options +Indexes </Directory> ServerName hs-irgendwo.at DirectoryIndex index.html index.php HeaderName /HEADER.html </VirtualHost> <IfModule mod_userdir.c> UserDir public_html Include /etc/apache2/mod_userdir.conf </IfModule>
- Standardzeichensatz setzen
AddDefaultCharset utf-8
Server konfigurieren für SSL
- Apache für SSL konfigurieren
Falls notwendig, das Modul mod_ssl aktivieren
a2enmod ssl
Dieser Befehl ergänzt die Variable $APACHE_MODULES in der Datei /etc/sysconfig/apache2
um den Eintrag "ssl"
# /etc/sysconfig/apache2 APACHE_TIMEOUT="30"
... damit genug Zeit bleibt für Eingabe der Passphrase beim Starten des Apache, falls Server Key durch Passphrase geschützt ist.
# /etc/apache2/httpd.conf.local NameVirtualHost *:80 NameVirtualHost *:443
SSL Zertifikat erstellen
Die folgenden Anweisungen sind der Seite http://wiki.ubuntuusers.de/Apache/SSL entnommen. Ich habe die Pfade an die Suse Konfiguration angepasst.
Privaten Schlüssel erzeugen
openssl genrsa -out /etc/ssl/private/myserver.key 2048
Zertifikat erstellen
Dieser Befehl erstellt ein selbst signiertes Zertifikat.
openssl req -new -x509 -key /etc/ssl/private/apache.key -days 365 -sha256 -out /etc/ssl/certs/apache.crt
- Zertifikat verteilen an Benutzer
Da das Zertifikat nicht von einer beglaubigten Stelle verifiziert ist, soll folgende Datei an die Benutzer ausgehändigt werden:
/etc/apache2/ssl.crt/ca.crt
- Import des Zertifikats in den Webbrowser
Damit beim Herstellen einer verschlüsselten Verbindung nicht die Warnung vor einem ungültigen Zertifikat erscheint, sollte diese Datei in den Webbrowser importiert werden. Siehe: http://wiki.fernuni-hagen.de/helpdesk/index.php/Zertifikat_importieren
SSL Zertifikate über Letsencrypt
Siehe Letsencrypt
Zertifikat importieren mit Internet Explorer
- Warnung beim Aufruf einer verschlüsselten Seite
Webseiten, deren Adresse mit "https://" beginnt, werden verschlüsselt übertragen. So ist gewährleistet, dass das beim Login einzugebende Passwort nicht abgefangen werden kann.
Beim Aufruf einer durch SSL verschlüsselten Seite (z.B.: https://t2792.greatnet.de) erscheint im Internet Explorer eine Warnung:
Die Warnung erscheint deswegen, weil das Zertifikat nicht von einer beglaubigten Organisation ausgestellt wurde, was sehr teuer ist.
Wenn man auf Laden dieser Seite fortsetzen klickt, kann man die Seite aber trotzdem öffnen.
- Warnung deaktivieren
Im IE das Dialogfenster Extras / Internetoptionen öffnen. Dann auf der Registerkarte Inhalte auf Zertifikate klicken.
Jetzt kann man eine Zertifikatsdatei importieren. Es startet ein Assistent. Dieser führt Schritt für Schritt durch den Importvorgang.
Wichtig: Am Schluss noch die Option Zertifikatspeicher automatisch auswählen anklicken, sonst funktioniert es nicht.
Alle anderen Fragen mit "Ja" beantworten bzw. die voreingestellten Werte übernehmen.
Nach dem erfolgreichen Import der Zertifikatsdatei sollte der Zugang auf die verschlüsselte Seite ohne Sicherheitswarnung möglich sein.
DocumentRoot einbinden
Probleme mit Zugriff auf die DocumentRoot /srv/www/htdocs
lösen durch Einbinden einer neuen DocumentRoot über Bind Mounts in der /etc/fstab
/suse_old/srv /srv none bind 0 0
Troubles
Verzeichnis für icons
In der DocumentRoot soll sich kein Ordner mit dem Namen icons befinden.
- Es existiert im Apache ein Alias icons, der auf einen Ordner zeigt, welcher die Icons für die Indexdarstellung des Apache Servers enthält. Erstellt man einen eigenen Ordner mit dem Namen icons in der DocumentRoot, so wird dessen Inhalt im Browser nicht angezeigt sondern man bekommt den Inhalt des erwähnten Alias zu sehen.
Lösung: Ich habe meine eigenen Icons, die ich in verschiedenen PHP Projekten brauche, in include/icons
abgelegt. Auf diesen Ordner verweist ein Symlink:
cd /srv/www/htdocs/virtualhost ln -s include/icons myicons
Dieser Symlink muss in der DocumentRoot jedes virtuellen Hosts angelegt werden.
Cannot define multiple Listeners on the same IP:port
Listen 80 Listen 443
Diese Directiven dürfen nur einmal definiert sein.
- In
/etc/apache2/listen.conf
oder in/etc/apache2/default_server.conf
Ich habe diese Einträge aus /etc/apache2/default_server.conf
entfernt.
Siehe mein Posting https://serversupportforum.de/forum/webserver/61206-cannot-define-multiple-listeners-same-ip-port.html