Bir işlemin ağ erişimini engelle?


74

Tek bir işlemin (giden) ağ erişimini engellemek mümkün müdür?


6
Süreci nasıl tanımlamayı düşünüyorsunuz? PID, isim, yol?
Marco

1
Hangi erişimi engellemek istiyorsunuz? Bazı programlar localhostişlerini yapmak için (aynı makineye) ağ erişimini kullanır .
von

İşlem birlikte çalışıyorsa, ağ erişimini engellemek için LD_PRELOAD veya benzerlerine de bakın .
Gilles

Yanıtlar:


78

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 unsharearacı 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, pingPID 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

4
unshare -n"Operasyona izin verilmez" rootimtiyazları olmadan atmak gibi görünüyor , bu konuda eksik bir şey mi var?
Aralık'ta keller

1
Belki de aptal bir soru ... bu isim alanı aynı zamanda paylaşılmayan uygulamanın alt süreçleri / alt süreçleri için de geçerli midir?
bonanza,

3
Evet. Ad alanını değiştirdikten sonra ortaya çıkan tüm çocuklar tarafından miras alınır.
Michał Górny

2
Paylaşmak istemediğim herhangi bir programa benziyorum, örneğin sudo unshare -nkö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.
bonanza

3
İşlemi bir kullanıcı ile sınırlamak için kullanılan bir astar. Sadece iki kez sudo: sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
Jakub Bochenski 10:17

21

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 netnskomutlar 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ı, iptableskurallar 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 .
adaçayı

11

İ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

1
nasıl görevler im o dosyadan verileri kaldırmak veya silmek için çalışıyor onun vererek hatayı dosya Bunun dışında pid kaldırmak için olsa kök kullanıcı ile im
pkm

Ağ iletişimi özelliğini etkinleştirmek için @pkm, yalnızca [pid] 'e /sys/fs/cgroup/net_cls/tasks(yolda' blok yok ') yankılanmanız gerekir
Grief

10

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


7

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>

--noprofilevarsayılan sanal alanı --net=nonedevre 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 --helpAğ 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.


5

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 ownermodü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.


3

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

  1. Oluştur, yeni grup doğrula ; gerekli kullanıcıları bu gruba ekle:
    • Yaratmak, yapmak, tasarlamak, üretmek: groupadd no-internet
    • Doğrulamak: grep no-internet /etc/group
    • Kullanıcı ekle: useradd -g no-internet username

      Not: Zaten var olan kullanıcıyı değiştiriyorsanız, aşağıdakileri çalıştırmalısınız: usermod -a -G no-internet userName kontrol et:sudo groups userName

  2. Yolunuzda bir komut dosyası oluşturun ve yürütülebilir hale getirin:
    • Yaratmak, yapmak, tasarlamak, üretmek: nano /home/username/.local/bin/no-internet
    • çalıştırılabilir: chmod 755 /home/username/.local/bin/no-internet
    • İçerik: #!/bin/bash
                    sg no-internet "$@"

  3. İnternetsiz grup için ağ aktivitesini bırakmak için iptables kuralı ekle :
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      Not: Değişiklikleri kalıcı hale getirmeyi unutmayın, bu nedenle yeniden başlattıktan sonra otomatik olarak uygulanır . Bunu yapmak, Linux dağıtımınıza bağlıdır.


   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

1
Bu cidden mükemmel bir rehber. Teşekkür ederim. Her ne kadar benim için internetsiz komutum hiçbir zaman parametreyi geçmedi gibi görünüyor, bu yüzden sg no-internetşimdilik kullanıyorum .
Zach Bloomquist

@Zach ben cevabım firejail ilginizi çekebilir;)
intika

2

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.


2

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.


Bunun nasıl kullanılacağına dair bir örnek verebilir misiniz? Çalışmak için kök ayrıcalıkları gerektiriyor mu?
bonanza

-4

"Proxychains" adında bir komut satırı programı kullanabilir ve aşağıdaki olasılıklardan birini deneyebilirsiniz:

Kullandığı şekilde ayarlayın ...

  • ... olmayan bir vekil? ("Geçersiz" bir proxy ile çalıştırıp çalıştırmayacağını bilmiyorum)
  • ... internete erişimi sınırlayan yerel bir vekil ("tinyproxy", "kalamar", "privoxy", ... gibi)? (Sadece ACL kullanın)

Kendim test etmedim, bu yüzden işe yarayıp yaramadığını bilmiyorum ...


Test edilmemiş çözümler göndermek genellikle iyi bir fikir değildir.
Twirrim

olmayan bir vekil (vekil ev sahibi: 1234 veya benzeri) olan vekiller aslında sağlam bir yaklaşım olabilir, ancak
phil294
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.