Se c'è un modo per ottenere il pid di un processo prima che inizi, allora non ne ho mai sentito parlare.
Potresti scrivere un wrapper che esegue prima il fork, quindi aggiunge la regola ed esegue il processo (supponendo che il programma che stai eseguendo non effettui nuovamente il fork), poiché il PID non viene modificato dalla chiamata 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);
}
Sulla base della risposta di @Bgs, lo farei in questo modo:
- Aggiungi un nuovo gruppo di sistema, ad es.
snitch
sudo addgroup --system snitch
- Aggiungi te stesso a quel gruppo, in modo che non ti venga chiesta una password per eseguire processi con il gruppo principale impostato su di esso:
sudo adduser $USER snitch
- Aggiungi IPv4 e IPv6 regole per registrare e rifiutare qualsiasi pacchetto generato da processi appartenenti a quel gruppo:
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
- Apri un tail watch sui messaggi del kernel:
dmesg -w
- Avvia il tuo processo di destinazione utilizzando
sg
o qualsiasi altro mezzo simile:
sg snitch 'your target program'
-m owner --pid-owner PID
Vedere http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html e http://linux.die.net/man/8/iptables
Nota che hai bisogno del modulo ipt_owner, poiché --pid-owner non è supportato da xt_owner.
Ad esempio (questa è solo un'approssimazione)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
In realtà, però, è meglio usare --uid-owner e --gid-owner. Innanzitutto, il criterio --pid-owner corrisponde solo al pid esatto, il che significa che il tuo programma potrebbe facilmente generare un processo figlio che non verrebbe bloccato da questa regola. (Almeno non ho letto diversamente.) In secondo luogo, iptables(8) avverte che --pid-owner non funziona sui sistemi SMP (il che potrebbe applicarsi o meno a te, ma in entrambi i casi limita la portabilità). In terzo luogo, c'è una race condition nello script sopra, perché il processo viene avviato prima che venga bloccato. (Se c'è un modo per ottenere il pid di un processo prima che inizi, allora non ne ho mai sentito parlare.)
Sembra il proprietario Il modulo iptables è quello che vuoi. Per prima cosa, controlla se è disponibile nel tuo sistema:
iptables -m owner --help
Puoi leggere di più qui:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH