Tek bir işlemin (giden) ağ erişimini engellemek mümkün müdür?
localhost
işlerini yapmak için (aynı makineye) ağ erişimini kullanır .
Tek bir işlemin (giden) ağ erişimini engellemek mümkün müdür?
localhost
işlerini yapmak için (aynı makineye) ağ erişimini kullanır .
Yanıtlar:
Linux 2.6.24+ ile (2.6.29'a kadar deneysel olarak kabul edilir), bunun için ağ ad alanlarını kullanabilirsiniz. Çekirdeğinizde ( CONFIG_NET_NS=y
) ve unshare
aracı ile util-linux'ta 'ağ ad alanlarını' etkinleştirmeniz gerekir .
Ardından, ağ erişimi olmayan bir işlemi başlatmak:
unshare -n program ...
Bu işlem için boş bir ağ ad alanı oluşturur. Başka bir deyişle, geridöngü de dahil olmak üzere hiçbir ağ arabirimi olmadan çalıştırılır . Aşağıdaki örnekte, programı sadece geçerli kullanıcı ve grup kimlikleri süper kullanıcı olanlarla eşleştirildikten sonra çalıştırmak için -r ekleriz:
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Uygulamanızın bir ağ arayüzüne ihtiyacı varsa, yenisini ayarlayabilirsiniz:
$ 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
Bunun yeni bir yerel geridöngü yaratacağını unutmayın . Yani, ortaya çıkan süreç ev sahibinin açık limanlarına erişemez 127.0.0.1
.
Ad alanındaki orijinal ağa erişmeniz gerekiyorsa nsenter
, diğer ad alanını girmek için kullanabilirsiniz .
Aşağıdaki örnek, ping
PID 1 tarafından kullanılan ağ ad alanıyla çalışır (aracılığıyla belirtilir -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
"Operasyona izin verilmez" root
imtiyazları olmadan atmak gibi görünüyor , bu konuda eksik bir şey mi var?
sudo unshare -n
kök hakkını miras alıyor. Sudo'ya, paylaşılmayacak çağrı demeye ihtiyacım olduğu için, çağrılan programın kök haklarına sahip olmadığından nasıl emin olabileceğimi merak ediyorum.
sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
Linux, aynı makinede temelde birden fazla ağ yığınına sahip olmanızı ve çalıştırırken bir programa atamanızı sağlayan ağ ad alanları adı verilen bir özelliğe sahiptir . Bu, genellikle kaplar için kullanılan bir özelliktir, ancak istediğinizi başarmak için de kullanabilirsiniz.
Alt ip netns
komutlar yönetir. Hiçbir şeye erişimi olmayan yeni bir ağ ad alanı oluşturmak kolaydır, yeni bir ad alanının varsayılan halidir:
root@host:~# ip netns add jail
Şimdi, bu ad alanına geçerseniz, onu oldukça kolay bir şekilde yapılandırabilirsiniz. Muhtemelen bunu ortaya çıkarmak isteyeceksiniz ve o kadar:
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
Şimdi komutunuzu ağ kullanmadan çalıştırmak istediğinizde, onu sadece o hapishanede çalıştırın:
root@host:~# ip netns exec jail su user -c 'ping 8.8.8.8'
connect: Network is unreachable
Ağa istenildiği gibi erişilemiyor. (Her türlü ilginç şeyi ayrı bir ağ yığını, iptables
kurallar vb. İçerdiğinden yapabilirsiniz .)
sudo ip
İp komutlarını çalıştırmam gerekmesine rağmen , bir kez bash olunca, su someuser
'someuser' kullanıcısı için ayrıcalıklı olmayan bir kabuk almaya çalıştım .
İptables kullanabilir ve bu işlemi bir gruba taşıyabilirsiniz:
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
(yolda' blok yok ') yankılanmanız gerekir
Evet, özelleştirilmiş apparmor profil, yani
/usr/bin/curl {
...
# block ipv4 acces
deny network inet,
# ipv6
deny network inet6,
# raw socket
deny network raw,
}
Ancak bu şekilde, erişebilmeniz için izin verilen dosyaların bir listesini oluşturmanız gerekecektir, işlemin tamamı biraz karmaşık olabilir. Ve burada yardım belgesine bakın
Firejail sanal alanını kullanabilirsiniz (seccomp özelliğine sahip çekirdeklerde çalışmalıdır).
Kullanmak için sadece yapmak
firejail --noprofile --net=none <path to executable>
--noprofile
varsayılan sanal alanı
--net=none
devre dışı bırakır
Çoğu dağıtımın zaten paket sağladığına inanıyorum, ancak firejail olmasalar bile, toolchain ve namespace / seccomp etkin çekirdeğin dışında başka hiçbir bağımlılığa sahip olmadıklarına inanıyorum.
firejail --help
Ağ oluşturma ile ilgili olarak gösterilebilecek firejail'in başka hoş özellikleri de var (sadece geridöngü arabirimi sağlama veya ip / dns engelleme vb.), Ancak bu işi yapmalı. Ayrıca, o doesn't require root
.
Bunu sadece iptables ile yapamazsınız. Bu özellik kısaca mevcuttu , ancak güvenilir bir şekilde çalışamadı ve terk edildi.
İşlemi özel bir kullanıcı kimliği olarak çalıştırabilirseniz, iptables bunu owner
modülle yapabilir:
iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP
Iptables'daki örneklere bakınız: giden trafiği conntrack ve sahibi ile eşleştirme. Garip damlalarla çalışır , iptables / pf kuralı yalnızca XY uygulamasına / kullanıcıya izin verir mi?
İşlemi kendi kabında çalıştırabiliyorsanız, bu kabı bağımsız olarak güvenlik duvarı (hatta ağ ile tamamen bağlantısı kesilmiş bile yapabilirsiniz) yapabilirsiniz.
Bir güvenlik modülü, bir işlemin ağ özelliklerine erişimini filtreleyebilir. warl0ck'in cevabı AppArmor ile bir örnek verir.
1. Çözüm: Güvenlik Duvarı:
Douane veya Opensnitch BUT gibi güvenlik duvarlarını kullanabiliriz, ancak bu uygulamalar% 100 verimli değil ya da erken bir gelişim aşamasında (2019'dan beri çok fazla hataya sahipler)
2. Çözüm: Çekirdek MAC:
Çekirdek MAC'ler en çok bilinen bir güvenlik duvarı olarak kullanılabilir Tomoyo , Selinux ve Apparmor Bu çözüm kararlılık ve verimlilik açısından en iyisidir (güvenlik duvarı çözümü) ancak çoğu zaman bunun ayarlanması biraz karmaşıktır.
3. Çözüm: Firejail:
Firejail , herhangi bir kullanıcının yararlanabileceği kök gerektirmeyen bir uygulamanın ağ erişimini engellemek için kullanılabilir.
firejail --noprofile --net=none command-application
4. Çözüm: Kabul Etme
Devre dışı bırakma, bir uygulamayı ağ olmadan farklı bir adda başlatabilir, ancak bu, root firejail'in çözümünü neredeyse tamamen aynı şeyi yapar ancak root gerektirmez
unshare -r -n application-comand
5. Çözüm: Proksifiye:
Çözümlerden biri, başvuruyu boş / sahte bir proxy'ye bildirmektir . Tsocks veya proxybound kullanabiliriz . İşte kurulum hakkında bazı detaylar
Çözüm 6: Iptables:
Başka bir kolay çözüm iptables, bir uygulamayı engellemek için kurulum olabilir
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
usermod -a -G no-internet userName
kontrol et: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. Çalıştırarak, örneğin Firefox'ta kontrol edin:
no-internet "firefox"
5. Bir istisna yapmak ve bir programın yerel ağa erişmesine izin vermek istemeniz durumunda :
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. Kalıcı hale getirin
İptables kuralını açılışta uygulamanın bir yolu kuralı systemd ile bir servis olarak eklemektir.
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
şimdilik kullanıyorum .
Hangi dağıtımı kullandığınıza bağlı olarak değişir, ancak bu genellikle işletim sisteminin MAC sistemine dahil olan bir özelliktir. Daha önce de belirtildiği gibi Ubuntu veya SuSE'nin AppArmor'u bunu yapabilir. RHEL kullanıyorsanız, SELinux'u yürütme işleminin etiketine göre belirli bir port numarasına erişime izin vermek veya vermemek üzere yapılandırabilirsiniz. Bazı hızlı googlinglerden sonra bulabildiğim tek şey bu , ancak daha fazla bakarsanız ve genel bir fikir verirse, muhtemelen daha fazla çevrimiçi kaynak var.
Bazı sistem çağrılarını engellemek için seccomp-bpf kullanabilirsiniz. Örneğin , işlemin FD soketleri oluşturmasını önlemek için sistem çağrısını engellemeksocket
isteyebilir .
Sistemin libseccomp kullanarak çalışmasını engelleyen bu yaklaşımın bir örneğinisocket
yazdım. Özet (hata kontrolü olmadan):
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);
Bunun kök ayrıcalıklarına ihtiyacı yok.
Komple bir sanal alan çok daha karmaşıktır, bu yüzden kooperatif olmayan / kötü amaçlı programları engellemek için bu untake'yi kullanmamalısınız.
"Proxychains" adında bir komut satırı programı kullanabilir ve aşağıdaki olasılıklardan birini deneyebilirsiniz:
Kullandığı şekilde ayarlayın ...
Kendim test etmedim, bu yüzden işe yarayıp yaramadığını bilmiyorum ...