GNU/Linux >> Linux Esercitazione >  >> Linux

creare una regola iptables per processo/servizio

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:

  1. Aggiungi un nuovo gruppo di sistema, ad es. snitch
sudo addgroup --system snitch
  1. 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
  1. 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
  1. Apri un tail watch sui messaggi del kernel:
dmesg -w
  1. 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


Linux
  1. Linux – Routing tramite Iptables?

  2. Servizio del sistema operativo Linux "iptables"

  3. Esegui lo script php come processo daemon

  4. directory core dump configurabile per processo

  5. Linux:processo in un servizio

Come creare un servizio Systemd in Linux

Abilita o crea un servizio in Ubuntu 20.04 LTS

Garantire che un processo sia sempre in esecuzione?

Procedura:Linux generale – IPtables in generale

Procedura:Risoluzione dei problemi di base di IPtables

Upstart :avvia il servizio dopo il processo non upstart