Wenn es eine Möglichkeit gibt, die PID eines Prozesses zu bekommen, bevor er startet, dann habe ich noch nie davon gehört.
Sie könnten einen Wrapper schreiben, der sich zuerst verzweigt, dann die Regel hinzufügt und den Prozess ausführt (vorausgesetzt, das Programm, das Sie ausführen, verzweigt sich nicht erneut), da die PID durch den exec(3)-Aufruf nicht geändert wird.
/* 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);
}
Aufbauend auf der Antwort von @Bgs würde ich es so machen:
- Fügen Sie eine neue Systemgruppe hinzu, z.
snitch
sudo addgroup --system snitch
- Fügen Sie sich dieser Gruppe hinzu, damit Sie nicht nach einem Passwort gefragt werden, um Prozesse mit der darauf eingestellten primären Gruppe auszuführen:
sudo adduser $USER snitch
- IPv4 und IPv6 hinzufügen Regeln, um Pakete zu protokollieren und abzulehnen, die von Prozessen generiert werden, die zu dieser Gruppe gehören:
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
- Öffnen Sie eine Tail-Watch für Kernel-Nachrichten:
dmesg -w
- Starten Sie Ihren Zielprozess mit
sg
oder andere ähnliche Mittel:
sg snitch 'your target program'
-m owner --pid-owner PID
Siehe http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html und http://linux.die.net/man/8/iptables
Beachten Sie, dass Sie das Modul ipt_owner benötigen, da --pid-owner von xt_owner nicht unterstützt wird.
Zum Beispiel (dies ist nur eine Annäherung)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
In Wirklichkeit sind Sie jedoch besser dran, wenn Sie --uid-owner und --gid-owner verwenden. Erstens stimmt das Kriterium --pid-owner nur mit der genauen PID überein, was bedeutet, dass Ihr Programm leicht einen untergeordneten Prozess erzeugen könnte, der durch diese Regel nicht blockiert würde. (Zumindest habe ich nichts anderes gelesen.) Zweitens warnt iptables(8), dass --pid-owner auf SMP-Systemen defekt ist (was auf Sie zutreffen kann oder nicht, aber in jedem Fall die Portabilität einschränkt). Drittens gibt es im obigen Skript eine Race-Condition, da der Prozess gestartet wird, bevor er blockiert wird. (Wenn es eine Möglichkeit gibt, die PID eines Prozesses zu bekommen, bevor er startet, dann habe ich noch nie davon gehört.)
Es sieht aus wie der Inhaber Das iptables-Modul ist das, was Sie wollen. Überprüfen Sie zuerst, ob es in Ihrem System verfügbar ist:
iptables -m owner --help
Hier können Sie mehr lesen:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH