it-swarm.com.de

Netzwerkzugriff eines Prozesses blockieren?

Ist es möglich, den (ausgehenden) Netzwerkzugriff eines einzelnen Prozesses zu blockieren?

77
larkee

Unter Linux 2.6.24+ (bis 2.6.29 als experimentell angesehen) können Sie dafür Netzwerk-Namespaces verwenden. Sie müssen die 'Netzwerk-Namespaces' in Ihrem Kernel (CONFIG_NET_NS=y) Und Util-Linux mit dem Tool unshare aktiviert haben.

Das Starten eines Prozesses ohne Netzwerkzugriff ist dann so einfach wie:

unshare -n program ...

Dadurch wird ein leerer Netzwerk-Namespace für den Prozess erstellt. Das heißt, es wird ohne Netzwerkschnittstellen ausgeführt, einschließlich ohne Loopback . Im folgenden Beispiel fügen wir -r hinzu, um das Programm erst auszuführen, nachdem die aktuellen effektiven Benutzer- und Gruppen-IDs den Superuser-IDs zugeordnet wurden (vermeiden Sie Sudo):

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

Wenn Ihre App eine Netzwerkschnittstelle benötigt, können Sie eine neue einrichten:

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

Beachten Sie, dass dadurch ein neuer lokaler Loopback erstellt wird. Das heißt, der erzeugte Prozess kann nicht auf offene Ports des Hosts 127.0.0.1 Zugreifen.


Wenn Sie Zugriff auf das ursprüngliche Netzwerk im Namespace benötigen, können Sie mit nsenter den anderen Namespace eingeben.

Im folgenden Beispiel wird ping mit dem von PID 1 verwendeten Netzwerk-Namespace ausgeführt (angegeben durch -t 1):

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms
83
Michał Górny

Linux verfügt über eine Funktion namens Netzwerk-Namespaces , mit der Sie im Wesentlichen mehrere Netzwerkstapel auf demselben Computer haben und einem Programm beim Ausführen einen zuweisen können. Dies ist eine Funktion, die normalerweise für Container verwendet wird. Sie können sie jedoch auch verwenden, um das zu erreichen, was Sie möchten.

Das ip netns Unterbefehle verwalten es. Das Erstellen eines neuen Netzwerk-Namespace ohne Zugriff auf irgendetwas ist einfach. Dies ist der Standardstatus eines neuen Namespace:

[email protected]:~# ip netns add jail

Wenn Sie jetzt in diesen Namespace wechseln, können Sie ihn ziemlich einfach konfigurieren. Sie werden wahrscheinlich lo darin erwähnen wollen, und das war's:

[email protected]:~# ip netns exec jail /bin/bash
[email protected]:~# ip addr add 127.0.0.1/8 dev lo
[email protected]:~# ip link set dev lo up
[email protected]:~# exit

Wenn Sie Ihren Befehl jetzt ohne Netzwerk ausführen möchten, führen Sie ihn einfach in diesem Gefängnis aus:

[email protected]:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

Das Netzwerk ist wie gewünscht nicht erreichbar. (Sie können alle möglichen interessanten Dinge tun, da ein separater Netzwerkstapel iptables Regeln usw. enthält.)

24
derobert

Sie können iptables verwenden und diesen Prozess in eine cgroup verschieben:

mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid

iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP

echo [pid] > /sys/fs/cgroup/net_cls/block/tasks
15
Jan Mueller

Ja, mit angepasstem Apparmor-Profil, d.h.

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

Auf diese Weise müssen Sie jedoch auch eine Liste der zulässigen Dateien erstellen, auf die zugegriffen werden kann. Der gesamte Vorgang kann etwas kompliziert sein. Und siehe das Hilfedokument hier

10
daisy

Sie können firejail sandbox verwenden (sollte auf Kerneln mit seccomp-Funktion funktionieren).

Um es zu benutzen, tun Sie es einfach

firejail --noprofile --net=none <path to executable>

--noprofile Deaktiviert die Standard-Sandbox. --net=none Deaktiviert das Netzwerk

Ich glaube, dass die meisten Distributionen bereits Pakete bereitstellen, aber selbst wenn sie kein Firejail haben, gibt es praktisch keine anderen Abhängigkeiten als die Build-Toolchain und den Namespace/Seccomp-fähigen Kernel.

Es gibt einige andere nette Funktionen von Firejail, die mit firejail --help In Bezug auf das Netzwerk angezeigt werden können (z. B. nur die Bereitstellung einer Loopback-Schnittstelle oder das Blockieren von IP/DNS usw.), aber dies sollte den Job erledigen. Auch es doesn't require root.

7
pruzinat

Sie können dies nicht allein mit iptables tun. Diese Funktion kurz vorhanden , konnte jedoch nicht zuverlässig funktionieren und wurde aufgegeben.

Wenn Sie den Prozess als dedizierte Benutzer-ID ausführen können, kann iptables dies mit dem Modul owner tun:

iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP

Siehe Beispiele in Iptables: Abgleichen des ausgehenden Datenverkehrs mit Conntrack und Eigentümer. Funktioniert mit seltsamen Abbrüchen , iptables/pf-Regel, um nur XY-Anwendung/Benutzer zuzulassen?

Wenn Sie den Prozess in einem eigenen Container ausführen können, können Sie diesen Container unabhängig Firewall (sogar vollständig vom Netzwerk getrennt).

Ein Sicherheitsmodul kann den Zugriff eines Prozesses auf Netzwerkfunktionen filtern. warl0cks Antwort gibt ein Beispiel mit AppArmor.

Lösung 1: Firewall:

Wir könnten Firewalls wie Douane oder Opensnitch verwenden, ABER diese Anwendungen sind nicht 100% effizient oder befinden sich in einem frühen Entwicklungsstadium (haben viele Fehler usw. ab 2019).

Lösung 2: Kernel MAC:

Kernel-MACs können als bekannteste Firewall verwendet werden: Tomoyo , Selinux und Apparmor Diese Lösung ist die beste, wenn es um Stabilität und Effizienz geht (Firewall-Lösung), aber die meiste Zeit ist das Einstellen irgendwie kompliziert.

Lösung 3: Feuergefängnis:

Firejail kann verwendet werden, um den Netzwerkzugriff für eine Anwendung zu blockieren, für die kein Root erforderlich ist. Jeder Benutzer kann davon profitieren

firejail --noprofile --net=none command-application

Lösung 4: Unshare

Unshare kann eine Anwendung auf einem anderen Namesapece ohne Netzwerk starten, dies erfordert jedoch, dass die Lösung von root firejail fast genau dasselbe tut, jedoch kein root erfordert

unshare -r -n application-comand

Lösung 5: Proxifizieren:

Eine Lösung besteht darin, die Anwendung auf einen null/fake Proxy zu proximalisieren. Wir können tsocks oder proxybound verwenden. Hier sind einige Details zum Setup

Lösung 6: Iptables:

Eine andere einfache Lösung ist iptables. Sie kann so eingerichtet werden, dass eine Anwendung blockiert wird

  1. Erstellen, validieren neue Gruppe; Fügen Sie dieser Gruppe die erforderlichen Benutzer hinzu:
    • Erstellen: groupadd no-internet
    • Validieren: grep no-internet /etc/group
    • Nutzer hinzufügen: useradd -g no-internet username

      Hinweis: Wenn Sie bereits vorhandene Benutzer ändern, sollten Sie Folgendes ausführen: usermod -a -G no-internet userName überprüfen mit: Sudo groups userName

  2. Erstellen Sie ein Skript in Ihrem Pfad und machen Sie es ausführbar:
    • Erstellen: nano /home/username/.local/bin/no-internet
    • Ausführbar: chmod 755 /home/username/.local/bin/no-internet
    • Inhalt: #!/bin/bash
      sg no-internet "[email protected]"

  3. Add iptables rule zum Löschen der Netzwerkaktivität für group no-internet:
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      Hinweis: Vergessen Sie nicht, die Änderungen dauerhaft zu machen, daher wäre es wird nach dem Neustart automatisch angewendet . Dies hängt von Ihrer Linux-Distribution ab.


4. Überprüfen Sie dies beispielsweise in Firefox, indem Sie Folgendes ausführen:

  • no-internet "firefox"

5. Falls Sie eine Ausnahme machen und einem Programm den Zugriff auf lokales Netzwerk erlauben möchten:

  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

6. Machen Sie es dauerhaft

Eine Möglichkeit, die iptables-Regel beim Booten anzuwenden, besteht darin, die Regel als Dienst mit systemd hinzuzufügen

cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh
4
intika

Es hängt davon ab, welche Distribution Sie verwenden, aber das ist eine Funktion, die normalerweise im MAC-System des Betriebssystems enthalten ist. Wie bereits erwähnt, können Ubuntu oder SuSEs AppArmor dies tun. Wenn Sie RHEL verwenden, können Sie SELinux so konfigurieren, dass der Zugriff auf eine bestimmte Portnummer basierend auf der Bezeichnung des ausführenden Prozesses entweder zugelassen oder verweigert wird. Dies ist alles, was ich nach einigem schnellen Googeln finden konnte, aber es sind wahrscheinlich ausführlichere Ressourcen online, wenn Sie genauer hinschauen und es Ihnen die allgemeine Idee gibt.

2
Bratchley

Sie können seccomp-bpf verwenden, um einige Systemaufrufe zu blockieren. Zum Beispiel möchten Sie vielleicht blockieren Sie den Systemaufruf socket , um zu verhindern, dass der Prozess Sockets FD erstellt.

Ich habe ein Beispiel dieser Approxah geschrieben, das den Systemaufruf socket für die Arbeit mit libseccomp verhindert. Die Zusammenfassung lautet (ohne Fehlerprüfung):

scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
seccomp_Arch_add(ctx, SCMP_Arch_NATIVE);
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(socket), 1, SCMP_CMP(0, SCMP_CMP_EQ, pf));
seccomp_load(ctx);
execvp(argv[1], argv+1);

Dies erfordert keine Root-Berechtigung.

Eine vollständige Sandbox ist jedoch viel komplexer, daher sollten Sie diese Reihenfolge nicht verwenden, um nicht kooperative/bösartige Programme zu blockieren.

2
ysdx

Seit Systemd v235 gibt es noch eine weitere sehr einfache Option:

IP-Accounting und Zugriffslisten mit systemd

TL; DR: systemd kann jetzt die IP-Verkehrsabrechnung pro Dienst sowie die Zugriffskontrolle für IP-Adressbereiche durchführen.

0
Marco Gamberoni