Ist es möglich, den (ausgehenden) Netzwerkzugriff eines einzelnen Prozesses zu blockieren?
linux
networking
process
iptables
Larkee
quelle
quelle
localhost
(auf demselben Computer), um ihre Aufgaben zu erledigen.Antworten:
Ab Linux 2.6.24 (gilt als experimentell bis 2.6.29) 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 demunshare
Tool aktiviert haben .Das Starten eines Prozesses ohne Netzwerkzugriff ist dann so einfach wie:
Dadurch wird ein leerer Netzwerknamespace für den Prozess erstellt. Das heißt, es wird ohne Netzwerkschnittstellen und ohne Loopback ausgeführt . 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):
Wenn Ihre App eine Netzwerkschnittstelle benötigt, können Sie eine neue einrichten:
Beachten Sie, dass dadurch ein neuer lokaler Loopback erstellt wird. Das heißt, der erzeugte Prozess kann nicht auf offene Ports des Hosts zugreifen
127.0.0.1
.Wenn Sie Zugriff auf das ursprüngliche Netzwerk im Namespace benötigen, können Sie
nsenter
den anderen Namespace eingeben.Das folgende Beispiel wird
ping
mit dem von PID 1 verwendeten Netzwerknamespace ausgeführt (angegeben durch-t 1
):quelle
unshare -n
scheint zu werfen "Operation nicht erlaubt" ohneroot
Privilegien, etwas, was ich darüber vermisse?sudo unshare -n
erbt das Root-Recht. Da ich brauche, dass das sudo unshare aufruft, frage ich mich, wie ich sicherstellen kann, dass das aufgerufene Programm nicht über die Root-Rechte verfügt.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240Linux verfügt über eine Funktion namens Netzwerk-Namespaces, mit der Sie im Wesentlichen mehrere Netzwerkstapel auf demselben Computer haben und einem Programm bei dessen Ausführung einen zuweisen können. Dies ist eine Funktion, die normalerweise für Container verwendet wird. Sie können sie jedoch auch verwenden, um die gewünschten Ergebnisse zu erzielen.
Die
ip netns
Unterbefehle verwalten es. Das Erstellen eines neuen Netzwerknamespaces ohne Zugriff auf irgendetwas ist einfach. Es ist der Standardstatus eines neuen Namespaces:Wenn Sie jetzt in diesen Namespace wechseln, können Sie ihn ziemlich einfach konfigurieren. Sie werden wahrscheinlich wollen, um lo in es zu bringen, und das ist es:
Wenn Sie Ihren Befehl jetzt ohne Netzwerk ausführen möchten, führen Sie ihn einfach in diesem Gefängnis aus:
Das Netzwerk ist wie gewünscht nicht erreichbar. (Sie können alle Arten von interessanten Dingen ausführen, da ein separater Netzwerkstapel
iptables
Regeln usw. enthält.)quelle
sudo ip
die IP-Befehle ausführen musste, habe ich, als ich mich in der Bash befand, nur ausgeführtsu someuser
, um eine nicht privilegierte Shell für den Benutzer 'someuser' zu erhalten.Sie können iptables verwenden und diesen Prozess in eine cgroup verschieben:
quelle
/sys/fs/cgroup/net_cls/tasks
(kein "Blockieren" im Pfad)Ja, mit benutzerdefiniertem Apparmor-Profil
Auf diese Weise müssen Sie jedoch eine Liste der zulässigen Dateien erstellen, auf die auch zugegriffen werden kann. Der gesamte Vorgang kann etwas kompliziert sein. Das Hilfedokument finden Sie hier
quelle
Sie können die FireJail-Sandbox verwenden (sollte auf Kernels mit Seccomp-Funktion funktionieren).
Um es zu benutzen, machen Sie es einfach
--noprofile
Deaktiviert die Standard-Sandbox.--net=none
Deaktiviert das NetzwerkIch glaube, dass die meisten Distributionen bereits Pakete bereitstellen, aber selbst wenn sie kein FireJail sind, gibt es praktisch keine anderen Abhängigkeiten als Build-Toolchain und Namespace / Seccomp-fähigen Kernel.
Es gibt einige andere nette Features von FireJail, die in
firejail --help
Bezug auf das Netzwerk gezeigt werden können (wie zum Beispiel nur das Bereitstellen einer Loopback-Schnittstelle oder das Blockieren von IP / DNS usw.), aber dies sollte den Job erledigen. Auch dasdoesn't require root
.quelle
Sie können es nicht alleine mit iptables machen. Diese Funktion existierte nur für kurze Zeit , konnte jedoch nicht zuverlässig zum Funktionieren gebracht werden und wurde aufgegeben.
Wenn Sie den Prozess als dedizierte Benutzer-ID ausführen können, kann iptables dies mit dem
owner
Modul tun :Siehe Beispiele in Iptables: Abgehenden Verkehr mit conntrack und Eigentümer abgleichen. Arbeitet mit seltsamen Tropfen , 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 von der Firewall konfigurieren (sogar die vollständige Trennung vom Netzwerk).
Ein Sicherheitsmodul kann den Zugriff eines Prozesses auf Netzwerkfunktionen filtern. Die Antwort von warl0ck gibt ein Beispiel mit AppArmor.
quelle
Lösung 1: Firewall:
Wir könnten Firewalls wie Douane oder Opensnitch verwenden, aber diese Anwendungen sind nicht zu 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 Firewall verwendet werden. Die bekanntesten sind 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 etwas 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
Lösung 4: Freigabe aufheben
Unshare kann eine Anwendung auf einem anderen Namesapece ohne Netzwerk starten, aber dafür muss die Lösung von root firejail fast genau dasselbe tun, erfordert jedoch kein root
Lösung 5: Proxify:
Eine Lösung besteht darin, die Anwendung einem NULL / Fake- Proxy zuzuweisen . Wir können tsocks oder proxybound verwenden . Hier 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
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Hinweis: Wenn Sie bereits vorhandene Benutzer ändern, sollten Sie Folgendes ausführen
usermod -a -G no-internet userName
:sudo groups userName
nano /home/username/.local/bin/no-internet
chmod 755 /home/username/.local/bin/no-internet
#!/bin/bash
sg no-internet "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Hinweis: Vergessen Sie nicht, die Änderungen dauerhaft zu speichern, damit sie nach dem Neustart automatisch angewendet werden . Dies hängt von Ihrer Linux-Distribution ab.
4. Überprüfen Sie es, zum Beispiel in Firefox, indem Sie Folgendes ausführen:
no-internet "firefox"
5. Falls Sie eine Ausnahme machen und einem Programm den Zugriff auf das lokale 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
quelle
sg no-internet
für den Moment.Es hängt davon ab, welche Distribution Sie verwenden, aber diese Funktion ist normalerweise im MAC-System des Betriebssystems enthalten. Wie bereits erwähnt, können dies Ubuntu oder SuSEs AppArmor. 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. Das ist alles, was ich nach einigem schnellen Googeln finden konnte, aber es gibt wahrscheinlich mehr detaillierte Online-Ressourcen, wenn Sie genauer hinsehen und Ihnen die allgemeine Idee geben.
quelle
Mit seccomp-bpf können Sie einige Systemaufrufe blockieren. Möglicherweise möchten Sie beispielsweise den
socket
Systemaufruf blockieren , um zu verhindern, dass der Prozess Sockets FD erstellt.Ich habe ein Beispiel für diese Approcah geschrieben, das den
socket
Systemaufruf für die Arbeit mit libseccomp verhindert. Die Zusammenfassung lautet (ohne Fehlerprüfung):Hierfür sind keine Root-Rechte erforderlich.
Eine vollständige Sandbox ist jedoch viel komplexer. Verwenden Sie diese Option nicht, um nicht kooperative / bösartige Programme zu blockieren.
quelle
Sie können ein Befehlszeilenprogramm namens "proxychains" verwenden und eine der folgenden Möglichkeiten ausprobieren:
Richten Sie es so ein, dass es verwendet ...
Ich habe es nicht selbst getestet, daher weiß ich nicht, ob es funktioniert ...
quelle