GNU/Linux >> Znalost Linux >  >> Linux

vytvořit pravidlo iptables pro proces/službu

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:

  1. Přidejte novou skupinu systémů, např. snitch
sudo addgroup --system snitch
  1. 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
  1. 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
  1. Otevřete sledování zpráv jádra:
dmesg -w
  1. 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


Linux
  1. Maximální počet vláken na proces v Linuxu?

  2. Počítání otevřených souborů na proces

  3. Nelze spustit službu postgresql na CentOS 7

  1. za proces soukromé přípojné body souborového systému

  2. Jak mohu zaznamenat využití procesoru na proces?

  3. Jak zkontrolovat využití I/O disku na proces?

  1. Ujistěte se, že proces vždy běží?

  2. Jak na to:Linux General – IPTtables obecně

  3. Upstart:spuštění služby po procesu, který není spuštěn