====== Apache ====== Der [[wpde>Apache HTTP Server]] ist ein (auf vielen Plattformen verbreiteter) Webserver und im Moment der meist eingesetzte Webserver ist. Er hat eine modulare Erweiterungsmöglichkeit und ist detailliert zu konfigurieren. [[http://httpd.apache.org/|Apache Foundation Homepage]] {{:apache:apache_webserver_sicherheitsstudie.pdf|BSI Apache webserver sicherheitsstudie.pdf}} oft benutzte Funktionen: * [[virtuelle Server]] * [[htaccess|.htaccess Passwortschutz]] * [[netzwerke:WebDAV]] ("Webordner") * [[SSL]] (Verschlüsselung) * [[Sicheres Hosting mit suExec und fcgid]] * [[http://www.linux-fuer-alle.de/doc_show.php?docid=67&catid=4|Mini-Apache (< 400 kB)]] * [[Apache Tuning]] * [[programmiersprachen:perl#perl_mit_apache|Perl-Skripte]] * [[Installation als Apache-Modul für basic Auth mit GoogleAuthenticator]] * siehe auch: [[Software:Tomcat]] ([[programmiersprachen:Java]]-Integrationen) ===== Links ===== * [[http://uk.geocities.com/dom2319/apache_webdav_quota/|Debian Apache 2 WebDAV server with quota using SSL and MySQL for authentication]] * [[http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html|Speed Up Sites with htaccess Caching]] ===== Installation (allgemeingültig) ===== **kompilieren** aus den Quellen: entpacken (tar), ./configure, make, make install\\ oder als **Paket** installieren: * rpm-Paket: ''rpm -i PAKETDATEI.rpm'' bzw. * deb-Paket: dpkg -i PAKETDATEI.deb Aus **Repository**(Verzeichnis von Paketen,Paketquelle): yast, yum, apt ===== Pakete für LAMP ===== In [[ubuntu:Ubuntu]] und [[debian:Debian]] reicht eine Zeile für die verbreitete Kombination aus Apache, [[programmiersprachen:php]](Version 5, die alte Version 4 wird ende 2007 nicht mehr unterstützt) und [[datenbanken:MySQL]]. sudo aptitude install apache2 php5 mysql-server Dabei werden die Abhängigkeiten korrekt aufgelöst, beispielweise das Modul für Apache (mod_php5 bzw. als Paket libapache2-mod-php5). ===== Der Dienst (daemon) Apache ===== **Apache läuft als eigener Benutzer** unter ^ Distribution ^ Benutzer ^ Gruppe ^ | [[Suse:Suse]] | wwwrun | www | | [[Debian:Debian]] | www-data | www-data | ==== Änderungen bei Apache 2.4.x ==== Apache 2.4.x macht in vielen Fällen eine Anpassung der Konfiguration nötig. Das betrifft vor allen die Regelung der Zugriffsrechte auf Verzeichnisse: [[https://httpd.apache.org/docs/2.4/upgrading.html|Upgrading to 2.4 from 2.2]] Fehlermeldung "AH01630: client denied by server configuration" kommt z.B. wenn gar keine Require-Regeln angegeben sind, Lösung: Order allow,deny Allow from all Require all granted ===== Konfiguration ===== Syntax gemachter Änderungen testen: apache2 -t bzw. bei Apache 1.x apache -t ==== Dateien ==== /etc/apache2/httpd.conf dort befindet sich allerdings bei den meisten Distribution nur eine fast leere Datei, die eigentlichen Einstellungen sind dann in ''apache2.conf'' (Ubuntu, Debian?) bzw. in ''default-server.conf'' (Suse). ==== Direktiven ==== Direktiven sind Konfigurationsanweisungen die das Verhalten des Webserver beeinflussen. Sie haben entweder globale oder lokale (z.B. bei einem virtuellen Webserver oder innerhalb einer ''.htaccess''-Datei). [[http://httpd.apache.org/docs/2.0/de/mod/directives.html|Verzeichnis der Direktiven]] Wichtige Direktiven sind z.B. * **Servername** (gibt den FQDN auf dem der Server antwortet) * **Listen** (überschreibt den Servername, normalerweise steht hier nur der Port 80 drin), Wenn man den **Apache nur lokal** aufrufbar machen will sollte man (in ports.conf bei Debian, Ubuntu) ''Listen 127.0.0.1:80'' reinschreiben * **ServerRoot** (Basispfad des Webservers) * **DocumentRoot** (Basispfad der Webseiten) Je nach Distribution: /srv/www/htdocs/ (neuere Suse) /var/www/ (Debian, Ubuntu) /usr/local/httpd/htdocs/ [[http://www.hepi.edu.ge/manual/de/mod/core.html|Auflistung wichtiger Direktiven aus mod_core (immer verfügbare Kernfunktionen)]] ==== IPv6 ==== Apache braucht keine explizite Anpassung für IPv6 wenn "Listen 80" oder "Listen 443" benutzt wird, außer in z.B. virtuelle Hosts werden explizit bestimmte IPs gebunden. ==== Sicherheitsfallstricke beim shared Hosting ==== * kein mod_php benutzen (alles unter gleicher uid!) * fpm oder fcgid ist sicher aber nur wenn FollowSymLinks deaktiviert ist * das muss durch SymLinksIfOwnerMatch ersetzt werden! Siehe https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ * .htaccess dürfen dann kein FollowSymLinks enthalten ((suchen: find . -name .htaccess -type f -exec grep FollowSymLinks {} \; -exec echo {} \;)) ===== starten / neustarten / stoppen ===== * Entweder mit ''apachectl'' apachectl restart OR apachectl graceful apache2ctl restart OR apache2ctl graceful * oder über Initskripte: /etc/init.d/apache2 reload reload => Neuladen der Konfiguration ohne große Arbeitsunterbrechung, auch ''graceful'' benannt; stattdessen sind z.B. auch **start, stop oder restart** möglich. __**Ort der Initskripte:**__ ^ Distribution ^ Befehl ^ | [[Suse:Suse]] | /etc/rc.d/apache[2] restart | | [[Debian:Debian]] | /etc/init.d/apache[2] restart | Die Klammer [2] besagt natürlich nur, dass man hier entweder apache oder apache2 eingibt, je nachdem welche Version man einsetzt. Anmerkung: Bei aktuellen OpenSuse-Distributionen ist ''rc.d'' ein Verweis auf ''init.d'' ===== Logdateien ===== Der Standard-Ort für Logdateien ist ''/var/log/apache2''. Dort werden error.log (Fehler) und access.log (Seitenzugriffe) abgelegt. ==== Auswertung ==== * [[server:logwatch]] * [[scanerrlog]] (Zusammenfassung der Fehler als text, html, xml, pdf) * [[http://www.backhand.org/mod_log_spread/|mod_log_spread]] * [[http://www.monitorware.com/en/syslog-enabled-products/syslog-apache.php|mod_dosevasive]] ==== piped-logs ==== Eine **Umleitung der Logdateien** ist auch über Programme von Drittherstellern oder eigene [[shellscripts:shellscripts|shellscripten]] möglich. Dazu muss ein Eintrag der Form CustomLog "| /pfad/zur/programmdatei" common angelegt werden. Dies kann z. B. ein simples [[Shellscripts:Shellscripts|Shellscript]] sein. #/bin/bash cat $@ >> access.log :!: Das angegebene Programm wird mit root-Rechten ausgeführt! Jedes Sicherheitsproblem ist hier kritisch. Auch Hintertüren lassen sich so platzieren. :!: Bei sehr vielen virtuellen Hosts und Logdateien könnte die Anzahl der Dateihandler nicht ausreichen. Apache benutzt selbst 20-30 plus 2 pro Log. Unter [[linux:Linux]] sind 1024 Dateihandler möglich, falls dies nicht ausreicht kann man mit ulimit -S -n 8192 die Anzahl auf 8192 anheben. ==== Protokollierung auf syslog ==== Apache kann seine Logdateien auf über [[linux:systemprotokolle|syslog]] oder [[software:syslog-ng]] ausgeben. Gerade bei Web-Server-Clustern oder wenn man (berechtigterweise) vermutet dass ein Angreifer die Logs löscht, ist diese Konfiguration von Vorteil. * **Fehlerlogs**: Durch die Einstellung ErrorLog ErrorLog syslog:local1 local1 ist die facility (Standard: local7). Auf dem Zielhost leitet man die facility local1 in eine eigene Datei. Beachten sollte man allerdings, dass pro Abschnitt (z. B. pro virtuellem Host) nur eine Errorlog-Direktive ausgewertet wird. D.h. wenn die Errorlog an syslog gehen, dann ist lokal nichts da. Dies lässt sich allerdings mit einem Script umgehen. Zuerst muss müssen wir allerdings die ErrorLog-Ausgabe an ein Script schicken: ErrorLog "|/Pfad/zum/script.sh" Das Zielscript teilt dann die Fehlerausgabe auf: #/bin/sh cat $@ | tee -a /var/log/apache2/error.log | logger -p local7.warn -t Apache2 Erklärung: - Das Programme cat nimmt die Ausgabe von Apache entgegen - tee hängt die Ausgabe an die Datei ''/var/log/apache2/error.log'' an - und letztendlich bekommt logger die Ausgabe von Apache durchgereicht und sendet diese an syslog/syslog-ng. So hat man übrigens auch allgemein **das Problem mehrerer ErrorLogs in Apache2** gelöst. :!: [[software:syslog-ng]] verändert das Format der Logs was die Auswertung schwieriger macht. Deshalb muss über ein Template das Format von [[software:syslog-ng]] verändert werden. * **Transferlogs**: Die Einstellung Transferlog bietet leider keinen direkten Weg zu [[systemprotokolle#syslog]]. Über eine Pipe geht es dennoch. Dazu muss man ein Skript schreiben, dass das lokale Protokoll beschreibt und zusätzlich mittels dem Programm [[systemprotokolle#logger]] zusätzlich an syslog(-ng) sendet. Beispiel Quellcode: #!/bin/sh cat $@ | logger -p local7.notice -t Apache2 Da ein (virtueller) Host mehrere Transfer/CustomLog-Direktiven haben darf gibt man eine für die lokale Speicherung und eins für syslog(-ng) an. === Links === * [[https://lists.balabit.hu/pipermail/syslog-ng/2001-February/001208.html|[syslog-ng]apache logs]] * [[http://www.oreillynet.com/pub/a/sysadmin/2006/10/12/httpd-syslog.html?page=last|Sending Apache httpd Logs to Syslog]] ===== Module ===== Wichtige Module sind * ''mod_php4'' bzw. ''mod_php5'' ([[Programmiersprachen:php]]) * ''mod_ssl'' * mod_cache, disk_cache, mem_cache (die letzten beiden brauchen mod_cache sonst kommt die Meldung ''undefined symbol: ap_cache_cacheable_hdrs_out'' * [[http://www.modsecurity.org/|mod_security]] ,[[http://www.christopher-kunz.de/Apache-Webserver-sichern-mit-mod_security.95.0.html|Hinweise dazu auch hier]]. * mod_cband (Speed, Traffice-limitting) [[http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling|Manage Apache Download Speed And Traffic Limits With mod_cband ]] * [[http://ath.sourceforge.net/|mod_athena]] (loadbalancing) klingt auch ganz nett. * [[http://httpd.apache.org/docs/2.0/mod/mod_isapi.html|mod_isapi - ISAPI Extensions within Apache for Windows]] [[http://www.flyn.org/projects/pam_mount/|mount volumes for a user session]] ==== geladene Module anzeigen ==== * auf der shell: apache2 -t -D DUMP_MODULES * mit [[programmiersprachen:PHP]]: ==== Module (de)aktivieren ==== Apache bindet auch Module von anderen Programmierern ein, dazu muss man einen symbolischen Links (Erzeugung mit ''ln -s [Ziel] [Linkname]'') von dem gewünschten Modul aus ''/etc/apache2/mods_available'' in ''/etc/apache2/mods-enabled'' anlegen (die Pfade können varrieren, aber seine Apache-Konfigurationsdateien sollte man schon suchen können). ^ Befehl ^ Beispielaufruf ^ Zweck des Programms ^ | a2enmod / a2dismod | sudo a2enmod mod_python | (de-) aktiviert Module für Apache (Debian) | | a2ensite / a2dissite | sudo a2ensite Konf1 | (de-) aktiviert Sites für Apache (Debian) | ==== URL-Rewriting (mod_rewrite) ==== Mit mod_rewrite kann man nur schwer lesbare URLs in angenehmere umwandeln und auch Suchmaschinen eine bessere Indizierung ermöglichen. * [[http://www.modrewrite.de/|mod_rewrite]] * [[http://f0rked.com/articles/mod_rewrite|mod_rewrite Demystified: A Brief Guide With Resources]] * [[http://www.addedbytes.com/cheat-sheets/mod_rewrite-cheat-sheet/|mod_rewrite Cheat Sheet (V2)]] :!: Bei [[debian:Debian]] und vielen anderen Standardinstallationen werden werden ''.htaccess''-Dateien für die Konfiguration nicht beachtet ((damit die Konfiguration nicht durch bösartig hochgeladenen Dateien einzelner Benutzer gelockert werden kann)). Daher muss in diesem Fall explizit erlaubt werden dass bestimmte Optionen überschrieben werden können: AllowOverride FileInfo Options "Options" ist für mod_rewrite nicht zwingend nötig. [[http://www.webune.com/forums/how-to-test-check-if-mod-rewrite-is-enabled-t40.html|How To Test Check If Mod_rewrite Is Enabled]] === permanente Umzüge === Wenn man eine Domain oder eine Seite auf eine neue URL umziehen lässt, sollte man korrekt den HTTP-Status 301 (moved permanently) senden. Dann werden sich auch [[suchmaschinen:Suchmaschinen]] die neue URL merken und man bleibt im Suchindex. Die folgendene Konfiguration kann man global in der Apache-Konfiguration einstellen oder in einer ''.htaccess''-Datei im Stammverzeichnis hinterlegen. RewriteEngine On RewriteRule ^(.*)$ http://www.NEUE-SEITE.de$1 [R=301,L] RewriteRule .+ http://www.NEUE-SEITE.de [R=301,L] Wenn rigeros alle (alten) URLs auf die neue Startseite gehen sollen: RewriteEngine On RewriteRule (.*) http://www.NEUE-SEITE.de [R=301,L] :!: Redirect bzw. RedirectMatch werden von aktuellen Apache-Versionen angemahnt wenn flag-Optionen gesetzt sind (hier: ''[R=301,L]''), weil das nur für RewriteRule erlaubt ist. Fehlermeldung ist dann: Redirect: invalid first argument (of three) Action 'configtest' failed. The Apache error log may have more information. failed! === bestimmten Bereich auf SSL umleiten === Ohne mod_rewrite: RedirectPermanent /SUBDIR https://www.DOMAIN.TLD/SUBDIR [[http://joseph.randomnetworks.com/2004/07/22/redirect-to-ssl-using-apaches-htaccess/|Redirect To SSL Using Apache's .htaccess ]] mit mod_rewrite: RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] ==== redirects per PHP ==== === 301 moved permanently (redirect) === Folgenden Code in eine index.php schreiben: === 302 moved temporarily(redirect): === Folgenden Code in eine index.php schreiben: ==== Apache Reverse-Proxy ==== Module Aktivieren (für http + https): sudo a2enmod ssl sudo a2enmod proxy sudo a2enmod proxy_balancer sudo a2enmod proxy_http # [...] ProxyPreserveHost On ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ SSLEngine on # [...] SSLCertificateFile SSLCertificateChainFile SSLProtocol ProxyPreserveHost On ProxyPass / http://localhost:8443/ ProxyPassReverse / http://localhost:8443/ ==== gzip-compression aktivieren ==== Ein großen Effekt auf die Ladezeiten hat es wenn der Webserver die gut komprimierbaren Daten nur gepackt verschickt. Das kostet etwas CPU-Leistung, ist aber die Mühe wert. # compress text, html, javascript, css, xml: AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript # Or, compress certain file types by extension: SetOutputFilter DEFLATE Siehe weitere Details: [[http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/|How To Optimize Your Site With GZIP Compression]]. ==== Basic-Auth an AD (LDAP) ==== Nur Benutzern der Gruppe "MyTrustedUserGroup" den Login erlauben: AuthName "SECRET AREA, Login needed" AuthType Basic AuthBasicProvider ldap AuthLDAPBindDN "CN=BINDING,CN=Users,DC=company,DC=tld" AuthLDAPBindPassword "SECRET-BINDING-PASSWORD" AuthLDAPURL ldaps://fqdn.to.dc/cn=Users,dc=company,dc=tld?sAMAccountName?sub?(objectClass=user) AuthUserFile /dev/null Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=MyTrustedUserGroup,CN=Users,DC=company,DC=tld ===== Security ===== Nur absolut notwendige Informationen anzeigen: ServerSignature Off ServerTokens Prod Bei installiertem PHP sollte die "X-Powered-By:" (Angabe der Versionsnummern im HTTP-Header) in der Config (z. B. ''/etc/php5/apache2/php.ini'') abgeschaltet werden: expose_php = Off * [[http://www.hermann-uwe.de/security/articles/securing-apache-checklist|Securing Apache Checklist]] * [[http://www.apacheweek.com/security/|Apache Security @ apacheweek]] * [[http://www.securityfocus.com/infocus/1694|Securityfocus: Securing Apache Teil1]] * [[http://www.securityfocus.com/infocus/1786|Teil2]] * [[http://blog.stuartherbert.com/php/2007/12/18/using-suexec-to-secure-a-shared-server/| Using suexec To Secure A Shared Server]] ==== mod_security ==== * [[http://www.linuxtoday.com/infrastructure/2006071300426OSHLNT|HowtoForge: Secure Your Apache With mod_security]] * [[http://www.heise.de/security/artikel/69070|mod_security]] * [[http://www.securityfocus.com/columnists/418|mode_security 2.0 Inteview mit Ivan Ristic]] * [[http://www.modsecurity.org/projects/console/index.html|ModSecurity Console]] ===== CGI und Perl ===== [[http://de.selfhtml.org/perl/intro.htm|Perl Intro]] [[http://aktuell.de.selfhtml.org/links/cgiperl.htm|Links zu Perl]] [[http://www.webdeveloper.com/cgi-perl/|CGI and Perl]] ===== Apache(2) Tools ===== - [[http://samba.org/ftp/tridge/dbench/|dbench]] (disk) and tbench (TCP) benchmarks Im Paket apache2-utils sind einige sehr nützliche Programme enthalten: - ab (Apache benchmark tool) - logresolve (Resolve IP addresses to hostname in logfiles) - htpasswd (Manipulate basic authentication files) - htdigest (Manipulate digest authentication files) - dbmmanage (Manipulate basic authentication files in DBM format, using perl) - htdbm (Manipulate basic authentication files in DBM format, using APR) - rotatelogs (Periodically stop writing to a logfile and open a new one) - split-logfile (Split a single log including multiple vhosts) - checkgid (Checks whether the caller can setgid to the specified group) - check_forensic (Extract mod_log_forensic output from apache log files) ==== Windows ==== http://www.patshaping.de/hilfen_ta/webserver/apache.htm