Czy można zablokować (wychodzący) dostęp do sieci dla jednego procesu?
linux
networking
process
iptables
Larkee
źródło
źródło
localhost
(do tego samego komputera) do wykonywania swoich zadań.Odpowiedzi:
W Linuksie 2.6.24+ (uważanym za eksperymentalny do 2.6.29) możesz do tego używać sieciowych nazw. Musisz mieć włączone sieciowe przestrzenie nazw w jądrze (
CONFIG_NET_NS=y
) i util-linux za pomocą tegounshare
narzędzia.Następnie rozpoczęcie procesu bez dostępu do sieci jest tak proste, jak:
Tworzy to pustą przestrzeń nazw sieci dla procesu. Oznacza to, że jest uruchamiany bez interfejsów sieciowych, w tym bez pętli zwrotnej . W poniższym przykładzie dodajemy -r, aby uruchomić program dopiero po zmapowaniu bieżącego efektywnego ID użytkownika i grupy do identyfikatora administratora (unikaj sudo):
Jeśli Twoja aplikacja wymaga interfejsu sieciowego, możesz skonfigurować nowy:
Pamiętaj, że spowoduje to utworzenie nowej lokalnej pętli zwrotnej. Oznacza to, że odrodzony proces nie będzie mógł uzyskać dostępu do otwartych portów hosta
127.0.0.1
.Jeśli chcesz uzyskać dostęp do oryginalnej sieci w obszarze nazw, możesz użyć,
nsenter
aby wprowadzić inną przestrzeń nazw.Poniższy przykład działa
ping
z przestrzenią nazw sieciowych używaną przez PID 1 (jest określony poprzez-t 1
):źródło
unshare -n
wydaje się rzucać „Operacja niedozwolona” bezroot
uprawnień, coś mi w tym brakuje?sudo unshare -n
dziedziczy prawo root. Ponieważ potrzebuję sudo do wywołania nieudostępnionego, zastanawiam się, jak mogę się upewnić, że wywoływany program nie ma praw root.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240Linux ma funkcję zwaną sieciowymi przestrzeniami nazw, które pozwalają zasadniczo mieć wiele stosów sieciowych na tym samym komputerze i przypisać jeden do programu podczas jego uruchamiania. Jest to funkcja zwykle używana w kontenerach, ale możesz jej również użyć do osiągnięcia tego, co chcesz.
Polecenia
ip netns
zarządzają tym. Tworzenie nowej sieciowej przestrzeni nazw bez dostępu do czegokolwiek jest łatwe, jest to domyślny stan nowej przestrzeni nazw:Teraz, jeśli przełączysz się do tej przestrzeni nazw, możesz ją dość łatwo skonfigurować. Prawdopodobnie będziesz chciał porozmawiać o tym, i to wszystko:
Teraz, gdy chcesz uruchomić polecenie bez sieci, po prostu uruchom je w tym więzieniu:
Sieć jest, zgodnie z życzeniem, nieosiągalna. (Możesz robić różne ciekawe rzeczy, ponieważ osobny stos sieciowy zawiera
iptables
reguły itp.)źródło
sudo ip
wykonać polecenia ip, kiedy byłem w bashu, właśnie wykonałem,su someuser
aby uzyskać nieuprzywilejowaną powłokę dla użytkownika „someuser”.Możesz użyć iptables i przenieść ten proces do grupy cg:
źródło
/sys/fs/cgroup/net_cls/tasks
(brak „bloku” na ścieżce)Tak, z dostosowanym profilem apparmor, tj
Ale w ten sposób musisz wygenerować listę dozwolonych plików, aby uzyskać dostęp, cała procedura może być nieco skomplikowana. I zobacz dokument pomocy tutaj
źródło
Możesz użyć piaskownicy Firejail (powinien działać na jądrach z funkcją seccomp).
Aby z niego skorzystać, po prostu zrób
--noprofile
wyłącza domyślną piaskownicę--net=none
wyłącza siećWierzę, że większość dystrybucji już dostarcza pakiet, ale nawet jeśli nie ma firejail, nie ma praktycznie żadnych zależności innych niż budowanie toolchain i jądra obsługującego przestrzeń nazw / seccomp.
Istnieje kilka innych miłych cech firejail, które mogą być pokazywane
firejail --help
w odniesieniu do sieci (jak tylko zapewnienie interfejsu pętli zwrotnej lub blokowanie IP / DNS itp) ale to powinno załatwić sprawę. Również todoesn't require root
.źródło
Nie możesz tego zrobić tylko z iptables. Ta funkcja istniała krótko , ale nie można jej było uruchomić niezawodnie i została porzucona.
Jeśli możesz uruchomić proces jako dedykowany identyfikator użytkownika, iptables może to zrobić z
owner
modułem:Zobacz przykłady w Iptables: dopasowanie ruchu wychodzącego do conntrack i właściciela. Działa z dziwnymi kroplami , reguła iptables / pf zezwala tylko na aplikację / użytkownika XY?
Jeśli możesz uruchomić proces we własnym kontenerze, możesz zaporę ogniową w tym kontenerze niezależnie (nawet całkowicie go odłączyć od sieci).
Moduł bezpieczeństwa może filtrować dostęp procesu do funkcji sieciowych. Odpowiedź warl0ck daje przykład z AppArmor.
źródło
Rozwiązanie 1: Zapora ogniowa:
Możemy użyć zapór ogniowych, takich jak Douane lub Opensnitch, ALE te aplikacje nie są w 100% wydajne lub są na wczesnym etapie rozwoju (mają dużo błędów itp. Od 2019 r.)
Rozwiązanie 2: MAC jądra:
MAC jądra można wykorzystywać jako zaporę ogniową, najbardziej znane to Tomoyo , Selinux i Apparmor. To rozwiązanie jest najlepsze, jeśli chodzi o stabilność i wydajność (rozwiązanie zapory ogniowej), ale ustawienie czasu jest w jakiś sposób skomplikowane.
Rozwiązanie 3: Firejail:
Firejail może być używany do blokowania dostępu do sieci dla aplikacji, która nie wymaga rootowania, każdy użytkownik może z niego skorzystać
Rozwiązanie 4: Unshare
Unshare może uruchomić aplikację na innym serwerze nazw bez sieci, ale wymaga to root Firejail rozwiązanie robi prawie dokładnie to samo, ale nie wymaga roota
Rozwiązanie 5: Sprawdź, czy:
Jednym z rozwiązań jest przybliżenie aplikacji do zerowego / fałszywego serwera proxy. Możemy użyć tsocks lub proxybound . Oto kilka szczegółów na temat konfiguracji
Rozwiązanie 6: Iptables:
Innym łatwym rozwiązaniem jest iptables, można go skonfigurować tak, aby blokował aplikację
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Uwaga: Jeśli modyfikujesz już istniejącego użytkownika, powinieneś uruchomić:
usermod -a -G no-internet userName
sprawdź za pomocą: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
Uwaga: nie zapomnij o wprowadzeniu zmian na stałe, aby były one stosowane automatycznie po ponownym uruchomieniu . Zrobienie tego zależy od twojej dystrybucji Linuksa.
4. Sprawdź to, na przykład w przeglądarce Firefox, uruchamiając:
no-internet "firefox"
5. Jeśli chcesz zrobić wyjątek i zezwolić programowi na dostęp do sieci lokalnej :
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. Zrób to na stałe
Jednym ze sposobów zastosowania reguły iptables podczas rozruchu jest dodanie reguły jako usługi za pomocą systemd
źródło
sg no-internet
na razie.Zależy to od używanej dystrybucji, ale jest to funkcja zwykle zawarta w systemie MAC systemu operacyjnego. Jak wspomniano wcześniej, Ubuntu lub SuSE's AppArmor mogą to zrobić. Jeśli używasz RHEL, możesz skonfigurować SELinux tak, aby zezwalał lub odmawiał dostępu do określonego numeru portu na podstawie etykiety procesu wykonawczego. To wszystko, co mogłem znaleźć po szybkim googlowaniu, ale prawdopodobnie znajdziesz więcej szczegółowych zasobów online, jeśli spojrzysz mocniej i daje to ogólny pomysł.
źródło
Możesz użyć seccomp-bpf, aby zablokować niektóre wywołania systemowe. Na przykład może chcieć zablokować
socket
wywołanie systemowe, aby uniemożliwić procesowi tworzenie gniazd FD.Napisałem przykład tej approcah, która uniemożliwia
socket
wywołanie systemowe do pracy przy użyciu libseccomp. Podsumowanie jest (bez sprawdzania błędów):Nie wymaga to uprawnień administratora.
Kompletna piaskownica jest jednak znacznie bardziej złożona, więc nie należy jej używać do blokowania niechętnych do współpracy / złośliwych programów.
źródło
Możesz użyć programu wiersza polecenia o nazwie „proxy” i wypróbować jedną z następujących możliwości:
Skonfiguruj, aby korzystał z ...
Nie testowałem tego sam, więc nie wiem, czy to działa ...
źródło