english version

Comment contrôler un programme interactif en perl ? SSL Network Extender Checkpoint pour debian

But

Comment faire fonctionner un outils propriétaire tel que snx (SSL Network Extender de Checkpoint) sur debian ?

Il est très pratique et a la mode de créer des VPN en s’appuyant sur la technologie HTTPS, le problème c’est sans windows vous ne pouvez pas utiliser le composant activeX.

Check point fournit un exécutable(snx) qui crée ce tunnel en utilisant le module tun.ko (Universal TUN/TAP device driver).

La commande snx pose trois problèmes :

  • snx utilise une vieille version de la libstdc++,
  • Il n’est pas possible d’enregistrer les mots de passe,
  • snx modifie /etc/resolv.conf.

Résultat en lançant la commande fraîchement installée on a :

$ /usr/bin/snx
/usr/bin/snx: symbol lookup error: /usr/bin/snx: undefined symbol: cerr

D’autre part la création du VPN doit être la plus simple possible pour accéder a l’information le plus rapidement possible, surtout si l’on se déplace souvent. Il faut donc pouvoir faire des profiles de connexion au VPN.

La modification faite par snx de resolv.conf détruit l’utilisation de resolvconf.

Détails techniques

Environnement

  • Une sous linux debian,
  • le module tun: Universal TUN/TAP device driver,
  • perl avec le package Expect.

Principes techniques

Solution technique pour la librairie libstdc++

Pour résoudre ce problème il faut avoir installer la bonne version de la librairie et simplement de la surcharger avant l’exécution de la commande avec LD_PRELOAD (Faire attention avec les setuid-bit).

$ /usr/bin/snx
/usr/bin/snx: symbol lookup error: /usr/bin/snx: undefined symbol: cerr
$ dpkg -S /usr/lib/libstdc++-libc6.2-2.so.3 
libstdc++2.10-glibc2.2: /usr/lib/libstdc++-libc6.2-2.so.3
# LD_PRELOAD=/usr/lib/libstdc++-libc6.2-2.so.3 snx -h
Check Point's Linux SNX
build 600000013
usage: snx -s <server> {-u <user>|-c <certfile>} [-l <ca dir>] [-p <port>] [-r] [-g] [-e <cipher>]
                                run SNX using given arguments
       snx -f <cf>              run the snx using configuration file
       snx                      run the snx using the ~/.snxrc

       snx -d                   disconnect a running SNX daemon

        -s <server>           connect to server <server>
        -u <user>             use the username <user>
        -c <certfile>         use the certificate file <certfile>
        -l <ca dir>           get trusted ca's from <ca dir>
        -p <port>             connect using port <port>
        -g                    enable debugging
        -e <cipher>           SSL cipher to use: RC4 or 3DES

Surcharger la partie interactive de snx

Pour éviter de taper a chaque fois les identifiants de connexion on utilisera le module perl Expect, d’autre par on détournera l’utilisation du fichier de configuration de snx pour y insérer les mots de passe :

server vpn-server.enterprise.com
username vpn_username
#password vpn_password
proxy_name proxy_server.other-enterprise.com
proxy_port 8081
proxy_user proxy_username
#proxy_pass proxy_password

Les lignes en commentaire ne seront pas lu par snx mais par le script en perl et utilisera ses données pour les injecter dans la partie interactive.

Utilisation

Ce script devra être utilisé en root (pour créer l’interface virtuelle).

Exemple type de fichier de profile/configuration (snxrc_work) :

server 192.168.1.254
username my_username
#password my_password

En ligne de commande

Connexion au VPN
# /path/to/snx_wraper.pl /path/to/snxrc_work
Check Point's Linux SNX
build 600000013
Please enter your password:
Send password
SNX - connected.

Session parameters:
===================
Office Mode IP      : 183.3.23.234
DNS Server          : 192.168.1.243
DNS Suffix          : mydomain.com
Timeout             : 8 hours 
Deconnexion
# /path/to/snx_wraper.pl -d
SNX - Disconnecting...
 done.

ifup/ifdown

Il est possible de modifier /etc/network/interface pour créer le VPN tout de suite après que l’interface réseau ait été configuré.

/etc/network/interface:

iface eth0 inet dhcp
        post-up /path/to/snx_wraper.pl /path/to/snxrc_work
        pre-down /path/to/snx_wraper.pl -d

Code

Le script

snx_wraper.pl:

#!/usr/bin/perl -w
 
use Expect;
 
#hash globale
my $h = {};
 
#Actions Handlers
sub handle_password {
  my $fh = shift;
  print "Send password\n";
  $fh->send($h->{password}, "\n");
  exp_continue;
}
 
sub handle_proxy_pass {
  my $fh = shift;
  print "Send proxy pass\n";
  $fh->send($h->{proxy_pass}, "\n");
  exp_continue;
}
 
my $handlers = [
		[qr'Please enter your password:' => \&handle_password],
		[qr'Please enter the password for proxy - [0-9.]+'
		 => \&handle_proxy_pass],
		[timeout => sub { print "Timeout !!!\n" }],
	       ];
 
#Additionnal snx's config file parsing
sub parse_cfgfile {
  open CFG, shift or die "$!";
  while (<CFG>) {
    chomp;
    if (/^#password\s(.*)$/) {
      $h->{password} = $1;
    }
    if (/^#proxy_pass\s(.*)$/) {
      $h->{proxy_pass} = $1;
    }
  }
  close CFG;
}
 
#Config file is present ? Yes do somme override
my $cfg_file = shift;
if ( -r $cfg_file ) {
  unshift @ARGV, "-f $cfg_file";
  parse_cfgfile($cfg_file);
} else {
  unshift @ARGV, $cfg_file;
  $cfg_file = undef;
}
 
#Control program running
my $snx_cmd = 'LD_PRELOAD=/usr/lib/libstdc++-libc6.2-2.so.3 snx';
$snx_cmd = join(' ', $snx_cmd, @ARGV);
my $snx = Expect->spawn($snx_cmd)
  or die "Cannot spawn $snx_cmd: $!\n";
$snx->expect(10, @$handlers);
 
#Post action on disconnect
if ($ARGV[0] eq '-d') {
  #Really kill snx
  system('killall -9 snx');
  #Handle resolvconf
  if ( -r '/etc/resolvconf/run/resolv.conf') {
    system('rm /etc/resolv.conf ; ln -s /etc/resolvconf/run/resolv.conf /etc');
  }
}
 
tech/snx.txt · Dernière modification: 2007/04/12 19:02 par danjer
 
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki Powered by Lescampeurs