#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
Schlagwort: Webserver
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 – 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>
HTTP-Protokoll
HTTP-Anfrage
Sending request: GET /nonexistent.html HTTP/1.1 Host: www.google.ch User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Referer: http://www.rexswain.com/httpview.html Connection: close Receiving Header: HTTP/1.1·404·Not·Found(CR)(LF) Cache-Control:·private,·max-age=0(CR)(LF) Date:·Mon,·11·Jun·2019·04:11:23·GMT(CR)(LF) Expires:·-1(CR)(LF) Content-Type:·text/html;·charset=UTF-8(CR)(LF) Server:·gws(CR)(LF) X-XSS-Protection:·0(CR)(LF) Transfer-Encoding:·chunked(CR)(LF) Connection:·close(CR)(LF)
Sending Request
Methode |
Bedeutung |
CONNECT |
|
DELETE |
|
GET |
|
HEAD |
|
OPTIONS |
|
POST |
|
PUT |
|
TRACE |
|
Client Header
HTTP-Header |
BEDEUTUNG |
Accept | Beispiel: Accept: style/css
|
Accept-Charset | Beispiel: Accept-Charset: ISO 8859-1
|
Accept-Encoding | Beispiel: Accept-Encoding: gzip
|
Accept-Language | Beispiel: Accept-Language:de, en, fr
|
Authorization | Beispiel Basic: Authorization: nutzername passwortBeispiel Digest:Authorization: Digest username=”me”, realm=”iwantin@localhost’; nonce=”Iss9zb710qdd2e0e86cIdOf6606ss0c099″, uri=“/no/download/”, qop=auth, nc=00000001, cnonce=”3ag5116b”, response=”6d59fae497t3b05332951k55222c4ef1 “, opaque=”5cdhh69c8ln9baf9f0171e951ff4fe41″‘
|
Cache-Control | Beispiel: Cache-Control: min-fresh = 5000
|
Cookie | Beispiel: Cookie: CookieDaten=982
|
From
|
Beispiel: From: test@modul239.com
|
Host | Beispiel: Host: iet-gibb.raphaelphoto.ch
|
Referer
|
Beispiel: referer: google.com
|
User-Agent
|
Beispiel: User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
|
Via
|
Beispiel: Via: SIP/2.0
|
Body
Bei der Client-Anforderung ist es möglich, einen Body mitzusenden. Beispielsweise bei POST-Method Formularen. Die Werte stehen dann im Body der Anfrage. Bei PUT wird die zu übertragene Datei auch im Body mitgesendet.
Serverantwort
Codes
- 100er: Informationsmeldungen
- 200er: Erfolgsmeldungen
- 300er: Umleitungsmeldungen
- 400er: Clientbasierte Fehlermeldungen
- 500er: Serverbasierte Fehlermeldungen
Wichtigste Meldungen
200 OK | Die Daten wurden wie gewünscht versendet. Das sollte der Normalfall sein! |
203 Non-Authoritative | Der Statuscode enthält zusätzliche Informationen, Information, die nicht vom angeforderten Server selbst kommen, sondern von einer anderen Software, die auf dem Server-System eingesetzt wird, beispielsweise einem Proxy-Server |
301 Moved Permanently | Die Daten sind vorübergehend unter einem anderen Anfrage-URI erreichbar. Die neue Adresse wird in der Antwort mit angegeben. Webbrowser fordern dann diese Adresse an und der Benutzer merkt davon nichts. |
404 Not Found | Die Daten wurden nicht gefunden. Dieser Statuscode entsteht oft, wenn Benutzer per Hand einen komplexen Anfrage-URI in den Browser eintippen und sich dabei verschreiben. |
500 Internal Server Error | Die Daten werden nicht gesendet, weil auf dem Server ein Fehler aufgetreten ist. Meistens konnte ein CGI-Skript nicht gestartet werden. |
Weitere Meldungen und Spezifikationen können unter https://www.w3.org/Protocols/rfc2616/rfc2616.txt eingesehen werden.
Header
Im Header, der vom Client an den Server gesendet wird können praktisch alle bereits erwähnten Header verwendet werden. Es gibt noch einige zusätzliche. Hier sind einige Beispiele:
- Cache-Control
- public: darf zwischengespeichert werden
- private: antwort darf nicht zwischengespeichert werden
- Retry-After
- Retry-After 3600
- Kann verwendet werden, wenn Anfragen erneut gesendet werden können (Bsp. Error 503)
- WWW-Authenticate
- WWW-Authenticate: Basic realm=”something”
- Liefert Informationen für die Zugangskontrolle
Bei solchen Headerantworten kommt anschliessend immer eine Leerzeile.
WebDAV
Beim HTTP-Protokoll gibt es nicht wirklich eine Möglichkeit, gemeinsam an Dokumenten zu arbeiten. Es gibt aber eine Erweiterung: WebDAV (Web based Distributed Authoring and Versioning).
So lassen sich gemeinsam Dokumente bearbeiten und teilen. Bearbeiter können damit auch Dokumente Sperren und weiter bearbeiten ohne Netzwerkverbindung zu haben.
Es können auch Metadaten zugeordnet werden (Bsp. Autorname)
Namespace-Management
Methode |
Bedeutung |
COPY | Kopiert Collections und Ressourcen innerhalb eines zusammenhängenden Namensraums |
LOCK | Setzt für den Überschreibschutz eine Sperre auf eine Collection oder Ressource. |
MOVE | Verschiebt Collections und Ressourcen innerhalb eines zusammenhängenden Namensraums. |
MKCOL | Erzeugt eine neue Collection. |
PROPFIND | Liest Metadaten von Ressourcen oder Collections. |
PROPPATCH | Schreibt Metadaten von Ressourcen oder Collections. |
UNLOCK | Gibt eine gesperrte Collection oder Ressource wieder frei. |
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>
DMZ
Die Abkürzung „DMZ“ steht für eine demilitarisierte Zone. Dies gibt es auch im Netzwerkbereich. Die Hauptanwendung für eine DMZ sind Server, die vom internen sowie externen Netz verfügbar sein müssen. Sicherheitstechnisch ist es relativ schlecht, einen direkten Zugriff auf das interne Netz zuzulassen.
Screened Subnet
Screened Subnet bedeutet, dass ein zusätzliches Netzwerk zwischen dem Internet und dem internen Netz geschaltet wird. Dies ist wieder mit einer Firewall auf beiden Seiten geschützt. Es ist auch möglich, zusätzliche Sicherheit zu schaffen, indem man Firewalls verschiedener Hersteller hintereinander schaltet und Angriffe durch mehrere Netzwerke kommen müssen.
Screened Host
Eine einfachere und meist günstigere Variante ist, ein Gerät im internen Netz als DMZ-Gerät zu definieren. Dieses Gerät hat drei Netzwerkkarten (1x fürs Internet, 1x fürs interne Netz, 1x für die DMZ). Wenn aber das Gerät mit den drei Netzwerkkarten geknackt wird, ist das ganze interne Netzwerk inklusive der DMZ für den Angreifer offen.
Honeypot
Eine andere Möglichkeit, die DMZ vor Angreifern zu schützen sind sogenannte Honeypots. Dies sind Hosts im Netzwerk, die Angreifer auf sich ziehen sollen und einfacher zu knacken sind als der Rest. So ist das Risiko, dass die produktiven Server angegriffen werden weniger hoch und Angriffe lassen sich sehr genau analysieren.