Pokud existuje způsob, jak získat pid procesu před jeho spuštěním, pak jsem o tom nikdy neslyšel.
Můžete napsat obal, který se nejprve rozvětví, pak přidá pravidlo a spustí proces (za předpokladu, že se spuštěný program znovu nerozvětvuje), protože PID se voláním exec(3) nezmění.
/* 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);
}
Na základě odpovědi @Bgs bych to udělal takto:
- Přidejte novou skupinu systémů, např.
snitch
sudo addgroup --system snitch
- Přidejte se do této skupiny, abyste nebyli vyzváni k zadání hesla pro spouštění procesů s nastavenou primární skupinou:
sudo adduser $USER snitch
- Přidejte IPv4 a IPv6 pravidla pro protokolování a odmítání všech paketů generovaných procesy patřícími do této skupiny:
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
- Otevřete sledování zpráv jádra:
dmesg -w
- Spusťte cílový proces pomocí
sg
nebo jakýkoli jiný podobný prostředek:
sg snitch 'your target program'
-m owner --pid-owner PID
Viz http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html a http://linux.die.net/man/8/iptables
Všimněte si, že potřebujete modul ipt_owner, protože --pid-owner není podporováno xt_owner.
Například (toto je jen přiblížení)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
Ve skutečnosti je však lepší použít --uid-owner a --gid-owner. Za prvé, kritérium --pid-owner odpovídá pouze přesnému pid, což znamená, že váš program by mohl snadno vytvořit podřízený proces, který by tímto pravidlem nebyl blokován. (Aspoň jsem to nečetl jinak.) Za druhé, iptables(8) varuje, že --pid-owner je na SMP systémech nefunkční (což se vás může, ale nemusí týkat, ale v obou případech omezuje přenositelnost). Za třetí, ve výše uvedeném skriptu je spor, protože proces je spuštěn dříve, než je zablokován. (Pokud existuje způsob, jak získat pid procesu před jeho spuštěním, pak jsem o tom nikdy neslyšel.)
Vypadá to na vlastníka Modul iptables je to, co chcete. Nejprve zkontrolujte, zda je k dispozici ve vašem systému:
iptables -m owner --help
Více si můžete přečíst zde:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH