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

   Allow from 127.0.0.0/255.0.0.0 ::1/128

Modul mod_userdir

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">

Softlinks folgen

In der Datei

/etc/apache2/default-server.conf

DocumentRoot konfigurieren:

Options FollowSymlinks

Standard Dateiberechtigungen

# /etc/sysconfig/apache2
umask 0002

Siehe https://stackoverflow.com/questions/428416/setting-the-umask-of-the-apache-user

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.

Man kann die Zuordnungen in die Datei /etc/hosts eintragen:
# Beispiel für virtuelle Hosts auf dem lokalen Rechner
127.0.0.1   contao.localdomain contao
127.0.0.1   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

SSL

Konfiguration

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/listen.conf
Listen 80
Listen 443
# /etc/apache2/default_server.conf
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

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