Ist es möglich, den (ausgehenden) Netzwerkzugriff eines einzelnen Prozesses zu blockieren?
localhost
(auf demselben Computer), um ihre Aufgaben zu erledigen.
Ist es möglich, den (ausgehenden) Netzwerkzugriff eines einzelnen Prozesses zu blockieren?
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 dem unshare
Tool aktiviert haben .
Das Starten eines Prozesses ohne Netzwerkzugriff ist dann so einfach wie:
unshare -n program ...
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):
$ 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 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
):
$ 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
unshare -n
scheint zu werfen "Operation nicht erlaubt" ohne root
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=205240
Linux 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:
root@host:~# ip netns add jail
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:
root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit
Wenn Sie Ihren Befehl jetzt ohne Netzwerk ausführen möchten, führen Sie ihn einfach in diesem Gefängnis aus:
root@host:~# 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 Arten von interessanten Dingen ausführen, da ein separater Netzwerkstapel iptables
Regeln usw. enthält.)
sudo ip
die IP-Befehle ausführen musste, habe ich, als ich mich in der Bash befand, nur ausgeführt su 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:
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
/sys/fs/cgroup/net_cls/tasks
(kein "Blockieren" im Pfad)
Ja, mit benutzerdefiniertem Apparmor-Profil
/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 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
Sie können die FireJail-Sandbox verwenden (sollte auf Kernels mit Seccomp-Funktion funktionieren).
Um es zu benutzen, machen 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 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 das doesn't require root
.
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 :
iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP
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.
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
firejail --noprofile --net=none command-application
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
unshare -r -n application-comand
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
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
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
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
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.
Mit seccomp-bpf können Sie einige Systemaufrufe blockieren. Möglicherweise möchten Sie beispielsweise densocket
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):
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);
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.
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 ...