tux Quand on a des règles firewall restrictives en sortie (table filter, chaîne OUTPUT), on peut vouloir ouvrir des accès pour un programme particulier. Cela ne peut pas se faire directement avec iptables : impossible de faire une règle basée sur un exécutable ou même un PID. Cela permettrait des contournements dangereux.

Des solutions sont possibles avec différents mécanismes de sécurité (selinux, apparmor, cgroup, network namespace…), mais je trouve beaucoup plus simple d’utiliser un groupe linux, et l’extension owner d’iptables (–gid-owner).

Création du groupe

Par exemple :

groupadd -g 4242 grpappli

Même si en pratique j’édite toujours les fichiers /etc/group et /etc/gshadow directement, il ne faut pas le faire. Mais je ne sais jamais s’il faut utiliser addgroup ou groupadd…

La règle iptables

Voici une règle qui autorise https en IPv4 uniquement pour notre groupe, et ensuite l’accès global https est interdit.

iptables -A OUTPUT -m owner --gid-owner grpappli -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -m owner  -p tcp --dport 443 -j REJECT
ip6tables -A OUTPUT -m owner  -p tcp --dport 443 -j REJECT

Démarrer l’application avec le groupe voulu

Il faut surtout éviter de mettre un utilisateur dans le groupe “grpappli” sinon il pourra profiter de l’accès ouvert pour tous les programme qu’il lance.

Au moins deux solutions facile à mettre en place :

chmod g+s

Le bit setgid est parfait pour cela. On va utiliser un petit lanceur pour ne pas modifier les droits des fichiers fournis avec le distribution. Sinon à chaque mise à jour de la distribution on peut recommencer.

Cependant la solution la plus simple à laquelle on pense tout de suite n’est pas possible : un script shell avec bit setgid. On peut par contre passer par un petit programme en C :

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    printf("real group: %d\n", getgid());
    printf("effective group: %d\n", getegid());
    system ("/usr/bin/machin arguments");
    return 0;
}

On compile, on “chowne” puis “chmode”

gcc /tmp/bidule.c -o /usr/local/bidule
chown root:grpappli /usr/local/bidule
chmod g+s /usr/local/bidule

sudo

Si on apprécie sudo, c’est simple à faire. Et on peut aussi mettre un contrôle sur qui lance le programme :

utilisateur ALL=(:grpappli) NOPASSWD: /usr/bin/machin arguments
linux iptables  
Précédent : | Suivant :