[SysAdmin] Safe-iptables

Lorsqu’on est administrateur systèmes et réseaux spécialisé dans le logiciel libre, on bosse la majorité du temps sur des serveurs GNU/Linux ou BSD, ce qui implique une utilisation privilégiée de la console ainsi que du protocole SSH pour les accès distants.

L’un des risques que l’ont encoure est de perdre cet accès SSH suite à une fausse manipulation, plus particulièrement lors de l’ajout d’une règle de firewall.

Personnellement, je travaille essentiellement sur des serveurs localisés en Afrique du sud, une telle erreur serait donc dramatique car je perdrais mon unique voie d’accès. Pour éviter de me retrouver dans une telle situation, j’ai codé en Bash une petite commande pour adapter à iptables le mécanisme de confirmation qui existe sur Shorewall.

#!/bin/sh

# Safe-iptables
# Author  : Nassim Kacha
# License : GNU GPL2
# Date    : 30/08/2010

# Exit codes
#
# O Normal execution
# 1 Can't save previous firewalling rules
# 2 Bad arguments
# 3 Missing root privileges
# 4 Changements aborted by user

TIME=5 # Can be customized

if [ -z $TMPDIR]; then
     TMPDIR='/tmp'
fi

TMPFILE=`/usr/bin/mktemp --tmpdir=$TMPDIR iptables_XXXXX`

privilege_checking() {
	if [ $(id -u) -ne 0 ]; then
		echo "Sorry, you must run the command as root !"
		exit 3
	fi
}

main() {
	read -n 1 -t $TIME -p "Are you sure ? [y/N]" key
	case "$key" in
  		y|Y )
				/bin/rm -f $TMPFILE
				echo -e "n+ Rule applied"
				exit 0;;

		n|N|'' )
				/usr/sbin/iptables-restore > $TMPFILE
				/bin/rm -f $TMPFILE
				echo -e "n- Rule not applied"
			  	exit 4;;

		* ) 	echo ''
				main;;
	esac
}

### Main ###
privilege_checking
/usr/sbin/iptables-save > $TMPFILE
if [ $? -ne 0 ]; then
	echo "Error : not possible to save the previous firewall rules"
	exit 1
fi
/usr/sbin/iptables $*
if [ $? -eq 0 ]; then
	main
fi
exit 2

Cette commande fonctionne exactement de la même manière que la commande iptables à ceci près qu’elle vous demande une confirmation après avoir appliqué la nouvelle règle de pare-feu. Ainsi, si votre règle est mauvaise et qu’elle vous coupe votre liaison SSH, elle sera annulée après cinq seconde faute d’avoir pu confirmer la commande. Cela apporte donc une sécurité non négligeable lors de l’édition de vos règles de firewalling.

Je vous recommande d’enregistrer le code ci-dessus sous un fichier /usr/sbin/safe-iptables, de l’attribuer à l’utilisateur root et de lui donner les permissions 755. Il est aussi  judicieux d’insérer un alias dans votre fichier .bashrc qui remplacerait la commande iptables par safe-iptables.

Je compte packager ce script en DEB et en RPM dès que possible. Pour finir, je vous encourage à reprendre et à améliorer ce script si vous avez des idées supplémentaires.

EDIT 04/09/2010 : Modification du script suite aux excellentes remarques de TixxDZ.

Vus : 960
Publié par Nassim KACHA : 5