Configuration Iptables - PostgreSql

De EjnTricks
Révision de 15 novembre 2018 à 13:56 par Etienne (discussion | contributions) (Page créée avec « L'application <code>PostSql</code> a été installée sur la machine afin de disposer d'un serveur de base de données pour l'ensemble des applications nécessitant un tel... »)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

L'application PostSql a été installée sur la machine afin de disposer d'un serveur de base de données pour l'ensemble des applications nécessitant un tel tiers. La machine n'étant pas directement exposée sur internet, la connexion aux bases de données ne devrait pas être disponible à des personnes malveillantes. De plus, il est possible de restreintre l'adresse IP de connexion depuis le fichier de configuration pg_hba.conf.

Cependant, la sécurité va être augmentée en ajoutant des règles dans Iptables afin de restreinte l'accès à ce service.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


link Analyse

Il faut dans un premier temps identifié le port utilisé par PostgreSql. Dans le cadre d'une installation standard, le port est 5432. Mais si tel n'a pas été le cas, la commande netstat permet de retrouver le port, en filtrant avec la commande Grep.

#sudo netstat -tulpn | grep postgres
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      11993/postgres
tcp6       0      0 ::1:5432                :::*                    LISTEN      11993/postgres

Dans le cas présent, cela confirme l'utilisation du port 5432 et que le serveur est configuré pour écouter sur toutes les infterfaces réseaux de la machine, dont la mise en place est explicité ici.


Icon-Configuration-Settings.png Paramétrages

Après avoir identifié le port utilisé, les règles dans Iptables vont être mis en place en s'inspirant de l'organisation faite par Fail2ban.

La configuration Iptables initiale étant la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Multiples-icon.png Création "Chain"

Dans un premier temps, une "chain" est créée pour structurer la table.

#sudo iptables -N iptables-postgres
Paramètre Utilisation
-N Mode création.
iptables-postgres Nom de la nouvelle "Chain".

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (0 references)
target     prot opt source               destination

Forbidden-icon.png Restriction générale

Par défaut, toutes les connexions vont être refusées.

#sudo iptables -A iptables-postgres -j REJECT
Paramètre Utilisation
-A Mode ajout.
iptables-postgres Cible dans la table où est ajoutée la règle.
-j REJECT Les connexions seront refusées

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (0 references)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Hardware-icon.png Autorisation locale

Le serveur étant essentiellement utilisé localement, il faut autoriser la connexion localement.

#sudo iptables -I iptables-postgres 1 -s 127.0.0.1 -j ACCEPT
Paramètre Utilisation
-I Mode insertion.
iptables-postgres Cible dans la table où est ajoutée la règle.
1 Position de l'insertion.
-s 127.0.0.1 Autorisation pour la machine locale.
-j ACCEPT Les connexions seront autorisées.

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (0 references)
target     prot opt source               destination
ACCEPT     all  --  127.0.0.1            0.0.0.0/0
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Home icon.png Autorisation adresse IP

L'administration des bases de données peut s'effectuer à partir d'un ordinateur "externe", évitant ainsi d'avoir accès directement à la machine. Pour autoriser la connexion depuis une adresse IP spécifique.

#sudo iptables -I iptables-postgres 2 -s 192.168.1.3 -j ACCEPT
Paramètre Utilisation
-I Mode insertion.
iptables-postgres Cible dans la table où est ajoutée la règle.
2 Position de l'insertion. Celle-ci est ajoutée après localhost.

En effet, les connexions seront principalement depuis la machine, donc il est "préférable" que les autorisations arrivent le plus rapidement possible.

-s 192.168.1.3 Autorisation pour une IP particulière.
-j ACCEPT Les connexions seront autorisées.

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (0 references)
target     prot opt source               destination
ACCEPT     all  --  127.0.0.1            0.0.0.0/0
ACCEPT     all  --  192.168.1.3          0.0.0.0/0
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Vues-icon.png Autorisation ensemble adresses IP

Dans le précédent paragraphe, une seule adresse IP a été autorisée. Il peut être utile d'autoriser un ensemble d'adresse dans le cas où l'accès doit être réalisé depuis plusieurs ordinateurs.

#sudo iptables -I iptables-postgres 2 -m iprange --src-range 192.168.1.1-192.168.1.32 -j ACCEPT
Paramètre Utilisation
-I Mode insertion.
iptables-postgres Cible dans la table où est ajoutée la règle.
2 Position de l'insertion. Celle-ci est ajoutée après localhost.

En effet, les connexions seront principalement depuis la machine, donc il est "préférable" que les autorisations arrivent le plus rapidement possible.

-m iprange Utilisation du module pour déclarer un ensemble d'adresse IP.
--src-range 192.168.1.1-192.168.1.32 Toutes les IPs entre 192.168.1.1 et 192.168.1.32 sont concernées.
-j ACCEPT Les connexions seront autorisées.

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (0 references)
target     prot opt source               destination
ACCEPT     all  --  127.0.0.1            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            source IP range 192.168.1.1-192.168.1.32
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Process-Icon.png Activation "Chain"

Enfin, il faut ajouter la nouvelle "Chain" comme règle du trafic.

#sudo iptables -I INPUT -p tcp --dport 5432 -j iptables-postgres
Paramètre Utilisation
-I Mode insertion.
INPUT Cible dans la table où est ajoutée la règle.
-p tcp S'applique au connexion tcp.
--dport 5432 Spécifie les ports auquel s'applique la règle, ici ce sera tcp.
-j iptables-postgres La règle est redirigée vers la "Chain" iptables-postgres créée.

La définition de Iptables devient la suivante.

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
iptables-postgres  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5432

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain iptables-postgres (1 references)
target     prot opt source               destination
ACCEPT     all  --  127.0.0.1            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            source IP range 192.168.1.1-192.168.1.32
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable