Author Archives: Christian Wulsch

WordPress-Plugin: Roundcube Login Form

Die Umstellung auf WordPress brachte für mich die Aufgabe mit sich, den Login in mein Webmail Interface sicher zu stellen. Für Webmail benutze ich seit langer Zeit Roundcube und bin damit sehr zufrieden. Das Loginformular hatte ich in meinem alten, selbtgeschriebenen CMS bereits realisiert. Mit einem einfachen Formular mit Ziel auf die Roundcube Seite funktioniert das Login nicht!
Der Grund liegt darin, dass WordPress beim initialen Aufruf des Loginformulars einen randomisierten Token generiert und diesen Zusammen mit der IP, den Language und Skin-Definitionen in der Tabelle ’sessions‘ hinterlegt. Der Token wird dann im Login Formular in einem versteckten Input-Feld gespeichert und beim Login mit übermittelt. Nur wenn dieser mit dem in der Datenbank hinterlegten zusammen mit der IP Adresse des Benutzers übereinstimmen, wird der Login genehmigt. Auf diese Weise wird sichergestellt, dass der Login nur von der Roundcube Login Page kommt.
Das fand ich aber schon immer unbefriedigend, weil ich wollte, dass das ganze System etwas mehr wie aus einem Guß erscheint und man sich nicht unnötig durch die Welt klicken muss.
Nun habe ich aus meiner alten Routine ein WordPress Plugin erstellt, mit dem sich dies in für mich befriedigender Weise realisieren lässt.

Es funktioniert nur mit Roundcube-Installationen auf MySQL Basis und benötigt Lese- und Schreibzugriff auf die Tabelle ’sessions‘ der Roundcube Datenbank. Es reicht, einen MySQL Benutzer anzulegen, der lediglich auf diese Tabelle Zugriff hat. Die entsprechenden Zugriffsdaten lassen sich wie gewohnt über die Einstellungen des PlugIns hinterlegen.

Um das Formular zu nutzen, muss an beliebiger Stelle der Shortcode [roundcube_login_form] in den Text der Seite, des Beitrags oder des Widgets eingefügt werden. An seiner Stelle erscheint bei aktivierem Plugin automatisch das Loginformular. Es ist möglich dem Shortcode Parameter zu übergeben. Diese stellen CSS Klassen dar, womit es ermöglicht werden soll, das Formular an verschiedenen Stellen der Seite unterschiedlich zu formatieren. Beispiel: Mit [roundcube_login_form inpage] oder [roundcube_login_form sidebar] wird jeweils die CSS Klasse ‚inpage‘ bzw. ’sidebar‘ übergeben. Im styles.css des PlugIns (zu bearbeiten z.B. über den Plugin-Editor von WordPress) können dann entsprechende Formatierungen hinterlegt werden.

Wenn das Plugin bei mir gut funktioniert, ist es unwahscheinlich, dass ich daran weiter arbeite. Wenn jemand jedoch Probleme haben sollte, mag er sich melden. Ich kann aber nicht garantieren, dass ich dazu komme zu antworten!

Um das Ganze noch mehr wie aus einem Guß erscheinen zu lassen, habe ich ein kleines Roundcube-Plugin geschrieben, das beim Ausloggen oder beim fehlerhaften Login wieder auf die WordPress Seite führt. Dieses muss wie gewöhnlich ins roundcube/plugins Verzeichnis entpackt und ins $config[’plugins’] Array in der config.inc.php aufgenommen werden. Es gibt ein kleines Config-File im Plugin-Verzeichnis, welches selbsterklärend sein sollte.

Das WordPress-Plugin lässt sich hier herunter laden: wp-roundcube-login-form.0.1.zip

Das Roundcube-Plugin gibt es hier: roundcube_logout_redirect.0.1.zip

Beide Plugins sind frei und ohne Forderungen meinerseits zu nutzen. Ich gebe aber auch keinerlei Garantie und trage keine Verantwortung für die Nutzung! Sollte jemand Anmerkungen oder Verbesserungen haben, freue ich mich über Feedback!

Squid3: Gemeinsames password file für basic und digest authentification

Nachdem ich in einem kleinen Netzwerk kürzlich mit dem Befall durch einen E-Mail Trojaner konfrontiert wurde, habe ich das Netzwerk dort etwas besser abgeriegelt. Via iptables sind jetzt sämtliche nicht notwendigen Zugriffe nach außen blockiert. Zugriff auf’s Internet ist nur noch über Squid3 als Proxyserver mit Authentifikation möglich. Diese ist sowohl über basic-auth, als auch über digest-auth via Password File möglich. Dummerweise werden für beide Methoden zwei verschiedene Password-Dateien benötigt, was ich unbefriedigend finde, denn es bedeutet, dass ich zwei Password Dateien pflegen muss (oder habe ich eine Möglichkeit übersehen?).

Um dies zu umgehen habe ich ein kleines Bash-Script geschrieben, das ich ‚merged_pw_auth‘ genannt habe. Es kommt in /usr/lib/squid3 zu liegen, wo sich überlicherweise auch die anderen squid-auth Module befinden sollten.

Eingebunden wird es in der squid.conf über

auth_param digest program /usr/lib/squid3/merged_pw_auth -d -c /etc/squid3/users_digest.conf

bzw.

auth_param basic program /usr/lib/squid3/merged_pw_auth -b -c /etc/squid3/users_digest.conf -r „Put your realm here as defined for the digest auth process“

Wie man sehen kann, benötigt es für basic auth die Übergabe des realm, wie es in der digest auth Definition festgelegt wurde, denn bei ‚basic‘ wird dieser zum einen nicht übergeben und zum anderen könnte sich der realm zwischen basic und digest unterscheiden.

Als kleines Schmankerl loggt das Script die Authentifizierungsversuche standardmäßig unter /var/log/squid3/merged_pw_auth.log. Dies kann über den Parameter -l /path/to/logfile.log geändert werden. Achtung: Der Pfad muss existieren und die Schreibberechtigungen für das Logfile müssen passen (Squid läuft üblicherweiser unter proxy:proxy).

Parameter:

  • -c /path/to/digest_password.conf
  • -l /path/to/logfile.log
  • -r realm as definded under ‚auth_param digest realm myrealm‘
  • -d for digest auth
  • -b for basic auth

Es steht jedem frei das Script nach eigenem Gutdünken zu verändern, oder herunterzuladen und zu löschen – beliebig oft, aber bitte nur manuell!

#!/bin/bash
#
# Auth script to use basic and digest authentification with the same digest auth file
# -----------------------------------------------------------------------------------
#
# written 2018-09-13 by Christian Wulsch
# feel free to use it!
#
# Usage:
# auth_param digest program /usr/lib/squid3/gzl_pw_auth -d -c /etc/squid3/users_digest.conf
# auth_param basic program /usr/lib/squid3/gzl_pw_auth -b -c /etc/squid3/users_digest.conf -r "Your realm here as set in digest part with 'auth_param digest realm'!"
#
# You may also pass another logfile location with -l /path/to/logfile.log
#
#
# Basic and digest password auth
# ------------------------------
#
# valid call for /usr/lib/squid3/ncsa_auth:
# echo "username plainpassword" | /usr/lib/squid3/ncsa_auth /path/to/configfile
# will return "OK" if success or "ERR" if it fails
#
# valid call for /usr/lib/squid3/digest_pw_auth:
# echo "\"username\":\"realm\"" | /usr/lib/squid3/digest_pw_auth -c /path/to/configfile
# will return the digest password if success or "ERR no such user" if it fails
#

realm=
configfile=
logfile=/var/log/squid3/merged_pw_auth.log
squid_module_path=$(dirname $0)

function log() {
  ts=$(date +"%Y-%m-%d_%H:%M:%S")
  echo "$ts $(whoami) - $*" >> $logfile
}

function error() {
  echo $*
  log $*
}

# Check cmd line params
nextisconf=0
for e in "$@"; do 
  [[ $nextisconf == 1 ]] && configfile=$e && nextisconf=0;
  [[ "$e" == "-c" ]] && nextisconf=1; 

  [[ $nextisrealm == 1 ]] && realm="$e" && nextisrealm=0;
  [[ "$e" == "-r" ]] && nextisrealm=1;

  [[ $nextislogfile == 1 ]] && logfile="$e" && nextislogfile=0;
  [[ "$e" == "-l" ]] && nextislogfile=1;

  [[ "$e" == "-b" ]] && authmode=basic
  [[ "$e" == "-d" ]] && authmode=digest
done

[ -z $configfile ] && error "No config file commited. Use -c /path/to/configfile !" && exit 1
[ ! -f $configfile ] && error "Config file $configfile does not exists!" && exit 1

read credentials

if [ "$authmode" == "basic" ]; then
  #result=$(echo "$credentials" | $squid_module_path/ncsa_auth $configfile)
  #ec=$?

  [ -z "$realm" ] && error "Need realm offered by command line if using basic auth with digest config file! Use -r 'realm'." && exit 1
  cred_params=($credentials)
  username=${cred_params[0]}
  password=${cred_params[1]}
  credentials="\"$username\":\"$realm\""

  result=$(echo "$credentials" | $squid_module_path/digest_pw_auth -c $configfile)
  ec=$?

  digest="$( printf "%s:%s:%s" "$username" "$realm" "$password" | md5sum | awk '{print $1}' )"
  if [ "$result" == "$digest" ]; then
    result="OK"
  else
    result="ERR"
  fi
elif [ "$authmode" == "digest" ]; then
  password=
  result=$(echo "$credentials" | $squid_module_path/digest_pw_auth -c /etc/squid3/users_digest.conf)
  ec=$?
else
  error "You need to tell me the auth mode! Use -b for basic or -d for digest auth."
  exit 1
fi

log "Auth in '$authmode' mode using '$configfile' with cred '$credentials' (passed pw: '$password') - result: $result" # (exit code $ec)"

echo $result
exit 0

 

Zeit für etwas Neues

Es wird Zeit! Ich habe mich entschlossen die Seite auf WordPress umzustellen. Auf der Suche nach Lösungen für so manches Anliegen werde ich oft im Web findig. Aber so manches Mal finde ich auch nichts, das mein Problem lösen könnte. Die Lösung scheint zu fehlen oder wurde von niemandem veröffentlicht und in mir kommt immer wieder der Wunsch auf, meine Erfahrungen mit anderen Suchenden zu teilen. Da ist mit der Zeit so manches zusammen gekommen. Wenn ich die Zeit finde, will ich es nach und nach veröffentlichen in der Hoffnung, dass Google und Co es finden. Es geht los…