====== Apache ======
[[http://www.pro-linux.de/news/1/23556/certbot-eff-stellt-neuen-client-f%C3%BCr-let39s-encrypt-vor.html|Certbot: EFF stellt neuen Client für »Let's Encrypt« vor]]
===== .htaccess =====
.htaccess testen/simulieren: [[https://htaccess.madewithlove.com/]]
* [[https://httpd.apache.org/docs/2.4/mod/core.html]]
* [[https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html]]
* [[https://httpd.apache.org/docs/2.4/rewrite/flags.html]]
==== Beispiel ====
* Dateiauflistung deaktivieren
* HSTS-Header setzen
* HTTP zu HTTPS und WWW zu non-WWW umleiten
* ist nur ein einziger redirect, da das **L** und **R** Flag nur einmal vorhanden sind
* man kann statt dem neueren 308 auch den klassischen 301 redirect verwenden
* Zugriff zu versteckten Dateien (.dotfiles) verweigern
# disable directory index
Options All -Indexes
# HSTS header
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
RewriteEngine on
# HTTP -> HTTPS
RewriteCond %{HTTPS} off [NC]
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI}
# WWW -> non-WWW
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^.*$ https://%1%{REQUEST_URI} [L,R=308]
# deny access to dotfiles
Require all denied
===== Die Apache-Variablen =====
==== Config variable ${APACHE_PID_FILE} is not defined ====
Die Variablen in den Konfigurationsdateien müssen in geschweiften Klammern gefasst werden, sonst startet der Apache 2.4.7 nicht:
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
Fehlermeldungen:
# apache2 -V
[Wed May 30 11:49:49.233188 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Wed May 30 11:49:49.233272 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Wed May 30 11:49:49.233318 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Wed May 30 11:49:49.233322 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Wed May 30 11:49:49.244658 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
[Wed May 30 11:49:49.244917 2018] [core:warn] [pid 5572] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00526: Syntax error on line 74 of /etc/apache2/apache2.conf:
Invalid Mutex directory in argument file:${APACHE_LOCK_DIR}
Ursache hierfür -> in der aktuellen SHELL sind diese Variablen tatsächlich nicht bekannt und bei dem Aufruf ''apache2 -V'' werden sie auch nicht geladen, deshalb muss man sie vor dem Aufruf manuell laden, z.B. so:
# (. /etc/apache2/envvars ; apache2 -V)
Server version: Apache/2.4.7 (Ubuntu)
Server built: Apr 18 2018 15:36:26
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"
Hier sind die Klammer wichtig, weil sonst wichtige Variablen aus unserer SHELL-Umgebung überschrieben werden, wie z.B. ''${HOME}''.
===== Ubuntu =====
==== Apache 2.2 (Ubuntu 12.04 LTS) ====
=== Authentifizierung per mod_auth_mysql ===
als erstes muss die DB+Tabelle angelegt werden:
> echo "CREATE DATABASE passwort_db" | mysql -h meine.datenbank.de
> echo "CREATE TABLE login_tab (name char(30) NOT NULL DEFAULT '', passwort char(20) NOT NULL DEFAULT '', gruppe char(10) DEFAULT NULL, PRIMARY KEY (name)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" | mysql -h meine.datenbank.de passwort_db
dann der User mit verschlüsseltem Passwort eingetragen werden:
> echo "INSERT INTO login_tab (name,passwort) VALUES ('fritz',ENCRYPT('geheim'));" | mysql -h meine.datenbank.de passwort_db
> echo "SELECT * FROM login_tab WHERE name = 'fritz';" | mysql -t -h meine.datenbank.de passwort_db
+-------+---------------+--------+
| name | passwort | gruppe |
+-------+---------------+--------+
| fritz | ges0Nvtjj0kZs | NULL |
+-------+---------------+--------+
im Apache muss zwingend das entsprechende Modul aktiviert werden:
> aptitude install apache2 apache2-utils libapache2-mod-auth-mysql
> a2enmod auth_mysql
> service apache2 restart
den Apache kann man per "''.htaccess''" konfigurieren:
> vi .htaccess
AuthName "password protected WebSite"
AuthType Basic
AuthBasicAuthoritative Off
AuthUserFile /dev/null
AuthMySQL On
AuthMySQL_Authoritative On
AuthMySQL_Host meine.datenbank.de
AuthMySQL_Port 3306
AuthMySQL_DB passwort_db
AuthMySQL_User fritz
AuthMySQL_Password geheim
AuthMySQL_Password_Table login_tab
AuthMySQL_Username_Field name
AuthMySQL_Password_Field passwort
AuthMySQL_Group_Field user_group
AuthMySQL_Encryption_Types Plaintext Crypt_DES
require valid-user
### die Datei .htpasswd muss drin stehen,
### sonst kommt eine Fehlermeldung ins error_log
### wegen Datei nicht gefunden
AuthUserFile /srv/.htpasswd
==== Apache 2.4 (Ubuntu 14.04 LTS) ====
* [[https://httpd.apache.org/docs/2.4/de/|Dokumentation zum Apache HTTP Server Version 2.4]]
* ''ORDER, ALLOW, DENY und SATISFY brauchen das **mod_access_compat** -> //abgekündigt//''
* -> //Übergangsweise können diese Direktiven mit dem Kompatibilitätsmodul weiter genutzt werden//: ''a2enmod access_compat''
* -> //neuer Weg//: ''a2enmod authz_host''
* ''Require local''
* ''Require ip 192.168.1.104 192.168.1.205''
* ''Require ip 10 172.20 192.168.2''
* ''Require ip 10.1.0.0/8''
* ''Require host .net example.edu''
* [[Ubuntu 14.04 mit Apache und SSL]]
=== Authentifizierung per mod_mod_authn_dbd ===
an Stelle von **''mod_auth_mysql''** (''libapache2-mod-auth-mysql'') soll nun **''mod_authn_dbd''** (''libaprutil1-dbd-mysql'') verwendet werden
* [[https://httpd.apache.org/docs/2.4/howto/auth.html]]
* [[https://httpd.apache.org/docs/current/mod/mod_dbd.html]]
* [[https://httpd.apache.org/docs/trunk/mod/mod_authn_dbd.html]]
als erstes muss die DB+Tabelle angelegt werden:
> echo "CREATE DATABASE passwort_db" | mysql -h meine.datenbank.de
> echo "CREATE TABLE login_tab (name char(30) NOT NULL DEFAULT '', passwort char(20) NOT NULL DEFAULT '', gruppe char(10) DEFAULT NULL, PRIMARY KEY (name)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" | mysql -h meine.datenbank.de passwort_db
dann der User mit verschlüsseltem Passwort eingetragen werden:
> echo "INSERT INTO login_tab (name,passwort) VALUES ('fritz',ENCRYPT('geheim'));" | mysql -h meine.datenbank.de passwort_db
> echo "SELECT * FROM login_tab WHERE name = 'fritz';" | mysql -t -h meine.datenbank.de passwort_db
+-------+---------------+--------+
| name | passwort | gruppe |
+-------+---------------+--------+
| fritz | ges0Nvtjj0kZs | NULL |
+-------+---------------+--------+
im Apache muss zwingend das entsprechende Modul aktiviert werden:
> aptitude install apache2 apache2-utils libaprutil1-dbd-mysql
> a2enmod dbd authn_dbd authn_core auth_basic authz_user
> service apache2 restart
> vi /etc/apache2/sites-enabled/000-default.conf
DBDriver mysql
DBDParams "host=meine.datenbank.de port=3306 user=fritz pass=geheim dbname=passwort_db"
DBDMin 2
DBDKeep 6
DBDMax 18
DBDExptime 300
...
DocumentRoot /var/www/
AuthName "password protected WebSite"
AuthType Basic
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT user_passwd FROM user_info WHERE user_name=%s"
...
== DB-Cache ==
* [[https://httpd.apache.org/docs/2.4/en/mod/mod_authn_socache.html]]
* [[https://httpd.apache.org/docs/2.4/mod/mod_authn_dbd.html#example]]
Das Modul "''mod_authnz_ldap''" hat seinen eigenen Cache aber das Modul "''mod_authn_dbd''" kann evtl. durch einen Cache beschleunigt werden.
> a2enmod cache cache_socache authn_socache
> vi /etc/apache2/sites-enabled/000-default.conf
...
AuthName "password protected WebSite"
AuthType Basic
AuthBasicProvider socache dbd
AuthnCacheProvideFor dbd
AuthnCacheContext my-server
Require valid-user
AuthDBDUserPWQuery "SELECT user_passwd FROM user_info WHERE user_name=%s"
...
> service apache2 restart
===== FreeBSD 10.1 + Apache 2.4 + SSL =====
> pkg install apache24
alter Standard-Schlüssel:
> openssl req -rand /dev/urandom -new -x509 -newkey rsa:4096 -sha512 -nodes -keyout /usr/local/etc/apache24/server.key -keyform PEM -out /usr/local/etc/apache24/server.crt -outform PEM -days 7000 -subj "/emailAddress=email@adresse.de/C=DE/ST=Hessen/L=Frankfurt/O=Firma/OU=Abteilung/CN=Hostname"
Elliptischer Kurven - Schlüssel:
> openssl ecparam -out /usr/local/etc/apache24/server.key -name secp256k1 -genkey
> openssl req -new -x509 -key /usr/local/etc/apache24/server.key -keyform PEM -out /usr/local/etc/apache24/server.crt -outform PEM -days 7000 -subj "/emailAddress=email@adresse.de/C=DE/ST=Hessen/L=Frankfurt/O=Firma/OU=Abteilung/CN=Hostname"
SSL-Cipher auflisten ([[https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslciphersuite]]):
> openssl ciphers -V
> openssl ciphers | tr -s ':' '\n'
> openssl ciphers -V TLSv1.2
> vi /usr/local/etc/apache24/extra/httpd-ssl.conf
...
#SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4
#SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4
#SSLProxyCipherSuite TLSv1.2
SSLProxyCipherSuite EECDH+aRSA+AES256
#SSLCipherSuite TLSv1.2
SSLCipherSuite EECDH+aRSA+AES256
...
SSLHonorCipherOrder on
...
#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3
SSLProtocol -ALL +TLSv1.2
SSLProxyProtocol -ALL +TLSv1.2
...
##
## SSL Virtual Host Context
##
# General setup for the virtual host
DocumentRoot "/usr/local/www/apache24/data"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
...
> vi /usr/local/etc/apache24/httpd.conf
...
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
...
LoadModule ssl_module libexec/apache24/mod_ssl.so
...
LoadModule cgi_module libexec/apache24/mod_cgi.so
...
AddHandler cgi-script .cgi
...
# Various default settings
Include etc/apache24/extra/httpd-default.conf
...
# Secure (SSL/TLS) connections
Include etc/apache24/extra/httpd-ssl.conf
...
> service apache24 restart
Performing sanity check on apache24 configuration:
Syntax OK
Stopping apache24.
Waiting for PIDS: 27530.
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.
> service apache24 status
apache24 is running as pid 26308.
==== FreeBSD 12.1 + Apache 2.4 + SSL 1.1.1d ====
alle TLSv1.3 aber nur einen TLSv1.2-Cipher erlauben, außer zum öffnen der Seiten im Unterverzeichnis ''/var/www/mit_alte_cipher'', dort dürfen auch weitere TLSv1.2-Cipher genutzt werden:
> vi /usr/local/etc/apache24/extra/httpd-ssl.conf
...
SSLEngine on
...
SSLProxyCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384
SSLCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384
#SSLCipherSuite HIGH:!aNULL:!MD5
#SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
...
SSLHonorCipherOrder on
...
SSLProtocol -ALL +TLSv1.3 +TLSv1.2
SSLProxyProtocol -ALL +TLSv1.3 +TLSv1.2
...
SSLProxyCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-AES256-CCM-8:DHE-RSA-AES256-CCM:ECDHE-RSA-ARIA256-GCM-SHA384:DHE-RSA-ARIA256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM-8:DHE-RSA-AES128-CCM:ECDHE-RSA-ARIA128-GCM-SHA256:DHE-RSA-ARIA128-GCM-SHA256
SSLCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-AES256-CCM-8:DHE-RSA-AES256-CCM:ECDHE-RSA-ARIA256-GCM-SHA384:DHE-RSA-ARIA256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM-8:DHE-RSA-AES128-CCM:ECDHE-RSA-ARIA128-GCM-SHA256:DHE-RSA-ARIA128-GCM-SHA256
===== Sicherheit im Apache =====
* [[https://www.pro-linux.de/news/1/27221/mozilla-pr%C3%A4sentiert-ssl-konfigurationsgenerator.html|Mozilla präsentiert SSL-Konfigurationsgenerator]]
* [[https://www.eff.org/https-everywhere]]
* [[https://www.ssllabs.com/ssltest/]]
* [[http://www.heise.de/security/meldung/Erste-Loesungen-fuer-SSL-TLS-Schwachstelle-1349687.html]]
* [[http://www.guntiahoster.de/blog/2011/allgemein/beast-attack-ssl-jederzeit-angreifbar/]]
- SSL 2.0 -> angreifbar
- SSL 3.0 -> angreifbar
* Einstellung ab Firefox 24: ''security.tls.version: **0**''
- TLS 1.0 (SSL 3.1) -> angreifbar (1999)
* Einstellung ab Firefox 24: ''security.tls.version: **1**''
- **TLS 1.1 (SSL 3.2) -> nicht angreifbar (2006)**
* Einstellung ab Firefox 24: ''security.tls.version: **2**''
- **[[http://www.pro-linux.de/news/1/20333/bsi-empfiehlt-tls-12-mit-perfect-forward-secrecy.html|TLS 1.2]] (SSL 3.3) -> nicht angreifbar (2008)**
* Einstellung ab Firefox 24: ''security.tls.version: **3**''
- **[[https://www.pro-linux.de/news/1/26194/standardisierung-von-tls-13-abgeschlossen.html|TLS 1.3]] ([[https://www.rfc-editor.org/rfc/pdfrfc/rfc8446.txt.pdf|RFC8446]]) -> nicht angreifbar (2019)**
* Einstellung ab Firefox 61: ''security.tls.version.max: **4**''
[[https://ssl-config.mozilla.org/#server=apache&server-version=2.4.41&config=modern&openssl-version=1.1.1d|moz://a SSL Configuration Generator]]
==== openSSL ====
so kann man sich alle unterstützten SSL-Cipher anzeigen lassen:
> openssl ciphers -v 'ALL'
so die 40-Bit-Cipher:
> openssl ciphers -v 'EXPORT'
so nur die schwachen (meist 56 Bit) Cipher:
> openssl ciphers -v 'LOW'
so nur die mittelstarken (meist 128 Bit) Cipher:
> openssl ciphers -v 'MEDIUM'
so nur die starken (meist >128 Bit) Cipher:
> openssl ciphers -v 'HIGH'
----
* [[https://netsense.ch/blog/apache-schwache-ssl-ciphers-deaktivieren/]]
* [[http://w7x.de/2010/11/11/apache-sicherheit-sslv2-deaktivieren-und-starke-verschlusselung-einsetzen/]]
In der Apache-CFG (/etc/apache2/httpd.conf) kann man definieren welche Cipher vom Apache verwendet werden sollen.
mit **mod_ssl** (TLSv1.3 und TLSv1.2 und vom schwächeren TLSv1.2 nur die "sicheren" Cipher erlauben):
...
SSLEngine on
SSLHonorCipherOrder On
SSLProtocol -ALL +TLSv1.3 +TLSv1.2
SSLCipherSuite SSL ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-CHACHA20-POLY1305-SHA256:DHE-RSA-AES256-CCM-8:DHE-RSA-AES256-CCM:ECDHE-RSA-ARIA256-GCM-SHA384:DHE-RSA-ARIA256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM-8:DHE-RSA-AES128-CCM:ECDHE-RSA-ARIA128-GCM-SHA256:DHE-RSA-ARIA128-GCM-SHA256
...
... so kann man sich die Chiffrensammlung ansehen:
wird der Apache mit dem SSL-Modul eingesetzt, dann ist es sinnvoll nur "TLS1.2" zu verwenden, und davon nur die sichersten ciphers
> openssl ciphers -v 'EECDH+aRSA+AES256:ECDHE-RSA-AES128-GCM-SHA256:!SSLv3'
**am Ende darf der Restart des Apache nicht vergessen werden:**
> service apache2 restart
==== GnuTLS ====
Als die BIEST-Sicherheitslücke bekannt wurde, konnte openSSL noch kein TLS1.2,
die __Lösung__ mit **mod_gnutls** ([[http://www.zimbio.com/Linux/articles/oAs-ep5LjPs/How+Upgrade+SSL+GnuTLS+Apache+Ubuntu]]):
...
GnuTLSCache dbm %%DBDIR%%/tls-cache
GnuTLSCacheTimeout 500
GnuTLSEnable on
GnuTLSKeyFile /etc/ssl/certs/private/example_com.key.pem
GnuTLSCertificateFile /etc/ssl/certs/example_com.crt.pem
GnuTLSClientCAFile /etc/ssl/certs/example_com.ca.pem
#GnuTLSPriorities SECURE256:-VERS-SSL3.0:-VERS-TLS1.0:-ARCFOUR-128
GnuTLSPriorities SECURE256:-VERS-TLS-ALL:+VERS-TLS1.2:-CIPHER-ALL:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:-MAC-ALL:+SHA512:+SHA384:+SHA256:+SHA1:-SIGN-RSA-RMD160:-SIGN-RSA-MD5:-SIGN-RSA-MD2:-NULL
...
die __Zwischenlösung__ mit **mod_gnutls** (//der __Firefox 24__ unterstützt "TLS 1.2", allerdings muss es erst per ''about:config (security.tls.version.max=3)'' aktiviert werden!//):
...
GnuTLSCache dbm %%DBDIR%%/tls-cache
GnuTLSCacheTimeout 500
GnuTLSEnable on
GnuTLSKeyFile /etc/ssl/certs/private/example_com.key.pem
GnuTLSCertificateFile /etc/ssl/certs/example_com.crt.pem
GnuTLSClientCAFile /etc/ssl/certs/example_com.ca.pem
GnuTLSPriorities SECURE256:-CIPHER-ALL:+ARCFOUR-128:-MD5:-ANON-DH:-RSA-EXPORT:-NULL
...
... so kann man sich die Chiffrensammlung ansehen:
GnuTLS-Testaufruf
> gnutls-cli --priority "SECURE256:-CIPHER-ALL:+ARCFOUR-128:-MD5:-ANON-DH:-RSA-EXPORT:-NULL" domain.de
**am Ende darf der Restart des Apache nicht vergessen werden:**
> service apache2 restart
===== URL-Rewriting (mod_rewrite) =====
* [[http://stefanux.de/wiki/doku.php/apache/apache#url-rewriting-mod_rewrite|mod_rewrite]]
mit mod_rewrite kann man nur schwer lesbare URLs in angenehmere umwandeln und auch Suchmaschinen eine bessere Indizierung ermöglichen.
* mod_rewrite
* mod_rewrite Demystified: A Brief Guide With Resources
==== 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 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
RedirectMatch (.*) http://www.NEUE-SEITE.de [R=301,L]
===== Apache Log Rotation =====
[[http://httpd.apache.org/docs/2.2/logs.html]]
==== Logs per Script rotieren ====
Hiermit hat man die Möglichkeit, das rotieren der Logdateien per CRON auf Mitternacht zu legen.
mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old
==== Logs alle 24 Stunden rotieren ====
Hiermit wird die Logdatei immer die Logs für genau 24 Stunden enthalten. Gezählt wird ab Prozess-Start.
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
===== CGI =====
Möchte man per Knopfdruck ein Script ausführen, dann macht man das per CGI.
In der Konfiguration muss diese Zeile stehen,
ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"
damit die URL "www.server.de/cgi-bin/" über den Browser überhaupt erst ansprechbar ist.
Damit die darin liegenden Dateien beim Aufruf auch als Scripte abgearbeitet werden,
muss noch die folgende Sektion in die Konfiguration aufgenommen werden:
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all
Das Verzeichnis ///srv/www/cgi-bin/// muss ausführbar sein und dem selben Benutzer gehören,
unter dem der Apache läuft.
z.B.:
> chmod -R 0750 /srv/www/cgi-bin/
> chown -R www:www /srv/www/cgi-bin/
==== Apache 2.4 + CGI + FreeBSD 10.1 ====
minimale Installation:
> pkg install www/apache24 shells/bash security/sudo
minimale Konfiguration:
> vi /usr/local/etc/apache24/Includes/cgi.conf
#------------------------------------------------------------------------------#
#
# pkg install www/apache24 shells/bash security/sudo
#
#------------------------------------------------------------------------------#
LoadModule cgid_module libexec/apache24/mod_cgid.so
#------------------------------------------------------------------------------#
ServerAdmin name@mail.de
ServerName www.domain.de
AllowOverride None
Options +ExecCGI -Includes
AddHandler cgi-script .cgi
#
### Apache 2.2
#Order allow,deny
#Allow from all
#
### Apache 2.4
Require all granted
#------------------------------------------------------------------------------#
AddHandler cgi-script .cgi
# AddType text/html .html
# SetHandler cgi-script
#------------------------------------------------------------------------------#
das CGI-Skript muss die richtigen Rechte haben:
> chown www:www /usr/local/www/apache24/cgi-bin/test-cgi
> chmod 0700 /usr/local/www/apache24/cgi-bin/test-cgi
in der ersten Zeile des CGI-Skripts __muß__ der Interpreter eingetragen werden!
> head -n1 /usr/local/www/apache24/cgi-bin/test-cgi
#!/usr/local/bin/bash
...
===== Passwortschutz auf die gesamte Seite legen =====
In diesem Beispiel ist ///home/http/dokuwiki/// das //DocumentRoot//!
Damit die **''.htaccess''**-Datei vom Apache auch gelesen wird,
muss **''[[http://de.selfhtml.org/servercgi/server/htaccess.htm#erlaubte_anweisungen|AllowOverride]]''** eingeschaltet werden, z.B.:
AllowOverride AuthConfig
==== htaccess ====
# vi /home/http/dokuwiki/.htaccess
AuthType Basic
AuthName "Dokuwiki"
AuthUserFile "/home/etc/httpd/.htpasswd"
AuthGroupFile /dev/null
require valid-user
==== htpasswd ====
Trockenübung, so wird keine Datei geschrieben, sondern das Ergebnis lediglich angezeigt:
# htpasswd -n fritz
# htpasswd -nb fritz geheim
Benutzer mit Passwort anlegen:
# htpasswd -BcC 13 /home/etc/httpd/.htpasswd fritz
New password:
Re-type new password:
Adding password for user fritz
Passwort eines Benutzers ändern / neuen Benutzer anlegen (mit bcrypt verschlüsselt):
# htpasswd -BC 13 /home/etc/httpd/.htpasswd fritz
neuen Benutzer mit Passwort hinzu fügen:
# htpasswd /home/etc/httpd/.htpasswd otto
Es ist auch möglich das Passwort direkt auf der Kommandozeile mit zu übergeben:
# htpasswd -b /home/etc/httpd/.htpasswd fritz geheim
Updating password for user fritz
# htpasswd -b /home/etc/httpd/.htpasswd otto geheim
Adding password for user otto
Benutzer löschen:
# htpasswd -D /home/etc/httpd/.htpasswd otto
===== suexec (mit Apache 2.0 auf FreeBSD) =====
==== Wie konfiguriere ich einen Webserver mit Apache 2 ? ====
=== Apache 2 installieren ===
# cd /usr/ports/www/apache2/
# make WITH_SUEXEC=yes WITH_THREADS=yes install && make clean
# suexec -V:
-D AP_DOC_ROOT="/usr/local/www/data"
-D AP_GID_MIN=1000
-D AP_HTTPD_USER="www"
-D AP_LOG_EXEC="/var/log/httpd-suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"
Wichtig sind für uns hier folgende Angaben:
- "AP_DOC_ROOT"; es werden von suEXEC nur unterhalb von diesem CGI-Dateien ausgeführt.
- "AP_HTTPD_USER"; suEXEC wird nur laufen, wenn der Apache als der hier eingetragene User läuft.
- "AP_GID_MIN"; suEXEC kann nur zu Usern wechseln, die mindestens eine GroupID von der hier angegebenen Höhe haben.
- "AP_UID_MIN"; suEXEC kann nur zu Usern wechseln, die mindestens eine UserID von der hier angegebenen Höhe haben.
=== Jetzt muss als erstes das Verzeichnis angelegt werden ===
Der Apache läuft in diesem Beispiel mit den folgenden Rechten (siehe /usr/local/etc/apache2/httpd.conf):
User www
Group www
Der User des Webacounts (suEXEC) hat die Rechte
User webuser
Group webgroup
Am sinnvollsten legt man das Web-Verzeichnis in "/var" an.
# make -p /var/www/webuser/cgi-bin # fuer die CGI-Scripte
# make -p /var/www/webuser/htdocs # fuer die HTML-Dateien
# make -p /var/www/webuser/log # fuer die LOG-Dateien
chown -R webuser /var/www/webuser
chgrp -R www /var/www/webuser
chmod -R 750 /var/www/webuser
chmod -R 755 /var/www/webuser/cgi-bin
chgrp -R webgroup /var/www/webuser/cgi-bin
chmod -R 770 /var/www/webuser/htdocs
chown -R 0 /var/www/webuser/logs
chgrp -R users /var/www/webuser/logs
chmod -R 650 /var/www/webuser/logs
=== symbolischen Link loeschen und neu anlegen ===
# rm -f /usr/local/www/data
# ln -s /var/www /usr/local/www/data
=== Webuser anlegen ===
# vipw
webuser:*:2000:2000::0:0:Unprivileged user:/nonexistent:/sbin/nologin
# vigr
webgroup:*:2000
=== Namensaufloesung ===
Der zukünftige Webserver wird die IP "192.168.0.10" und den Namen "musterweb.de" erhalten.
Jeder Rechner, der auf den Webserver zugreifen soll, braucht diesen Eintrag in der Datei "/etc/hosts":
192.168.0.10 musterweb.de
Oder man richtet sich einen eigenen DNS ein.
=== konfigurieren des Apache ===
# vi /usr/local/etc/apache2/httpd.conf
NameVirtualHost musterweb.de
SuexecUserGroup webuser webgroup
ServerAdmin webmaster@musterweb.de
DocumentRoot /usr/local/www/data/webuser/htdocs
ScriptAlias /cgi-bin/ "/usr/local/www/data/webuser/cgi-bin/"
ServerName musterweb.de
ErrorLog /usr/local/www/data/webuser/log/error_log
CustomLog /usr/local/www/data/webuser/log/access_log common
(einfach unten anhängen...)
=== AKTIVIEREN (ab Apache 2.0.50) ===
# vi /etc/rc.conf
apache2_enable="YES"
START:
# /usr/local/etc/rc.d/apache2.sh stop
# /usr/local/etc/rc.d/apache2.sh start