Script pour parefeu simplifié

Le Script dont il est question, dernière version : http://www.isalo.org/wiki.debian-fr/index.php?title=Parefeu_Simplifi%C3%A9

Afin de ne pas trop disgresser sur ce fil : digression-installation-parefeu-iptables-pour-les-nuls-t26303-400.html , j’ouvre celui-ci bien qu’il reprenne des idées du précédent et pourrait aider à améliorer ce dernier.

Suite à la lecture de ceci : debian.org/doc/manuals/secur … es.fr.html
Section “5.14.3.2 Configuration manuelle init.d” , j’ai voulu reprendre le script pour en faire un du type “parefeu pour les nuls” comme dans trucs et astuces : installation-parefeu-iptables-pour-les-nuls-t1901.html .

Le but étant d’éviter d’enregistrer la configuration d’iptables dans un fichier tiers, ce qui pose parfois souci lors du changement de noyau. (iptables-restore comprend mal les règles précédentes)

Le script reprend largement ce qui a été fait dans T&A, et tente de simplifier la configuration du parefeu en décommentant certaines lignes, ou en ajoutant les ports à ouvrir. Ainsi vous n’aurez pas à recopiez tout un tas de lignes, seulement le script.

Le script en question :

[code]#!/bin/sh

BEGIN INIT INFO

Provides: mon_parefeu

Required-Start: $local_fs

Should-Start:

Required-Stop: $local_fs

Should-Stop:

X-Start-Before: $network

X-Stop-After: $network

Default-Start: S

Default-Stop: 0 6

Short-description: Configure le parefeu

Description: Met en place les règles iptables.

END INIT INFO

Exemple de configuration de pare-feu

Défauts :

- Cette configuration s’applique à toutes les interfaces réseau.

Si vous voulez restreindre cela à une interface donnée,

utilisez ‘-i INTERFACE’ dans les appels iptables.

- Par défaut, le script autorise tout en sortie. Pour changer ce comportement

veuillez commenter la ligne /sbin/iptables -t filter -P OUTPUT ACCEPT

et décommenter les lignes #REMOTE_TCP_SERVICES=""

#REMOTE_UDP_SERVICES=""

ainsi que les blocs suivant : #if [ -n “$REMOTE_TCP_SERVICES” ] ; then

et #if [ -n “$REMOTE_UDP_SERVICES” ] ; then

description: Active/Désactive le pare-feu au démarrage

#---------------------------------------------------------------

readonly IPTABLES=/sbin/iptables

Services que le système offrira au réseau, à séparer avec des espaces

ftp : 21, ssh : 22, serveur web : 80, cups : 631, jabber : 5222

TCP_SERVICES="“
UDP_SERVICES=”"

Services que le système utilisera du réseau

Décommenter ces lignes pour limiter les services en sortie (défaut : autorise tout en sortie)

#REMOTE_TCP_SERVICES=""
#REMOTE_UDP_SERVICES=""

if ! [ -x $IPTABLES ]; then
exit 0
fi

fw_start () {

Vidage

fw_clear
echo "Parefeu - Suppression des règles : [OK]"

Interdictions

$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP

echo "Parefeu - interdictions générales établies : [OK]"

Loopback

$IPTABLES -t filter -A INPUT -i lo -j ACCEPT

Trafic d’entrée :

$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Refus du ping pour éviter de répondre aux scans des éventuels vilains

$IPTABLES -t filter -A INPUT -p icmp -j LOG
$IPTABLES -t filter -A INPUT -p icmp -j DROP

Sortie autorisée,

à commenter si seuls certains services doivent être autorisés en sortie.

$IPTABLES -t filter -P OUTPUT ACCEPT

Services à autoriser en entrée

for PORT in $TCP_SERVICES; do
	$IPTABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done

for PORT in $UDP_SERVICES; do
	$IPTABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
done

Décommenter les lignes suivantes pour n’autoriser que certains

services en sortie

#for PORT in $REMOTE_TCP_SERVICES; do
#	$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
#done
#for PORT in $REMOTE_UDP_SERVICES; do
#	$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
#done
#echo "Parefeu - Mise en place des règles : [OK]"

Décommenter les lignes après les traits

pour une machine faisant office de routeur avec NAT

ethx correspond à l’interface du LAN

ethy correspond à l’interface reliée à la truc-box

-------------------------------------------

#$IPTABLES -A INPUT -i ethx -j ACCEPT
#$IPTABLES -A INPUT -p icmp -j ACCEPT
#$IPTABLES -A FORWARD -i ethy -o ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
#$IPTABLES -A FORWARD -o ethy -j ACCEPT
#$IPTABLES -t nat -A POSTROUTING -o ethy -j MASQUERADE

#echo "Parefeu - Routeur avec NAT : [OK]"

Toutes les autres connexions sont enregistrées dans syslog

#$IPTABLES -t filter -A OUTPUT -j LOG
$IPTABLES -t filter -A INPUT -j LOG --log-level=4

echo "Parefeu - Logging : [OK]"

}

fw_stop () {
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
}

fw_clear () {
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -F
}

fw_status () {
$IPTABLES -L --line-numbers
}

case “$1” in
start|restart)
echo "Starting firewall…"
fw_stop
fw_start
echo “done.”
;;
stop)
echo "Stopping firewall…"
fw_stop
echo “done.”
;;
clean)
echo "Clearing firewall rules…"
fw_clear
echo “done.”
;;
status)
echo "Firewall status"
fw_status
;;
*)
echo "Usage: $0 {start|stop|restart|clean|status}"
exit 1
;;
esac
exit 0

[/code]

Pour utiliser le script, il faut l’enregistrer comme /etc/init.d/mon_parefeu
Le rendre éxécutable : chmod +x /etc/init.d/mon_parefeu
L’activer au démarrage : insserv mon_parefeu

Bien sûr, il faudrait corriger/améliorer ce script. À vos commentaires!

Salut,

Dès que tu l’auras mis sur le wiki on pourra t’aider :023 :033

Pourquoi pas, mais ce n’est pas à utiliser comme référence avant l’approbation des autorités en la matière :slightly_smiling:

isalo.org/wiki.debian-fr/ind … lifi%C3%A9

On peut parfaitement en discuter ici aussi.
Perso je n’ai rien “contre” une révision, je préserve seulement le travail qu’avait fait Matt sur le tuto actuel et que je n’avais fait que mettre en page et broder un peu dessus.
Une petite remarque sur ce qui est proposé :

# Loopback /sbin/iptables -t filter -A INPUT -i lo -j ACCEPT /sbin/iptables -t filter -A INPUT -i lo -j ACCEPT
Je ne vois pas la différence entre les deux lignes ?

Cups : 632 ou 631 ?

[quote]PATH=/bin:/sbin:/usr/bin:/usr/sbin

Vidage

/sbin/iptables -t filter -F[/quote]

Si le PATH est indiqué, pourquoi continuer à mettre le chemin complet ?

EDIT :
refus du ping, il serait bien d’expliquer pourquoi car Pascal ne sera ptet pas d’accord.

Salut,
Merci Thuban, très joli script. :023

Pour une question d’optimisation de l’exécution :slightly_smiling:

Salut

Merci, j’ai testé ça marche bien

Pour cups c’est 631
et pour l’entête j’ai mis

[code]# Default-Start: S

Default-Stop: 0 6[/code]

Pour que le script démarre au runlevel S avant networking

L’avantage que je trouve avec ce script c’est que si on fait un

et qu’on oublie après de faire un

au prochain démarrage les règles seront toujours là

Pour une question d’optimisation de l’exécution :slightly_smiling: [/quote]
La redéfinition du PATH ne sert à rien et c’est de la microoptimisation. Généralement on fait ça pour ne pas avoir un PATH qui a déjà était redéfini.

Ceux-ci

[quote]if [ -n “$UDP_SERVICES” ] ; then
for PORT in $UDP_SERVICES; do
/sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
fi[/quote]
peut être remplacé par :

for PORT in $UDP_SERVICES; do /sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT done

J’y connais pas grand chose en netfilter pourquoi le nettoyage que fait la fonction start n’utilise pas la fonction clean ?

[code]# - Cette configuration s’applique à toutes les interfaces réseau.

Si vous voulez ne restreindre cela qu’à une interface donnée,

utilisez ‘-i INTERFACE’ dans les appels iptables.[/code]

Et mettre /sbin/iptables dans une variable (en lecture seule) ce serait pas plus simple pour faire cette modification que le modifier qu’à 53 endroit différent ?

[quote=“ricardo”]On peut parfaitement en discuter ici aussi.
Perso je n’ai rien “contre” une révision, je préserve seulement le travail qu’avait fait Matt sur le tuto actuel et que je n’avais fait que mettre en page et broder un peu dessus.
Une petite remarque sur ce qui est proposé :

# Loopback /sbin/iptables -t filter -A INPUT -i lo -j ACCEPT /sbin/iptables -t filter -A INPUT -i lo -j ACCEPT
Je ne vois pas la différence entre les deux lignes ?

Cups : 632 ou 631 ?

[quote]PATH=/bin:/sbin:/usr/bin:/usr/sbin

Vidage

/sbin/iptables -t filter -F[/quote]

Si le PATH est indiqué, pourquoi continuer à mettre le chemin complet ?

EDIT :
refus du ping, il serait bien d’expliquer pourquoi car Pascal ne sera ptet pas d’accord.[/quote]
Bien vu! Erreur lors de la copie d’une règle, il faut supprimer une des 2 lignes en double!
Pour le refus de ping, c’est pour éviter de répondre aux scans qu’un éventuel pirate peut faire.
Pour le path, j’ai bêtement réutilisé ce qui était proposé dans le manuel de sécurisation debian.

Enregistrer le chemin de iptable dans une variable est en effet plus pratique.

Pour les blocs if [ -n "$UDP_SERVICES" ] ; then for PORT in $UDP_SERVICES; do /sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT done fi
Pourquoi ne pas laisser le if? Cela permet de vérifier qu’il y a bel et bien une règle à appliquer. Le for ne se lancera pas si $UDP_SERVICES est vide?

[quote=“thuban”]Pour les blocs if [ -n "$UDP_SERVICES" ] ; then for PORT in $UDP_SERVICES; do /sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT done fi
Pourquoi ne pas laisser le if? Cela permet de vérifier qu’il y a bel et bien une règle à appliquer. Le for ne se lancera pas si $UDP_SERVICES est vide?[/quote]
Voila

Script modifié sur le wiki selon vos conseils. :slightly_smiling:
Il y a un truc qui me chiffonne, pour un néophyte, devoir décommenter/commenter des lignes, c’est pas super quand même. Une idée pour rendre ça plus accessible?

[quote=“thuban”]Script modifié sur le wiki selon vos conseils. :slightly_smiling:
Il y a un truc qui me chiffonne, pour un néophyte, devoir décommenter/commenter des lignes, c’est pas super quand même. Une idée pour rendre ça plus accessible?[/quote]

Est-ce que mettre en place un firewall est vraiment une activité de néophyte ?

En mettant le chemin complet pour une ligne qui se répète aussi souvent dans le script, ce sont combien de comparaisons et de balayages économisés ?

@ Thuban :
Je suis avec plaisir ce travail et je te félicite de l’avoir entamé.
[moquerie]
Si Michel a commencé à y mettre le nez, tu n’as pas fini de le reprendre ton script :laughing: :laughing: :laughing:
Si ça fait comme moi avec “sauvegarde”, tu crois demander un ou deux conseils et tu te retrouves deux mois après en améliorant encore des ‘virgules’.
Je dis ça mais j’ai énormément appris en deux mois de “cours” et je les remercie tous, MisterFreez compris :023

[/moquerie]

Un conseil :
Modifie ton script de départ à chaque modification que tu juges pertinente, ainsi, on pourra toujours y aller le consulter facilement.
a+ :006

[quote=“thuban”]Script modifié sur le wiki selon vos conseils. :slightly_smiling:
Il y a un truc qui me chiffonne, pour un néophyte, devoir décommenter/commenter des lignes, c’est pas super quand même. Une idée pour rendre ça plus accessible?[/quote]
Il faut que tu fasses un système de choix.

Héhé, j’ai l’habitude avec Mimi, il a une capacité de correction impressionnante, mais ça reste toujours constructif donc on ne lui en veut pas trop :smiley:

Je veux bien modifier le premier post autant de fois que possible, mais consulter le wiki et le modifier par chacun sera sans doute aussi simple, car je ne pense pas être assez érudit pour juger à chaque fois de ce qui est réellement bon à corriger.

[quote=“ricardo”][quote=“thuban”]Script modifié sur le wiki selon vos conseils. :slightly_smiling:
Il y a un truc qui me chiffonne, pour un néophyte, devoir décommenter/commenter des lignes, c’est pas super quand même. Une idée pour rendre ça plus accessible?[/quote]
Il faut que tu fasses un système de choix.[/quote]
À quoi penses-tu?

[quote=“thuban”]Héhé, j’ai l’habitude avec Mimi, il a une capacité de correction impressionnante, mais ça reste toujours constructif donc on ne lui en veut pas trop :smiley:

Je veux bien modifier le premier post autant de fois que possible, mais consulter le wiki et le modifier par chacun sera sans doute aussi simple, car je ne pense pas être assez érudit pour juger à chaque fois de ce qui est réellement bon à corriger.[/quote]
Alors je te propose une chose simple et facile pour tous :
modifier ta signature avec seulement un lien sur cette page du wiki, genre :
"script iptables en développement"
Une fois terminé les discussions, càd dans 5 ou 6 mois :laughing: , tu pourras replacer ta signature actuelle.

[quote=“thuban”][quote=“ricardo”][quote=“thuban”]Script modifié sur le wiki selon vos conseils. :slightly_smiling:
Il y a un truc qui me chiffonne, pour un néophyte, devoir décommenter/commenter des lignes, c’est pas super quand même. Une idée pour rendre ça plus accessible?[/quote]
Il faut que tu fasses un système de choix.[/quote]
À quoi penses-tu?[/quote]
Ben en fait, ça serait encore plus compliqué que de commenter/décommenter, alors ne tiens pas compte de ça.

Conseil :
Pour la clarté du script, je te propose de mettre toutes les fonctions en tête et de séparer ce qui peut être considéré comme un bloc ou un paragraphe, par une ligne de tirets ou autre genre
------------------fonctions-------------------------


-----------------variables---------------------------

etc.

EDIT :
Excuse-moi, je n’avais pas vu que tout était écrit en “fonction”.

Quelques centaines de cycles d’horloges, je crois (soit une micro seconde sur une CPU 1GHz). Si on veut vraiment optimiser il faudrait tout faire par save/restore (en proportion le gain devrait être monstrueux) en attendant un truc comme firewalld.

[quote=“ricardo”][moquerie]
Si Michel a commencé à y mettre le nez, tu n’as pas fini de le reprendre ton script :laughing: :laughing: :laughing:
Si ça fait comme moi avec “sauvegarde”, tu crois demander un ou deux conseils et tu te retrouves deux mois après en améliorant encore des ‘virgules’.
Je dis ça mais j’ai énormément appris en deux mois de “cours” et je les remercie tous, MisterFreez compris :023
[/moquerie][/quote]
C’était un plaisir :slightly_smiling:

Il y en a qui jouent à des solitaires pour se divertir, moi je lis du code.