apache über reverse-proxy: Client IP anzeigen

Hat man vor einem apache Web-Server einen reverse-proxy (z.B. nginx) am laufen, sieht man statt der „echten“ IP des Besuchers, lediglich die IP des reverse-proxies.
Damit man im apache die tatsächliche IP des Bescuhers sieht kann man mittels mod_remoteip den Header vom reverse-proxy auslesen.
Continue reading apache über reverse-proxy: Client IP anzeigen

apache: Authentifizierung wahlweise über IP oder HTTP-Auth

Bei sensiblen Web-Applikation wie die für das Verwalten des Mailservers (z.B. postfixadmin) oder welche die Zugriff auf die Datenbanken haben (z.B. phpmyadmin) sollte man sich nicht nur auf die Sicherheit der Applikation verlassen und stattdessen zusätzlich eine Authentifizierung über den Webserver (.htaccess) vornehmen.

Hierzu gibt es grundsätzlich zwei Möglichkeiten: Authentifizierung über die IP-Adresse und über eine HTTP-Passwortabfrage.

Doch während die erstere den Nachteil hat unflexibel zu sein (z.B. kein Zugriff mehr wenn man mal von einem Internet-Cafe dringend darauf zugreifen muss), müsste man bei zweiteren immer zweimal einloggen: Einmal über die HTTP-Authentifizierung und einmal über die Web-Applikation selbst.

Doch zum Glück lassen sich diese zwei Mechanismen kombinieren, so dass man bei bekannten IPs ohne vorgängige Passwort-Abfrage direkt zum Web-Login kommt und bei "fremden" IPs die Möglichkeit hat nach einer zusätzlichen HTTP-Authentifizierung die Web-Applikation zu erreichen.

Eine entsprechende .htaccess könnte z.B. so aussehen:

# Access is either granted if the hostname is trusted, OR
# if password authentication succeeds (Satisfy Any)
#
# SYNTAX:
# "Allow from" can be single- or multi line, i.ex.:
# Allow from <host1> <host2>
# or:
# Allow from <host1>
# Allow from <host2>
 
Order deny,allow
Deny from all
Allow from  myhost.example.org
Allow from  192.168.0.50
AuthType Basic
AuthName "Untrusted source IP access"
AuthUserFile /path/to/.htpasswd
AuthGroupFile /dev/null
#Require group staff
require valid-user
Satisfy Any

Kommt man nun entweder mit dem Hostnamen "myhost.example.org" oder der IP: "192.168.0.50" daher, erreicht man direkt die Webseite; bei allen anderen Quell-IPs kommt stattdessen der HTTP-Password Dialog, wo man nach erfolgreicher Anmeldung weiter kommt.

apache: Umlaute werden nicht richtig dargestellt

Wenn beim apache Webserver Text oder HTML Dateien mit falschen Umlauten angezeigt werden, liegt dies meist an den Zeichensatz Einstellungen.

Mittels der [http://httpd.apache.org/docs/2.2/mod/core.html#adddefaultcharset|AddDefaultCharset]-Direktive kann ein Zeichensatz angegeben werden, der für alle Dateien gilt; dieser verändert jedoch die Standard-Einstellung des Browsers und führt so manchmal zu verkorksten Umlauten. Deshalb sollte diese Einstellung Standardmässig auf "Off" sein.
Bei RHEL/CentOS ist diese in der Standardeinstellung jedoch auf UTF-8, wahrscheinlich um Kompatibilität mit alten Scripts wo der Zeichensatz nicht definiert ist zu wahren.
Ist dies so, sollte die Einstellung in der httpd.conf erstmal auf "Off" gestellt werden.

Werden die Umlaute immer noch nicht korrekt dargestellt, kann man auf Verzeichnisebene (über .htaccess files) mit der Direktive "AddDefaultCharset" experimentieren.
Ebenfalls kann man mit der [http://httpd.apache.org/docs/2.2/en/mod/mod_mime.html#addcharset|AddCharset]-Direktive dies für einzelne Dateitypen (z.B. .txt) Einstellen.

Tip: httpd.conf Einstellungen überschreiben
In der Zentralen httpd.conf des apache Webservers sollte so wenig wie möglich verändert werden um spätere upgrades nicht kompliziert zu machen.

Deshalb legt man am besten eine weitere Datei mit dem Namen: httpd-override.conf an und bindet diese mit der Include-Direktive am Schluss der httpd.conf ein:

Include conf/httpd-override.conf

Darin kann man dann die Standard-Einstellungen jeweils „überschreiben“.

Quellen:

apache: Am ActiveDirectory authentifizieren

Den Weg Benutzer über .htaccess und .htpasswd beim apache Webserver zu authentifizieren ist hinlänglich bekannt.
Noch interessanter ist jedoch die Authentifizierung über ein Zentrales ActiveDirectory (oder einen beliebigen LDAP Server) – Und dabei ist es fast so einfach wie über die .htpasswd files.

Als erstes benötigt man das modul yum install mod_ldap:

yum install mod_ldap

Danach erstellt man im zu schützenden Web-verzeichnis einfach eine Datei mit dem Namen .htaccess und folgendem Inhalt:

# Username to bind
AuthLDAPBindDN "CN=unprivilegierter-user,OU=User Accounts,DC=ad,DC=example,DC=net"
AuthLDAPBindPassword "xxxxxx"
 
# search for users
AuthLDAPURL "ldap://ad.example.net/OU=User Accounts,DC=ad,DC=example,DC=net?sAMAccountName?sub?(objectClass=*)"
 
AuthType Basic
AuthName "WINDOWS ACCOUNT LOGIN"
AuthBasicProvider ldap
 
# Important, otherwise "(9)Bad file descriptor: Could not open password file: (null)"
AuthUserFile /dev/null
require valid-user
Hinweis bei der Verwendung von SSL (ldaps://)

Verwendet man SSL, also als AuthLDAPURL beispielsweise: ldaps://ad.example.net/, muss man im apache in der Server Konfiguration das checken des CA-Zertifikats deaktivieren, z.B. mit der folgenden Zeile in: /etc/httpd/conf.d/ldap.conf:

LDAPVerifyServerCert Off

Alternativ kann man auch das CA-Zertifikat vom LDAP-Server auf den Webserver kopieren (z.B. nach: /etc/openldap/certs/ldap_ca.crt und dann in: /etc/httpd/conf.d/ldap.conf anstelle von: LDAPVerifyServerCert Off die Option:

LDAPTrustedGlobalCert CA_BASE64 "/etc/openldap/certs/samba_ca.crt"

einfügen.

Die einzelnen Anweisungen bedeuten folgendes:

  • AuthLDAPBindDN: Dies ist der DN eines unprivilegierten users; da man beim ActiveDirectory nur schon einen user braucht um andere user zu suchen. 😉
  • AuthLDAPBindPassword: Das Passwort für diesen (system-) user
  • AuthLDAPURL: Die URL für die Domain Suche (muss mindestens ein Unterverzeichnis (OU) enthalten!)

Der Rest entspricht den Standard Apache-Authentifizierungs Konfigurationen.

mod_ldap debuggen

Falls bei mod_ldap etwas nicht funktioniert, erhält man nicht mehr als einen HTTP 500 Fehler im apacher error.log und mit dieser Info lässt sich leider nicht so viel anfangen.
Glücklicherweise gibt es die Option: LDAPLibraryDebug, welche man in der Server-Konfiguration, beipspielsweise mit der folgenden Zeile in: /etc/httpd/conf.d/ldap.conf hinzufügen kann:

LDAPLibraryDebug 7

Nach einem restart des apache servers steht dann die ganze LDAP connection info im error.log.

Hinweis: Auch SELinux kann in diesem Kontext für Probleme verantwortlich sein.

Quellen

apache: An einer mySQL Datenbank authentifizieren

Die Methode mit .htaccess/.htpasswd ist vielen bekannt um ein Verzeichnis per passwort zu schützen – Und dies geht mit dem apache-modul: mod_auth_mysql auch über eine mysql Datenbank!

Die Möglichkeiten dieser Methode sind fast unerschröpflich, so kann z.B. ein Forum einen Verzeichnisschutz implementiert haben, bei dem man sich automatisch mit seinem normalen Foren-Login anmelden kann, usw.

Und so gehts:

Erst mal muss das mod_auth_mysql installiert werden, z.B. bei CentOS mittels:

yum install mod_auth_mysql

Dann legt man im zu schützenden Verzeichnis einfach ein normales .htaccess file an mit folgendem Inhalt:

AuthName "SeitenName"
AuthType Basic
AuthMySQLHost <DB_HOST>
AuthMySQLUser <DB_USER>
AuthMySQLPassword <DB_PASSWORT>
 
AuthMySQLDB <DB>
AuthMySQLUserTable <USER_TABELLE>
AuthMySQLNameField <FELD_NAME>
AuthMySQLPasswordField <FELD_PASSWORT>
AuthMySQLPwEncryption <passwort Verschlüsselung, z.B. md5>
AuthMySQLEnable On
AuthMySQLUserCondition "<ggf. weitere Kontitionen>"
require valid-user

Hier ist noch ein Beispiel, wie man das ganze auch auf Gruppenberechtigungen ausdehnen kann:

AuthName "YourSite"
AuthType Basic
 
# Database settings:
AuthMySQLHost localhost
AuthMySQLUser dbuser
AuthMySQLPassword dbpass
AuthMySQLDB dbname
 
# User table
AuthMySQLUserTable users
AuthMySQLNameField users.name
AuthMySQLPasswordField users.pass
 
# User Roles tables
AuthMySQLGroupTable "users, users_roles"
AuthMySQLGroupField users_role.rid
 
# Where clauses
AuthMySQLUserCondition "users.status = 1 and users.access <> 0"
AuthMySQLGroupCondition "users.uid = users_roles.uid AND users_roles.rid > 2"
 
# Do it to it!
AuthMySQLPwEncryption md5
AuthMySQLEnable On
require valid-user

Und wenn alles klappt kann man sich dann mit den Login-Daten aus der Datenbank anmelden! 😉

Quelle: [http://drupal.org/node/156547|drupal.org: Sharing authentication with HTTP-Auth]

apache: Automatische SSL Umleitung

Manchmal macht es Sinn gewisse Seiten oder Unterseiten automatisch auf eine SSL Seite umzuleiten, etwa: "webmail.example.com" oder "myshop.example.com/bestellung/"

Dies geht ganz einfach mit einer .htaccess Direktive, oder alternativ global ein einem apache config file (bei Debian z.B.: /etc/apache2/conf.d/ssl-redirect.conf )
Continue reading apache: Automatische SSL Umleitung