#!/bin/bash # script che verifica i codici TOTP su un file di testo passfile=$1 # Leggo i dati che mi passa openvpn via file temporaneo user=$(head -1 $passfile) pass=$(tail -1 $passfile) # Verifico che lo username contenga solo caratteri validi if ! [[ "$user" =~ ^[0-9a-zA-Z._@-]+$ ]]; then exit 1 fi # Verifico che la password contenga solo numeri if ! [[ "$pass" =~ ^[0-9]+$ ]]; then exit 1 fi # Verifico che lo username che ho ricevuto sia uguale al # common name del certificato con il quale l'utente si connette # questa e` doppia paranoia. if ! [[ "$user" = "${common_name}" ]]; then logger -s openvpn_MFA "Common name mismatch: Access denied for $user (common name: ${common_name})" exit 1 fi # Cerco lo username in oath.secrets ed estraggo la stringa # che contiene la chiave per generare il codice TOTP (in base32) # QUI NEL CASO IMPOSTATE IL PATH O IL NOME DEL FILE COME VOLETE VOI secret=$(grep -m 1 "^$user:" oath.secrets | cut -d: -f2) # Calcolo il codice TOTP e vedo se coincide # se coincide esco con exit code 0, altrimenti con exit code 1 code=$(oathtool --totp -b $secret) if [ "$code" = "$pass" ]; then logger -s openvpn_MFA "Access granted for $user (common name: ${common_name})" exit 0 fi exit 1