Kompilierung von Apache

#Befehle zur Vorbereitung
apt-get update
apt-get upgrade
apt-get clean
apt-get install build-essential
apg-get install checkinstall
cd /usr/local/src
mkdir lamps
cd lamps

#Installation OpenSSL
wget http://www.openssl.org/source/openssl-1.0.1p.tar.gz
tar -xzvf openssl-1.0.1p.tar.gz
cd openssl-1.0.p
./config --prefix=/usr/local/openssl
make
make test
checkinstall --fstrans=no #Paketname, Defaulteinstellungen lassen

#Installation Webserver
cd /usr/local/src/lamps
wget http://mirror.switch.ch/mirror/apache/dist/httpd/httpd-2.2.31.tar.gz
#Apache wird nun als DSO-Version kompiliert->Module wie PHP können dynamisch geladen werden.
#\-verwenden um den Befehl auf Zeilen aufzuteilen
tar -xzvf httpd-2.2.3.1.tar.gz
cd httpd-2.2.31/
/configure \
--prefix=/usr/local/apache2 \
--enable-modules=most \
--enable-shared=max \
--enable-ssl \
--with-ssl=/usr/local/openssl
make
checkinstall --fstrans=no
cd

#Status der installierten Pakete
dpkg -s openssl
dpkg -s httpd
#Alle dazugehörigen Dateien anzeigen
dpkg -L openssl | less
dpkg -L httpd | less
#Paket entfernen
dpkg -r openssl

Apache – Fehlerlogging

ErrorLog

#Beispiel
ErrorLog /var/log/mylog.log | syslog[:facility]
#Standard
ErrorLog logs/error_log

#Standard LogLevel
LogLevel error

Es gibt folgende Log-Level:

  • emerg
    • Notfallmeldungen
    • System nicht benutzbar
  • alert
    • Schnelle Eingriffe nötig
  • crit
    • Kommunikationsprobleme
    • Kritische Bedingungen
  • error
    • Script kann nicht richtig ausgeführt werden
  • warn
    • Situation nicht ganz richtig
    • Apache konnte keine Lösung finden
    • “chilc process XXXX did not exist”
  • notice
    • Meldungen wie Neustart
  • info, debug
    • nur für Entwickler interessant

Zugriffslog

#Standard
LogFormat "%h %l %u %t \"%r\" %>s %b"
#modul: mod_log_config

Variablen

Variable
Bedeutung
%b Anzahl Bytes ohne HTTP-Header
%f Clientname dessen der die Datei anfordert
%{Variable}e Hier kann eine Umgebungsvariable eingebaut werden
%h Off: IP wird protokolliert
On: Lookup der IP -> Name wird protokolliert
%a “, der FQDN wird aber stattdessen protokolliert
%{Header}i Headerteil; bsp {Referer} – die Verweisquelle ist erwähnt
%l Name vom Clientrechner mit identd
%{note}n mitprotokollieren der notes, die zwischen Modulen ausgetauscht werden
%{Header}o BSP:  %{LastModified }o – das Datum der letzten Änderung der ausgelieferten Datei wird protokolliert
%p Portadresse des Servers
%P ProzessID PID des Apache-Prozesses, welcher die Anfrage beantwortet hat
%r erste Zeile der Clientanforderung
%s HTTP-Statuscode
%t Zeitangabe
%{format}t Eine formatierte Zeitangabe. Der Eintrag
%{%A, %d. %B %Y %H:%M:%S %Z}t
liefert die Ausgabe
Sunday, 12. Juni 2016 19:20:08 Westeuropäische Sommerzeit
%T benötigte Zeit fürs Ausführen der Anfrage
%u Username, der bei einer Benutzerabfrage gewählt wurde
%U URL-Pfad der Anfrage
%v Name des entsprechenden virtuellen Servers
%V Name des virtuellen Servers, abhängig von der UseCanonicalNames-Direktive

CustomLog

#Beispiel
CustomLog logs/access.log "%h %l %u %t \"%r\" %>s %b"

FTP

Benutzer & Gruppen anlegen

#Falls noch keine FTP-Gruppe vorhanden ist:
groupadd ftpuser
#Hinzufügen der User, mit -g Gruppe definieren, mit -m ein Homeverzeichnis erstellen, mit -c Kommentar angeben
useradd ftp-user1 -g ftpuser -m -c ftp-Benutzer1

Serverordner-Eigentümer berechtigen

chown ftp-user1 /srv/.../user1/ -R
chgrp ftpuser /srv/.../user1/ -R
chmod 755 /srv/.../user1/ -R

proFTP konfigurieren

Einige Eintragsauszüge der proftpd.conf:

ServerName "my-ftp-server"
ServerType standalone
DefaultRoot ~/ ftpuser
#alle User nicht reinlassen (ausser Gruppe ftpuser)
<Limit Login>
   DenyGroup !ftpuser
</Limit Login>
#Start/Stop
/etc/init.d/proftpd start
/etc/init.d/proftpd start

 

Apache – Virtualhosts

Wie bereits erwähnt, können über das HTTP 1.1 -Protokoll bestimmte Seiten geliefert werden. Diese können mit Vhosts konfiguriert werden.

Ip-Basiert

Früher konnten Webseiten nur IP-basiert gemacht werden. Dies ist der DocumentRoot-Eintrag.

<VirtualHost 192.168.220.10>
        DocumentRoot /usr/local/apache2/htdocs/vhosts/1page
</VirtualHost>

Listen

Listen 192.168.200.5:80

Namensbasiert

<VirtualHost 192.168.200.5>
     DocumentRoot /usr/local/apache/htdocs/vhosts/mypage
     ServerPath /mypage
     ServerName mypage.ch
     ServerAlias www.mypage.ch
</VirtualHost>

Portbasiert

<VirtualHost 192.168.200.5:8888>

Testen der Konfiguration ohne den Server neu zu starten:

/usr/local/apache2/bin/httpd -t -D DUMP VHOSTS

Apache – Berechtigungen

Auf einem Apache-Webserver lassen sich Berechtigungen geben. Sei dies mit der Konfiguration oder dem .htaccess-File.

Achtung: Es muss unter Umständen konfiguriert werden, dass die .htaccess-Datei die Berechtigungen steuern kann.

Ein Beispiel für einen Unterordner, der in jedem vhost enthalten ist:

<Directory /var/www/virtualhosts/*/download/>
...
</Directory>

(Fast) Dasselbe gilt auch für Files: (Beispielsweise eine Adminseite, die nur mit entsprechenden Rechten aufrufbar sein soll)

<Files /var/www/virtualhosts/*/admin.php> 
     AuthName “Admin-Seite” 
     AuthType Basic
     AuthUserFile /apache2/passwords/admin.passwd 
     AuthGroupfile /apache2/passwords/admin.groups 
     Require Group webpage-admin
 </Files>

So müsste man sich mit dem entsprechenden Benutzer anmelden.

Location

Dies lässt zu, Verzeichnisse zu steuern, obwohl sie beim Dateisystem nicht vorhanden sind.

<Location /nothinghere>
</Location>

Reihenfolge

  • <Directory>
  • <Files>
  • <Location>

Authentifizierung

Benutzerdatei erstellen

Benutzer, die verwendet werden, um Zugriffe auf Webseiten zu steuern müssen mit htpasswd unter /usr/local/apache2/bin diese dort erstellt werden.

hostname:~ # /usr/local/apache2/bin/htpasswd -c  \
>/usr/local/apache2/passwords/.htpasswd testuser
New password:****
Re-type new password:****

Standardmässig sind diese Benutzer mit Crypt verschlüsselt.

AuthTypes

  • Basic
    • Funktioniert bei allen Browsern
    • Ist verfügbar, wenn das Modul mod-auth aktiv ist
    • Nicht verschlüsselt
  • Digest
    • benötigt das Modul mod_auth_digest
    • Wird mit md5-Hash verschlüsselt
    • Realm&Zufallswert werden gesendet, damit – auch wenn der Realm bekannt ist, noch Sicherheit da ist.
    • Digest wird noch nicht von allen Browsern unterstützt
#AuthName
AuthName Realm
#AuthUserFile
AuthUserFile Dateiname #Verweis auf entsprechende Passwortdatei (meist .htpasswd)
#AuthGroupFile
AuthGroupFile Dateiname #Gruppendatei, meist .htgroup
#require
Require Nutzerart (Nutzernamel][Nutzername2] #Legt fest, wer zugreifen darf
#user
require user benutzer1, benutzer2 #Benutzer, die nach PW-Eingabe Zugriff haben
#group
require group gruppe1
#valid-user
require valid-user #es werden alle berücksichtigt, die in der entsprechenden Passwortdatei vorhanden sind.

Deny, Allow

Deny from all | host
Allow from all | host
Order [Sortierung]
Allow from www.ichdarf.com
Allow from 192.168.1.10

Satisfy

Macht nur Sinn, wenn Benutzer und Deny, Allow verwendet werden.
Beispiele:

Order deny, allow 
Deny from all
Allow from localhost 
AuthType Basic
AuthName "Ordner Bezeichnung"
AuthUserFile /usr/local/apache2/passwords/.htpasswd 
Require user testuser
Satisfy any

Bei Satisfy any kann ein Benutzer von localhost ohne Zugangscheck zugreifen. Von einer anderen Domain muss die Zugangskontrolle durchgeführt werden. Bei Satisfy all müssen Benutzer von localhost auch den Zugangscheck machen, alle andern dürfen dann gar nicht mehr.

Benutzermanagement

Bei wenigen Benutzern macht es sinn, nur Benutzerdateien zu haben. Bei grösseren Mengen, ist es eher geeignet, dafür Datenbanken zu verwenden.

  • DBM
    • DBM-Datenbanken sind eigentlich nur Dateien, die über Unix vorhanden sind
    • Apache bietet das Modul mod_auth_dbm
    • Beispieltool: dbmmanage
  • MySQL
    • Zugriffsgeschwindigkeit ist höher als bei Textdateien
    • Modul mod_auth_mysql
  • LDAP
    • Grosser Verzeichnisdienst
    • Verwaltung von diversen Informationen
    • Wird auch sonst als zentrale Login-Möglichkeit verwendet
    • Modul mod_auth_ldap

Handler

  • Server-Status
  • Server-Info
SetHandler NameHandler
#Beispiel Serverstatus
SetHandler server-status

#Beispiel Zugriff auf Server-Info
<Location /server-info>
     AuthType Basic 
     AuthName "Server-Info" 
     AuthUserfile /usr/local/apache2/passwords/admin.passwd 
     Require Valid-User
     SetHandler server-info 
 </Location>

 

 

 

httpd.conf

Pfad: /usr/local/apache2/conf/httpd.conf

ServerRoot

ServerRoot "/usr/local/apache2"

PidFile

Hier ist definiert, wo die Verzeichnisse conf  & logs zu finden sind:

PidFile logs/httpd.pid

In dieser Datei ist auch die aktuelle ProzessID. So kann die Prozessnummer ausgelesen und “gekillt” werden:

Kill -USR1 ’cat /usr/local/apache2/httpd.pid'

Listen

Hier lässt sich die Portnummer des HTTP-Servers angeben. Wenn eine andere Portnummer unter 1024 genommen wird, muss der Server mit root-Rechten neu gestartet werden.

Listen 80
Listen 192.170.2.1:80
Listen 192.170.2.5:8000

ServerName

ServerName localhost:80

User, Group

Sobald der Apache startet, muss er mit Benutzerrechten auf die Serverdaten zugreifen. Diese User heissen meist wwwrun, www-data, httpd, apache usw.

User daemon
Group daemon

DocumentRoot

DocumentRoot /usr/local/apache/htdocs

ErrorDocument

ErrorDocument 404 "<h1>Ups, nothing found</h1>"
ErrorDocument 404 /error/404.php
ErrorDocument 404 http://404.com/

IndexOptions

IndexOrderDefault Descending Size

IndexIgnore *.php .?? #Dateien wie .php oder .htaccess nicht anzeigen

AddIcon

AddIcon /srv/icon.ico *.png

Weitere Varianten:

#DefaultIcon
Defaulticon /srv/icon.ico
#AddIconByEncoding
AddIconByEncoding (CMP, /srv/icon.gif) x-compress x-gzip
#AddIconByType
AddIconByType (SND,/srv/soundicon.gif) audio/
#AddAlt
AddAlt TXT *.txt
#AddDescription
AddDescription "theseareimages" *.jpg

 

LAnguage

LanguagePriority de en fr
AddLanguage de de
AddLanguage en en
AddLanguage fr fr
Options +MultiViews
DefaultLanguage de

<Directory> -Tag

Durch Beschränkungen von Richtlinien auf einzelne Ordner können Indizes und Icons besser gesteuert werden. Dies funktioniert auch mit <Files> und <Location>.

<Directory /folderuwant/download>
IndexOptions ...
AddIconByType ...
</Directory>

Übersicht Apache

Installationsstruktur

Unter /usr/local/apache2/ befinden sich folgende Ressourcen:

  • bin
    • Alle ausführbaren Programme, die zu Apache  gehören
  • cgi-bin
    • Das Programm printenv lässt einem Umgebungsvariablen von Apache (sofern Perl installiert ist) anschauen
  • conf
    • Hier sind die Apache-Konfigurationsdateien abgelegt. Die wichtigste davon ist httpd.conf. Falls einmal Konfigurationsdateien verstellt sind, ist die httpd.conf.default vorhanden, auf die man allenfalls zurückwechseln könnte
  • error
    • Ort der HTTP-Fehlerdokumente
  • htdocs
    • Standardverzeichnis für HTML-Seiten
  • icons
  • logs
    • Logfiles
  • manual
    • englische Dokumentation
  • modules
    • Die hinzugefügten Module (weitere können dynamisch dazugeladen werden)

Start/Stop

Folgende Befehle können verwendet werden, um den Apache-Server zu steuern:

/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl restart