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

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.