Apache

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen

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:

  1. Erstellung eines Softlinks /usr/sbin/htpasswd, der auf /usr/sbin/htpasswd2 verweist.
  2. Erstellung eines weiteren Softlinks /usr/bin/htpasswd, der auch auf /usr/sbin/htpasswd2 verweist.
  3. 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:

IE Zertifikat 1.png

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.

IE Zertifikat 2.png

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.

IE Zertifikat 3.png

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