Re: Script Iptables pour serveur web Apache2 MySQL ProFTPD avec Port Knocking pour SSH

2019-09-25 Par sujet Pascal Hambourg

Le 25/09/2019 à 14:14, G2PC a écrit :



# J'enlève la valeur SYN et l'accès web et terminal fonctionne
correctement.
-A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp
--tcp-flags FIN,RST,ACK SYN -j CT --notrack


Cette règle n'a aucune chance de s'appliquer puisque la combinaison
masque/drapeaux est impossible. Tu testes un drapeau qui n'est pas
dans le masque, ça ne peut pas marcher.

Hum. Bon, je te crois, je commente donc cette règle, le temps d'avoir
plus d'informations sur raw et les règles conseillées.
Est ce que le masque avec le SYN (que j'ai retiré) " FIN,SYN,RST,ACK SYN
" est plus cohérente que " FIN,RST,ACK SYN " ?


Bien sûr. C'est de l'algèbre booléenne de base. La seconde liste de 
--tcp-flags doit être incluse dans la première liste.
"FIN,RST,ACK SYN" signifie "conserver les valeurs des drapeaux FIN, RST 
et ACK et mettre à 0 les autres (dont SYN), puis renvoyer vrai si dans 
le résultat SYN=1 (ce qui est impossible) et tous les autres à 0".



Comme dit, avec le SYN en deuxième position, les accès sont coupés une
fois que je place la règle *filter


L'état UNTRACKED doit interférer soit avec le filtrage en entrée, soit 
avec le filtrage en sortie. Si un paquet SYN a été classé UNTRACKED, 
alors les paquets suivants de la poignée de main (SYN+ACK sortant et ACK 
entrant) sont classés par défaut dans l'état INVALID.



# Je ne sais pas si il est nécessaire d'autoriser le loopback vers
l'extérieur, voir à trouver un exemple.


Cette phrase n'a aucun sens puisque le trafic envoyé sur l'interface
de loopback ne va pas vers l'extérieur mais revient.


Tu parles de mon commentaire concernant la règle OUTPUT qui n'a pas de
sens, dès lors ?


Je parle de la phrase ci-dessus que j'ai laissée.


-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT


Typiquement, le paquet de réponse SYN/ACK à un paquet SYN dans l'état
UNTRACKED (à cause de -j CT --notrack) serait classé par défaut dans
l'état INVALID. Je ne connais pas l'interaction éventuelle avec SYNPROXY.


Je ne sais pas comment appréhender ce retour.
Le -j CT --notrack est dans la ligne qui a été désactivée dans la table *raw
A suivre.


Tu pourrais accepter les paquets SYN+ACK sortants ayant un des ports 
source concernés par le SYNPROXY.



# Autoriser les connexions DNS.
-A INPUT -p tcp --dport 53 -j ACCEPT


La machine fait serveur DNS pour l'extérieur ?


Je ne pense pas ? C'est à dire, est ce qu'elle transmet des informations
vers un autre service extérieur ?


C'est-à-dire qu'elle répond à des requêtes DNS.


Hormis les pages web, non, donc, si je t'entend bien, je peux supprimer
les règles DNS ?


Il vaut mieux ne pas supprimer les règles qui acceptent les requêtes DNS 
en sortie.



Qu'est-ce que la connexion fstp ?

Oups ! sFTP


Ça utilise SSH, donc rien à voir avec le protocole FTP.


-A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j LOG_ACCEPT
-A OUTPUT -p tcp --sport 49152:65534 --dport 49152:65534 -m state
--state ESTABLISHED -j LOG_ACCEPT


Inutiles puisque ces paquets ont déjà été acceptés par la règle
générique qui autorise les connexions déjà établies.
De toute façon, serait-il vraiment nécessaire de loguer ces paquets ?


ça fait beaucoup de paquets à loguer ?


Ça loguerait tous les paquets sortants des connexions de commande et de 
données FTP, soit grosso modo un paquet par commande FTP et un paquet 
par bloc de 1400 octets de données de fichier téléchargé ou de contenu 
de répertoire lu. Je ne vois pas l'intérêt, loguer le premier paquet suffit.



Le client me dit ceci, on observe que j'arrive bien à me connecter la
première fois, puis, sur un second compte il n'arrive pas à récupérer le
contenu du dossier.
Je me reconnecte au second compte, et, il arrive alors a récupérer le
contenu du dossier. Vraiment étrange.
Statut :    Connexion à 139.99.173.195:21...
Statut :    Connexion établie, attente du message d'accueil...
Statut :    Initialisation de TLS...
Statut :    Vérification du certificat...
Statut :    Connexion TLS établie.


Note : si tu utilises TLS avec FTP, alors le module de suivi de 
connection nf_conntrack mentionné dans mon message précédent est aveugle 
et inutile.



Statut :    Récupération du contenu du dossier...
Commande :    PWD
Réponse :    257 "/" est le répertoire courant
Commande :    TYPE I
Réponse :    200 Type paramétré à I
Commande :    PASV
Réponse :    227 Entering Passive Mode (139,99,173,195,202,139).
Commande :    LIST
Erreur :    Connection interrompue après 20 secondes d'inactivité


Il faudrait vérifier le port source utilisé par le client pour la 
connexion de données servant au listage. Attention : si le client est 
derrière un dispositif NAT (routeur, box), ce dernier peut modifier le 
port source à la volée. Regarde dans les logs générés par iptables.



-A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j
LOG_ACCEPT
-A INPUT -p tcp --sport 49152:65534 --dport 49152:65534 -m state
--state ESTABLISHED,RELATED,NEW -j LOG_ACCEPT


Côté serveur, tu ne 

Re: Script Iptables pour serveur web Apache2 MySQL ProFTPD avec Port Knocking pour SSH

2019-09-25 Par sujet G2PC

>>
>> Par exemple, pour ProFTPD, il me semble avoir configuré correctement le
>> service, mais, le client FileZilla ne semble pas réussir à se connecter
>> lors de toutes ses tentatives.
>> Actuellement, j'arrive régulièrement à me connecter au client FTP, mais,
>> pas à 100%.
>> Je précise, ce n'est pas la connexion qui semble bloquer
>> occasionnellement, mais, la lecture des dossiers une fois connecté,
>> d'après ce que je lis sur FileZilla.
>
> Donc les connexions de données avec les ports de destination dynamiques.
> Est-ce que tu as chargé le module de suivi de connexion FTP
> nf_conntrack_ftp ?
> Si oui, est-ce que tu as réglé l'option nf_conntrack_helper du module
> nf_conntrack à 1 puisque je ne vois pas de règle avec CT --helper pour
> affecter explicitement le helper ftp aux connexions de commande FTP ?

Alors la, bonne question !
J'ai vu passer ce mot clé " conntrack, quelques fois ses derniers jours,
mais, je ne crois pas avoir fait quoi que ce soit à ce niveau.
Je vais chercher. Merci.

>> *raw
>>
>> # Anti DDOS.
>> # Les paquets TCP avec le flag SYN à destination des ports 22,80 ou
>> 443 ne seront pas suivi par le connexion tracker et donc traités plus
>> rapidement.
>> ## Les pages ne chargent plus avec cette règle de décommentée tout
>> comme la connexion SSH devient impossible !
>
> En temps normal, ce n'est pas seulement le paquet SYN mais tous les
> paquets suivants (entrants et sortants) qu'il faut exclure du suivi de
> connexion et accepter. Par contre j'ai vu que tu utilises SYNPROXY qui
> interagit avec le suivi de connexion, mais je ne connais pas bien.

Comme dit, pour raw, j'ai enlevé ce filtrage sur SYN, car, j'ai un
conflit avec *filter à ce moment la, et, je ne peux plus naviguer sur
les pages, ni me connecter via SSH avec ma règle Port Knocking.
J'ai repris une règle présentée dans un tutoriel, et, je l'ai laissée
ainsi, en retirant SYN.
Idem, j'ai peu d'informations sur raw et sur ses paquets a supprimer
depuis raw.

>> # J'enlève la valeur SYN et l'accès web et terminal fonctionne
>> correctement.
>> -A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp
>> --tcp-flags FIN,RST,ACK SYN -j CT --notrack
>
> Cette règle n'a aucune chance de s'appliquer puisque la combinaison
> masque/drapeaux est impossible. Tu testes un drapeau qui n'est pas
> dans le masque, ça ne peut pas marcher.
Hum. Bon, je te crois, je commente donc cette règle, le temps d'avoir
plus d'informations sur raw et les règles conseillées.
Est ce que le masque avec le SYN (que j'ai retiré) " FIN,SYN,RST,ACK SYN
" est plus cohérente que " FIN,RST,ACK SYN " ?
Comme dit, avec le SYN en deuxième position, les accès sont coupés une
fois que je place la règle *filter, par contre, le site est fonctionnel
si je ne met QUE les restrictions dans la table *raw , de ce fait, je
pense à un effet de bord entre mes règles raw et filter.

>> # On pourrait interdire le ping avec icmp directement en PREROUTING.
>> # Pour le moment je vais l'interdire par défaut depuis *filter et
>> autoriser le ping aux services OVH.
>> # -A PREROUTING -p icmp -j DROP
>
> Erreur fréquente : ICMP, ce n'est pas seulement le ping mais aussi des
> messages d'erreur qu'il vaut mieux ne pas bloquer si on veut que les
> communications marchent bien.
Ok je prend note, j'ajoute ce commentaire au dessus de la ligne commentée.
>> # Pas de filtrage sur l'interface de loopback.
>> 
>> # Le serveur ne doit pas avoir de soucis à communiquer avec lui-même
>> au niveau des services internes.
>> # Accepter toutes les connexions de la machine locale pour permettre
>> aux services de communiquer entre eux.
>> -A INPUT -i lo -j ACCEPT
>> # Par la suite, la règle par défaut va DROP sur tous les OUTPUT non
>> autorisés.
>> # Je ne sais pas si il est nécessaire d'autoriser le loopback vers
>> l'extérieur, voir à trouver un exemple.
>
> Cette phrase n'a aucun sens puisque le trafic envoyé sur l'interface
> de loopback ne va pas vers l'extérieur mais revient.
Tu parles de mon commentaire concernant la règle OUTPUT qui n'a pas de
sens, dès lors ?

> # L'absence d'autorisation en sortie peut t'elle interférer avec
> certains services attendant une communication en sortie de loopback ?
>> # -A OUTPUT -o lo -j ACCEPT
OK, je décommente donc la règle OUTPUT pour le loopback. Merci.

>
> Evidemment ça interfère. Tout paquet envoyé sur l'interface de
> loopback passe successivement par les chaînes OUTPUT, POSTROUTING,
> PREROUTING et INPUT et doit être accepté dans toutes pour arriver à
> destination.
>
>> -A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT
>
> Typiquement, le paquet de réponse SYN/ACK à un paquet SYN dans l'état
> UNTRACKED (à cause de -j CT --notrack) serait classé par défaut dans
> l'état INVALID. Je ne connais pas l'interaction éventuelle avec SYNPROXY.
Je ne sais pas comment appréhender ce retour.
Le -j CT --notrack est dans la ligne qui a été désactivée dans la table *raw
A suivre.

>
>> 
>> # Autoriser les services web.
>> 
>> # 

Re: Script Iptables pour serveur web Apache2 MySQL ProFTPD avec Port Knocking pour SSH

2019-09-25 Par sujet Pascal Hambourg

Le 24/09/2019 à 23:46, G2PC a écrit :


Par exemple, pour ProFTPD, il me semble avoir configuré correctement le
service, mais, le client FileZilla ne semble pas réussir à se connecter
lors de toutes ses tentatives.
Actuellement, j'arrive régulièrement à me connecter au client FTP, mais,
pas à 100%.
Je précise, ce n'est pas la connexion qui semble bloquer
occasionnellement, mais, la lecture des dossiers une fois connecté,
d'après ce que je lis sur FileZilla.


Donc les connexions de données avec les ports de destination dynamiques.
Est-ce que tu as chargé le module de suivi de connexion FTP 
nf_conntrack_ftp ?
Si oui, est-ce que tu as réglé l'option nf_conntrack_helper du module 
nf_conntrack à 1 puisque je ne vois pas de règle avec CT --helper pour 
affecter explicitement le helper ftp aux connexions de commande FTP ?



*raw

# Anti DDOS.
# Les paquets TCP avec le flag SYN à destination des ports 22,80 ou 443 ne 
seront pas suivi par le connexion tracker et donc traités plus rapidement.
## Les pages ne chargent plus avec cette règle de décommentée tout comme la 
connexion SSH devient impossible !


En temps normal, ce n'est pas seulement le paquet SYN mais tous les 
paquets suivants (entrants et sortants) qu'il faut exclure du suivi de 
connexion et accepter. Par contre j'ai vu que tu utilises SYNPROXY qui 
interagit avec le suivi de connexion, mais je ne connais pas bien.



# J'enlève la valeur SYN et l'accès web et terminal fonctionne correctement.
-A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp --tcp-flags 
FIN,RST,ACK SYN -j CT --notrack


Cette règle n'a aucune chance de s'appliquer puisque la combinaison 
masque/drapeaux est impossible. Tu testes un drapeau qui n'est pas dans 
le masque, ça ne peut pas marcher.



# On pourrait interdire le ping avec icmp directement en PREROUTING.
# Pour le moment je vais l'interdire par défaut depuis *filter et autoriser le 
ping aux services OVH.
# -A PREROUTING -p icmp -j DROP


Erreur fréquente : ICMP, ce n'est pas seulement le ping mais aussi des 
messages d'erreur qu'il vaut mieux ne pas bloquer si on veut que les 
communications marchent bien.



# Pas de filtrage sur l'interface de loopback.

# Le serveur ne doit pas avoir de soucis à communiquer avec lui-même au niveau 
des services internes.
# Accepter toutes les connexions de la machine locale pour permettre aux 
services de communiquer entre eux.
-A INPUT -i lo -j ACCEPT
# Par la suite, la règle par défaut va DROP sur tous les OUTPUT non autorisés.
# Je ne sais pas si il est nécessaire d'autoriser le loopback vers l'extérieur, 
voir à trouver un exemple.


Cette phrase n'a aucun sens puisque le trafic envoyé sur l'interface de 
loopback ne va pas vers l'extérieur mais revient.



# L'absence d'autorisation en sortie peut t'elle interférer avec certains 
services attendant une communication en sortie de loopback ?
# -A OUTPUT -o lo -j ACCEPT


Evidemment ça interfère. Tout paquet envoyé sur l'interface de loopback 
passe successivement par les chaînes OUTPUT, POSTROUTING, PREROUTING et 
INPUT et doit être accepté dans toutes pour arriver à destination.



-A OUTPUT -m conntrack ! --ctstate INVALID -j ACCEPT


Typiquement, le paquet de réponse SYN/ACK à un paquet SYN dans l'état 
UNTRACKED (à cause de -j CT --notrack) serait classé par défaut dans 
l'état INVALID. Je ne connais pas l'interaction éventuelle avec SYNPROXY.




# Autoriser les services web.

# Autoriser les connexions DNS.
-A INPUT -p tcp --dport 53 -j ACCEPT


La machine fait serveur DNS pour l'extérieur ?


-A INPUT -p udp --sport 53 -j ACCEPT


Cette règle est une faille de sécurité en plus d'être inutile.


# Configurer le FTP et le pare-feu pour utiliser la plage de ports passifs 
entre 49152-65534 proposée par IANA.
# Noter que la connexion de semble pas s'établir à chaque fois et qu'il est 
nécessaire de retenter la connexion.
# Noter que la connexion fstp n'est pas configurée actuellement. A faire !


Qu'est-ce que la connexion fstp ?


-A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j LOG_ACCEPT
-A OUTPUT -p tcp --sport 49152:65534 --dport 49152:65534 -m state --state 
ESTABLISHED -j LOG_ACCEPT


Inutiles puisque ces paquets ont déjà été acceptés par la règle 
générique qui autorise les connexions déjà établies.

De toute façon, serait-il vraiment nécessaire de loguer ces paquets ?


-A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT
-A INPUT -p tcp --sport 49152:65534 --dport 49152:65534 -m state --state 
ESTABLISHED,RELATED,NEW -j LOG_ACCEPT


Côté serveur, tu ne maîtrises pas la plage de ports du client. 
Restreindre les ports source du client à la même plage que celle du 
serveur est abusif.



# Autoriser les connexions au serveur web Apache2.
-A INPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT


Maintenant que ces paquets sont acceptées, toutes les règles suivantes 

Script Iptables pour serveur web Apache2 MySQL ProFTPD avec Port Knocking pour SSH

2019-09-24 Par sujet G2PC
Merci à tous pour vos précédents retours concernant ICMP.

J'ai pu avancer, à mon niveau, avec les quelques règles Iptables suivantes.
Situation : Serveur VPS OVH - Apache2 MariaDB ProFTPd - Pas de serveur
de mail à proprement parler ( Un peu de Exim4 ici et de mutt / mailx par
la. )

J'ai tenté de prendre en considérations vos précédents retours, mais,
j'ai parfois fait l'impasse, par manque de temps ou de compréhension.

Voilà le récapitulatif complet, pour ce que j'ai pu en apprendre et
comprendre -> pour le moment <-
Vos retours sont les bienvenus pour continuer à améliorer ce script.

La bonne nouvelle, c'est que ce script semble fonctionner !
Mes pages web sont délivrées, je peux me connecter à SSH via Port
Knocking ! Cela répond à mes premières attentes !

Par contre, il s'y cache peut être des effets de bord, et, certainement,
des optimisations à mener.

Par exemple, pour ProFTPD, il me semble avoir configuré correctement le
service, mais, le client FileZilla ne semble pas réussir à se connecter
lors de toutes ses tentatives.
Actuellement, j'arrive régulièrement à me connecter au client FTP, mais,
pas à 100%.
Je précise, ce n'est pas la connexion qui semble bloquer
occasionnellement, mais, la lecture des dossiers une fois connecté,
d'après ce que je lis sur FileZilla.
Plus d'informations dans la partie *filter, ou j'ai indiqué la plage de
ports que j'ai du ouvrir pour permettre à FileZilla de fonctionner
globalement, en utilisant une connexion passive.


Je n'en dis pas plus, bonne lecture, et, bonnes critiques !


  Règle personnalisée pour configurer Iptables raw

# Créer le fichier iptables-firewall-raw.rules et ajouter les règles suivantes.
# sudo nano iptables-firewall-raw.rules

# Début de la règle raw.
*raw

# Anti DDOS.
# Les paquets TCP avec le flag SYN à destination des ports 22,80 ou 443 ne 
seront pas suivi par le connexion tracker et donc traités plus rapidement.
## Les pages ne chargent plus avec cette règle de décommentée tout comme la 
connexion SSH devient impossible !
## Ce blocage semble apparaître quand j'active les règles de la table raw et 
filter.
## -A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp --tcp-flags 
FIN,SYN,RST,ACK SYN -j CT --notrack
# J'enlève la valeur SYN et l'accès web et terminal fonctionne correctement.
-A PREROUTING -p tcp -m multiport --dports 22,80,443 -m tcp --tcp-flags 
FIN,RST,ACK SYN -j CT --notrack

# Donc, ici, j'ai eu un blocage web et de ma connexion SSH, quand je 
laissais la valeur SYN, puis, que j'ajoutais la règle *filter.
# Est ce du à un conflit de règle, entre raw et filter ?
# J'ai supprimé la valeur SYN, et, maintenant, les pages web et la 
connexion SSH semble fonctionner correctement, même après l'ajout de la règle 
*filter.

# Maîtrise de charge.
# Regrouper les adresses IP sources par bloc de 256 sous réseaux en /24 et 
n’autoriser qu'un nombre maximum de demandes de connexions SYN par seconde pour 
chaque sous réseau.
# Utiliser le module hashlimit. Permet de mettre un plafond de connexion par 
seconde vers le serveur par groupe de 256 IP.
-A PREROUTING -p tcp -m tcp --syn -m multiport --dports 22,80,443 -m hashlimit 
--hashlimit-above 200/sec --hashlimit-burst 1000 --hashlimit-mode srcip 
--hashlimit-name syn --hashlimit-htable-size 2097152 --hashlimit-srcmask 24 -j 
DROP

# Fin de la règle.
COMMIT

# Importer le script dans Iptables.
# sudo iptables-restore < iptables-firewall-raw.rules

# Vérifier que les règles aient bien été ajoutées dans la table raw :
# sudo iptables -t raw -L


  Règle personnalisée pour configurer Iptables mangle

# Créer le fichier iptables-firewall-mangle.rules et ajouter les règles 
suivantes.
# sudo nano iptables-firewall-mangle.rules

# Début de la règle mangle.
*mangle

# Bloquer la fragmentation TCP :
-A PREROUTING -f -j DROP

# Paquet avec SYN et FIN à la fois :
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
# Paquet avec SYN et RST à la fois
-A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
# Paquet avec FIN et RST à la fois
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
# Paquet avec FIN mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
# Paquet avec URG mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
# Paquet avec PSH mais sans ACK
-A PREROUTING -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
# Paquet avec tous les flags à 1 <=> XMAS scan dans Nmap
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG 
FIN,SYN,RST,PSH,ACK,URG -j DROP
# Paquet avec tous les flags à 0 <=> Null scan dans Nmap
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
# Paquet avec FIN,PSH, et URG mais sans SYN, RST ou ACK
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j 
DROP
# Paquet avec FIN,SYN,PSH,URG mais sans ACK ou RST
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,PSH,URG 
-j DROP
# Paquet avec