11déc. 2008
Autoriser l'accès à un serveur sur demande
Quand on administre un serveur Linux, il est nécessaire de pouvoir s'y connecter, idéalement avec ssh. Le problème c'est que si on laisse un port ssh ouvert au monde entier, on se retrouve rapidement avec des série d'attaques "Brute Force" qui risquent d'exposer le serveur en plus de charger son cpu.
Afin de contourner le problème, on peut décider d'autoriser le ssh (ou
d'autres protocoles), seulement à partir d'une adresse IP, par exemple celle
d'un machine passerelle sur internet, ou celle d'un client à qui on donne ce
genre d'accès. La commande iptables ressemblerait
à ceci:
iptables -A INPUT -s $IP_DE_CONFIANCE -p tcp --dport 22 -j ACCEPT
Ça nous limite toutefois à une adresse IP qu'on connaît à l'avance. J'ai donc imaginé une solution très simple qui permette d'ouvrir la porte à partir d'une page web...
- Une page web en php ou autre.
- Un script qui tourne en permanence.
- Une méthode pour s'assurer que le script ne s'arrête jamais.
/tmp/sesame
) qui
contiendra l'adresse IP de l'appelant.Voici ce que ça donnerait en php:
<?phpEnsuite le petit script qui va tourner en permanence sur la machine. Il s'agit d'un petit script shell qui va simplement attendre que le fichier
$ip=$_SERVER['REMOTE_ADDR'];
system("echo $ip > /tmp/sesame");
?>
/tmp/sesame
existe. Quand il le trouve, il ajoute une table pour
autoriser l'adresse IP contenue dans le fichier:
#!/bin/shEnfin, afin que ce script se lance au démarrage, et qu'il ne s'arrête jamais, j'aime utiliser le fichier
FILE_IP=/tmp/sesame
IPTABLES_RULE=INPUT
OPTIONS="-p tcp --dport 22"
while :
do
sleep 1
[ -f $FILE_IP ] || continue
IP=`cat $FILE_IP`
if iptables-save | grep -q $IP
then
sleep 1
else
if ipcalc -m $IP >/dev/null 2>&1
then
iptables -I $IPTABLES_RULE -s $IP $OPTIONS -j ACCEPT
iptables -I $IPTABLES_RULE -d $IP -j ACCEPT
fi
fi
echo "`date` `hostname`" | mail -s "SESAME `hostname` $IP" root
rm $FILE_IP 2>/dev/null
done
/etc/inittab
. J'ajoute simplement la
ligne suivante afin que le tout s'exécute en runlevel 3 :
tc:3:respawn:/root/scripts/sesame.shEt afin d'activer le tout, on tape la commande
init q
qui relit le
fichier inittab. Voilà. Maintenant il me suffit d'appeler la page
http://monserveur.tld/lenomquejaichoisi.php
et la porte s'ouvre
par magie....L'utilisateur
root
Bien-sûr il existe d'autres solutions plus sécurisées et plus complètes comme le Port Knocking, mais le fait d'ouvrir l'accès temporairement l'accès à partir d'une machine n'est pas une menace en soi, en tout cas pas pour un serveur ordinaire qui est déjà sécurisé.