Benutzer-Werkzeuge

Webseiten-Werkzeuge


apache

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
apache [2023-06-25 00:04:44] – [permanente Umzüge] davidapache [2023-06-25 00:41:25] (aktuell) – [.htaccess] david
Zeile 1: Zeile 1:
 +====== 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
 +
 +<code apache .htaccess>
 +# 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
 +<FilesMatch "^\.">
 +        Require all denied
 +</FilesMatch>
 +</code>
 +
 +
 +===== 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
 +<file>
 +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
 +</file>
 +
 +
 +==== 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
 +<file>
 +DBDriver mysql
 +DBDParams "host=meine.datenbank.de port=3306 user=fritz pass=geheim dbname=passwort_db"
 +DBDMin 2
 +DBDKeep 6
 +DBDMax 18
 +DBDExptime 300
 +
 +<VirtualHost *:80>
 +
 +...
 +
 + DocumentRoot /var/www/
 +
 +  <Location />
 +    AuthName "password protected WebSite"
 +    AuthType Basic
 +    AuthBasicProvider dbd
 +    Require valid-user
 +    AuthDBDUserPWQuery "SELECT user_passwd FROM user_info WHERE user_name=%s"
 +  </Location>
 +
 +...
 +
 +</file>
 +
 +
 +== 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
 +<file>
 +
 +...
 +
 +  <Location />
 +    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"
 +  </Location>
 +
 +...
 +
 +</file>
 +
 +  > 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
 +  ##
 +    
 +  <VirtualHost _default_:443>
 +  
 +  #   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
 +  ...
 +  <Location "/var/www/mit_alte_cipher">
 +          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
 +  </Location>
 +
 +
 +===== 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):
 +<file>
 +...
 +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
 +...
 +</file>
 +
 +... 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]]):
 +<file>
 +...
 +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
 +...
 +</file>
 +
 +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!//):
 +<file>
 +...
 +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
 +...
 +</file>
 +
 +... 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:
 +
 +  
 +  <Directory "/srv/www/cgi-bin">
 +          AllowOverride None
 +          Options +ExecCGI -Includes
 +          Order allow,deny
 +          Allow from all
 +  </Directory>
 +
 +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
 +<file>
 +#------------------------------------------------------------------------------#
 +#
 +# pkg install www/apache24 shells/bash security/sudo
 +#
 +#------------------------------------------------------------------------------#
 +LoadModule      cgid_module     libexec/apache24/mod_cgid.so
 +#------------------------------------------------------------------------------#
 +
 +ServerAdmin name@mail.de
 +
 +ServerName www.domain.de
 +
 +<Directory "/usr/local/www/apache24/cgi-bin">
 +    AllowOverride None
 +    Options +ExecCGI -Includes
 +    AddHandler cgi-script .cgi
 +    #
 +    ### Apache 2.2
 +    #Order allow,deny
 +    #Allow from all
 +    #
 +    ### Apache 2.4
 +    Require all granted
 +</Directory>
 +
 +#------------------------------------------------------------------------------#
 +<IfModule mime_module>
 +    AddHandler cgi-script .cgi
 +#    AddType text/html .html
 +#    SetHandler cgi-script
 +</IfModule>
 +#------------------------------------------------------------------------------#
 +</file>
 +
 +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
 +<file>
 +#!/usr/local/bin/bash
 +...
 +</file>
 +
 +===== 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
 +