GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erstellen Sie eine iptables-Regel pro Prozess/Dienst

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:

  1. Fügen Sie eine neue Systemgruppe hinzu, z. snitch
sudo addgroup --system snitch
  1. 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
  1. 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
  1. Öffnen Sie eine Tail-Watch für Kernel-Nachrichten:
dmesg -w
  1. 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


Linux
  1. Linux-Betriebssystemdienst „iptables“

  2. Maximale Anzahl von Threads pro Prozess in Linux?

  3. Führen Sie das PHP-Skript als Daemon-Prozess aus

  4. Linux:in einen Dienst verarbeiten

  5. Erstellen Sie einen Zombie-Prozess

Aktivieren oder erstellen Sie einen Dienst in Ubuntu 20.04 LTS

Gewusst wie:Linux Allgemein – IPTables im Allgemeinen

Gewusst wie:Grundlegende IPTables-Fehlerbehebung

pro Prozess konfigurierbares Core-Dump-Verzeichnis

Geöffnete Dateien pro Vorgang zählen

Der postgresql-Dienst kann unter CentOS 7 nicht gestartet werden