GNU/Linux >> Tutoriels Linux >  >> Linux

créer une règle iptables par processus/service

S'il existe un moyen d'obtenir le pid d'un processus avant qu'il ne démarre, je n'en ai jamais entendu parler.

Vous pouvez écrire un wrapper qui fork d'abord, puis ajoute la règle et exécute le processus (en supposant que le programme que vous exécutez ne fork pas à nouveau), puisque le PID n'est pas modifié par l'appel exec(3).

/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
    /* Eat argv[0] the name of the wrapper script */
    argv++;
    argc--;

    pid_t my_pid = getpid();

    char *iptables_cmd = NULL;
    asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);

    system(iptables_cmd);

    execv(argv[0], argv);
}

En m'appuyant sur la réponse de @Bgs, je le ferais comme ceci :

  1. Ajouter un nouveau groupe système, par ex. snitch
sudo addgroup --system snitch
  1. Ajoutez-vous à ce groupe, afin qu'aucun mot de passe ne vous soit demandé pour exécuter des processus avec le groupe principal défini sur celui-ci :
sudo adduser $USER snitch
  1. Ajouter IPv4 et IPv6 règles pour consigner et rejeter tous les paquets générés par les processus appartenant à ce groupe :
sudo iptables  -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo iptables  -A OUTPUT -m owner --gid-owner snitch -j REJECT
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j REJECT
  1. Ouvrez une surveillance de queue sur les messages du noyau :
dmesg -w
  1. Lancez votre processus cible en utilisant sg ou tout autre moyen similaire :
sg snitch 'your target program'

-m owner --pid-owner PID

Voir http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html et http://linux.die.net/man/8/iptables

Notez que vous avez besoin du module ipt_owner, car --pid-owner n'est pas pris en charge par xt_owner.

Par exemple (ce n'est qu'une approximation)

#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT

En réalité, cependant, il vaut mieux utiliser --uid-owner et --gid-owner. Premièrement, le critère --pid-owner ne correspond qu'au pid exact, ce qui signifie que votre programme pourrait facilement générer un processus enfant qui ne serait pas bloqué par cette règle. (Du moins, je n'ai pas lu le contraire.) Deuxièmement, iptables(8) avertit que --pid-owner est cassé sur les systèmes SMP (ce qui peut ou non s'appliquer à vous, mais dans les deux cas limite la portabilité). Troisièmement, il existe une condition de concurrence dans le script ci-dessus, car le processus est lancé avant d'être bloqué. (S'il existe un moyen d'obtenir le pid d'un processus avant qu'il ne démarre, alors je n'en ai jamais entendu parler.)


Il ressemble au propriétaire module iptables est ce que vous voulez. Tout d'abord, vérifiez s'il est disponible dans votre système :

iptables -m owner --help

Vous pouvez en savoir plus ici :http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH


Linux
  1. Service d'exploitation Linux "iptables"

  2. Exécuter le script php en tant que processus démon

  3. répertoire de vidage de mémoire configurable par processus

  4. Comptage des fichiers ouverts par processus

  5. Impossible de démarrer le service postgresql sur CentOS 7

Activer ou créer un service dans Ubuntu 20.04 LTS

Assurez-vous qu'un processus est toujours en cours d'exécution ?

Procédure :Dépannage de base d'IPTables

Nombre maximum de threads par processus sous Linux ?

Linux :transformer en service

Créer un processus zombie