J'ai un blem j'utilise assez souvent openvpn et en fonction de l'endroit ou
je vais j'ai besoin de tel ou tel access VPN sur telles ou telles resources
plus ou moins en meme temps etc.. bref j'ai besoin de plusieurs "profils"
utilisateur.
Depuis des mois, je me tape l'edition du /etc/rc.conf et apres je tape la
passphrase 2 ou 3 fois vu que j ai 2 ou 3 necessaires... enfin bref, j'en ai eu
marre alors j 'ai fait un "hack" tout bete et tout simple en qqes etapes.
le plan:
- un fichier encrypted avec ma clef pub qui contient la passphrase.
- un script qui mets a la disposition d'openvpn cette passphrase
- qqes hack dans les scripts de demarrage et les fichiers de conf.
1 . le fichier: key.asc
il contient la clef utilise pour unlocker le cert utilise pour l'auth, il doit
donc rester prive!
2. le script de demarrage
/usr/pkg/etc/rc.d/openvpn:
la ligne suivante a ete modifie:
openvpn_start()
{
: ${openvpn_cfg="*.conf"}
[...]
for f in $openvpn_cfg; do
doit="$command --askpass `/bin/cat /home/user/.openvpn`
$command_args --config $f"
if ! eval $doit; then
[...]
}
3. le fichier /etc/rc.conf, legerement modifie:
[...]
openvpn=YES
. /etc/openvpn_current
[...]
4. le script moisi, ovpn.sh
ce script va choisir/preparer mon "profil" et demarrer les instances openvpn
en utilisant la cle temporairement accessible.
#!/bin/sh
#
#
# I sick of typing my password for all VPN instances
# all the time... $#@!$#@!$#@! :(
#
# there is probably some potential races
#
export TMPDIR=/home/user
MKTEMPCMD=/usr/bin/mktemp
GPGCMD=/usr/pkg/bin/gpg
VPNCMD=/usr/pkg/etc/rc.d/openvpn
RMCMD=/bin/rm
TOUCHCMD=/usr/bin/touch
CHMODCMD=/bin/chmod
CHOWNCMD=/usr/sbin/chown
TMPPREFIX=".openvpn"
VPNCIPHR=/home/user/.local/key.asc
VPNPLAIN=/home/user/.openvpn
VPNCMD_STOP=stop
VPNCMD_RESTART=restart
# OPENVPN PRECONFIG
CURR_CFG=/etc/openvpn_current
HOME_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf\""
LABS_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf\""
OUTR_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf client_vpn5.conf\""
TMPFILE=`${MKTEMPCMD} -t ${TMPPREFIX}`
#echo "[+] using ${TMPFILE}"
ovpn_start()
{
${TOUCHCMD} ${VPNPLAIN}
${CHOWNCMD} root:wheel ${VPNPLAIN}
${CHMODCMD} 600 ${VPNPLAIN}
echo "$TMPFILE" > ${VPNPLAIN}
${GPGCMD} -d ${VPNCIPHR} > ${TMPFILE}
${VPNCMD} start
${RMCMD} -fP ${VPNPLAIN}
${RMCMD} -fP ${TMPFILE}
}
ovpn_stop()
{
${VPNCMD} stop
}
CMD=$1
CNF=$2
case ${CMD} in
start)
case ${CNF} in
home)
echo ${HOME_CFG} > ${CURR_CFG}
;;
lab)
echo ${LABS_CFG} > ${CURR_CFG}
;;
out)
echo ${OUTR_CFG} > ${CURR_CFG}
;;
esac
ovpn_start
;;
stop)
ovpn_stop
;;
restart)
$0 stop
$0 start ${CNF}
;;
*)
echo "$0 <start|stop|restart> [<home|lab|out>]"
echo "home: home configuration"
echo "lab : lab configuration"
echo "out : untrusted out configuration"
;;
esac
5. L'explication,
le fichier rc.conf inclus un fichier qui est genere dynamiquement
(/etc/openvpn_current) a chaque demande d'un nouveau "profil" celui ci donne a
openvpn les fichier de conf a utiliser pour demarrer les differents VPN.
Le script de demarrage du package openvpn lance openvpn avec un nouveau
parametre supplementaire " --askpass file " qui
donnera la passphrase pour unlocker le certificat d'authentification.
Le script utilisateur ovpn.sh lui s'occupe simplement de cree le
/etc/openvpn_current, il gpg -d le fichier de clef key.asc le rajoute dans un
fichier temporaire, demarre openvpn et efface ce fichier immediatement
apres.
La derniere mouture qui tourne chez moi est tres legerement different en
cela que je ne stocke pas la passphrase de mon cert dans un fichier encrypted
en gpg, je "read" directement du tty et je feed immediatement le fichier
temporaire.
Voila c'etait tout con mais maintenant pour demarrer mes 4-5 vpns en tapant
juste ma passphrase gpg, je fais en sudo :
# ovpn.sh start home
You need a passphrase to unlock the secret key for
user: "..."
1024-bit ELG-E key, ID XXXXXXXX, created 2004-05-27
(main key ID XXXXXXXX)
Enter passphrase:
Et voila! En esperant que ca en inspire d'autres, commentaires are welcome!
:)