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 :
- Ajouter un nouveau groupe système, par ex.
snitch
sudo addgroup --system snitch
- 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
- 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
- Ouvrez une surveillance de queue sur les messages du noyau :
dmesg -w
- 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