Configuration Iptables - OpenLDAP

De EjnTricks

L'application OpenLDAP a été installée sur la machine afin de mettre en place un annuaire et de gérer les droits d'accès aux applications, qui permettent ce type de configuration. La machine n'étant pas directement exposée sur internet, l'accès à l'annuaire ne devrait pas être disponible à des personnes malveillantes. 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 OpenLDAP. Dans le cadre d'une installation standard, le port est 389. Mais si tel n'a pas été le cas, la commande netstat permet de retrouver le port:

#sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      1241/slapd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1062/mysqld
tcp        0      0 192.168.1.32:53         0.0.0.0:*               LISTEN      1045/named
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      1113/dnsmasq
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1045/named
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      987/sshd
tcp        0      0 0.0.0.0:631             0.0.0.0:*               LISTEN      23787/cupsd
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      1045/named
tcp6       0      0 :::35391                :::*                    LISTEN      1514/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1514/java
tcp6       0      0 :::389                  :::*                    LISTEN      1241/slapd
tcp6       0      0 :::54568                :::*                    LISTEN      1514/java
tcp6       0      0 :::43114                :::*                    LISTEN      1514/java
tcp6       0      0 :::8080                 :::*                    LISTEN      1514/java
tcp6       0      0 :::54288                :::*                    LISTEN      1514/java
tcp6       0      0 :::80                   :::*                    LISTEN      1467/apache2
tcp6       0      0 :::7091                 :::*                    LISTEN      1514/java
tcp6       0      0 :::53                   :::*                    LISTEN      1045/named
tcp6       0      0 :::22                   :::*                    LISTEN      987/sshd
tcp6       0      0 :::631                  :::*                    LISTEN      23787/cupsd
tcp6       0      0 ::1:953                 :::*                    LISTEN      1045/named
tcp6       0      0 :::443                  :::*                    LISTEN      1467/apache2
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           868/avahi-daemon: r
udp        0      0 0.0.0.0:58603           0.0.0.0:*                           868/avahi-daemon: r
udp        0      0 192.168.1.32:53         0.0.0.0:*                           1045/named
udp        0      0 127.0.1.1:53            0.0.0.0:*                           1113/dnsmasq
udp        0      0 127.0.0.1:53            0.0.0.0:*                           1045/named
udp6       0      0 :::33848                :::*                                1514/java
udp6       0      0 :::5353                 :::*                                1514/java
udp6       0      0 :::5353                 :::*                                868/avahi-daemon: r
udp6       0      0 :::53                   :::*                                1045/named
udp6       0      0 :::47411                :::*                                868/avahi-daemon: r

Il est possible de filtrer sur le programme avec la commande Grep:

#sudo netstat -tulpn | grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      1241/slapd
tcp6       0      0 :::389                  :::*                    LISTEN      1241/slapd

Dans le cas présent, cela confirme l'utilisation du port 389.


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
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Création "Chain"

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

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

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

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

Restriction générale

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

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

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

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

Autorisation locale

L'annuaire étant essentiellement utilisé localement, il faut autoriser la connexion localement:

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

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain iptables-slapd (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

Autorisation adresse IP

L'administration de l'annuaire peut s'effectuer avec des outils déployés sur la machine, comme phpLDAPAdmin. Cependant, cela peut être utile de gérer l'annuaire à 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-slapd 2 -s 192.168.1.3 -j ACCEPT
Paramètre Utilisation
-I Mode insertion.
iptables-slapd Cible dans la table où est ajoutée la règle.
2 Position de l'insertion. Celle-ci est ajoutée après locahost.

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 Authorisation pour une IP particulière.
-j ACCEPT Les connexions seront autorisées.

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain iptables-slapd (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

Autorisation ensemble adresses IP

Dans le précédent paragraphe, une seule addresse IP a été authorisé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-slapd 2 -m iprange --src-range 192.168.1.1-192.168.1.10 -j ACCEPT
Paramètre Utilisation
-I Mode insertion.
iptables-slapd Cible dans la table où est ajoutée la règle.
2 Position de l'insertion. Celle-ci est ajoutée après locahost.

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.10 Toutes les IPs entre 192.168.1.1 et 192.168.1.10 sont concernées.
-j ACCEPT Les connexions seront autorisées.

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain iptables-slapd (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.10
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Activation "Chain"

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

#sudo iptables -I INPUT -p tcp --dport 389 -j iptables-slapd
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 389 Spécifie les ports auquel s'applique la règle, ici ce sera tcp.
-j iptables-slapd La règle est redirigée vers la "Chain" iptables-slapd créée.

La définition de Iptables devient:

#sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
iptables-slapd  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:389
fail2ban-apache-scan  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-apache-scan (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain iptables-slapd (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.10
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Warning-icon.png Application J2EE

Attention aux application J2EE, comme Jenkins, Nexus ou Subsonic, il faut authoriser l'ip du serveur même si celui-ci est en local. Sinon, les tentative de connexion à l'annuaire, s'effectuant via des framework Java, n'aboutissent pas. Par contre, l'application Sonar n'est pas imactée par une telle mise en place.

Dans le cas où l'IP du serveur est 192.168.1.25, donc pas dans l'ensemble spécifié dans l'article, il faut lancer la commande suivante:

#sudo iptables -I iptables-slapd 2 -s 192.168.1.32 -j ACCEPT

L'IP sera alors authorisé, et la règle placée juste avant l'ensemble dans la "chain" iptables-slapd.