ปิดกั้นการเข้าถึงเครือข่ายของกระบวนการหรือไม่


74

เป็นไปได้หรือไม่ที่จะบล็อกการเข้าถึงเครือข่าย (ขาออก) ของกระบวนการเดียว?


6
คุณตั้งใจจะระบุกระบวนการอย่างไร PID ชื่อเส้นทางหรือไม่
Marco

1
คุณต้องการบล็อกการเข้าถึงแบบใด บางโปรแกรมใช้การเข้าถึงเครือข่ายผ่านlocalhost(ไปยังเครื่องเดียวกัน) เพื่อทำงานของพวกเขา
vonbrand

คำตอบ:


78

ด้วย Linux 2.6.24+ (ซึ่งถือว่าเป็นการทดลองจนถึง 2.6.29) คุณสามารถใช้เนมสเปซเครือข่าย คุณต้องเปิดใช้งาน 'เนมสเปซเครือข่าย' ในเคอร์เนล ( CONFIG_NET_NS=y) และ util-linux ด้วยunshareเครื่องมือ

จากนั้นการเริ่มต้นกระบวนการที่ไม่มีการเข้าถึงเครือข่ายนั้นง่ายดายเพียง:

unshare -n program ...

สิ่งนี้จะสร้างเนมสเปซเครือข่ายที่ว่างเปล่าสำหรับกระบวนการ นั่นคือมันทำงานโดยไม่มีอินเตอร์เฟสเครือข่ายรวมถึงไม่มีลูปแบ็ค ในตัวอย่างด้านล่างเราเพิ่ม -r เพื่อเรียกใช้โปรแกรมเฉพาะหลังจากที่ผู้ใช้ที่มีประสิทธิภาพและรหัสกลุ่มปัจจุบันถูกแมปกับ superuser แล้ว (หลีกเลี่ยง sudo):

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

หากแอปของคุณต้องการอินเทอร์เฟซเครือข่ายคุณสามารถตั้งค่าใหม่ได้:

$ 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

โปรดทราบว่าสิ่งนี้จะสร้างลูปแบ็คท้องถิ่นใหม่ กล่าวคือกระบวนการที่เกิดขึ้นจะไม่สามารถเข้าถึงพอร์ตที่เปิดอยู่ของโฮสต์127.0.0.1ได้


หากคุณต้องการเข้าถึงเครือข่ายดั้งเดิมภายในเนมสเปซคุณสามารถใช้nsenterเพื่อเข้าสู่เนมสเปซอื่น

ตัวอย่างต่อไปนี้ทำงานpingด้วยเนมสเปซเครือข่ายที่ใช้โดย PID 1 (ระบุผ่าน-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ดูเหมือนว่าจะโยน "การดำเนินการไม่ได้รับอนุญาต" โดยไม่มีrootสิทธิ์อะไรที่ฉันหายไป?
หัวล้าน

1
อาจเป็นคำถามที่งี่เง่า ... namespace นี้ใช้กับกระบวนการลูก / กระบวนการที่เรียกว่าของแอปพลิเคชั่นที่ไม่แชร์
โบนันซ่า

3
ใช่. มันได้รับการสืบทอดโดยเด็กทุกคนวางไข่หลังจากเปลี่ยนเนมสเปซ
MichałGórny

2
ฉันดูเหมือนโปรแกรมใด ๆ ที่ฉันต้องการยกเลิกการแบ่งปันเช่นกับการsudo unshare -nสืบทอดสิทธิ เนื่องจากฉันต้องการ sudo โทร unshare ฉันสงสัยว่าฉันจะแน่ใจได้อย่างไรว่าโปรแกรมที่ถูกเรียกนั้นไม่มีสิทธิ์รูท
โบนันซ่า

3
ซับในหนึ่งเพื่อ จำกัด กระบวนการให้กับผู้ใช้ เพียง 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

21

Linux มีคุณสมบัติที่เรียกว่าเนมสเปซเครือข่ายซึ่งอนุญาตให้คุณมีหลายสแต็คเครือข่ายบนเครื่องเดียวกันและกำหนดหนึ่งให้กับโปรแกรมเมื่อเรียกใช้ นี่คือคุณสมบัติที่ใช้สำหรับตู้คอนเทนเนอร์ แต่คุณสามารถใช้เพื่อทำสิ่งที่คุณต้องการได้

คำip netnsสั่งย่อยจัดการมัน การสร้างเนมสเปซเครือข่ายใหม่โดยไม่สามารถเข้าถึงสิ่งใด ๆ ได้ง่ายเป็นสถานะเริ่มต้นของเนมสเปซใหม่:

root@host:~# ip netns add jail

ตอนนี้ถ้าคุณเปลี่ยนเป็นเนมสเปซนั้นคุณสามารถกำหนดค่าได้อย่างง่ายดาย คุณอาจต้องการที่จะเห็นมันและนั่นคือ:

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

ตอนนี้เมื่อคุณต้องการรันคำสั่งโดยไม่มีเครือข่ายคุณเพียงแค่รันมันในคุกนั้น:

root@host:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

เครือข่ายไม่สามารถเข้าถึงได้ตามที่ต้องการ (คุณสามารถทำสิ่งต่าง ๆ ที่น่าสนใจได้ทั้งหมดเช่นเครือข่ายสแต็iptablesกแยกต่างหากรวมถึงกฎ ฯลฯ )


แม้ว่าฉันsudo ipจะต้องดำเนินการคำสั่ง ip แต่เมื่อฉันถูกทุบตีฉันก็ดำเนินการsu someuserเพื่อให้ได้เชลล์ที่ไม่มีสิทธิ์สำหรับผู้ใช้ 'someuser'
ปราชญ์

11

คุณสามารถใช้ iptables และย้ายกระบวนการนั้นไปที่ cgroup:

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
วิธีการลบ pid ออกจากไฟล์งานนั้นให้ข้อผิดพลาดเมื่อฉันพยายามที่จะลบหรือลบข้อมูลจากไฟล์นั้นแม้ว่า im กับผู้ใช้รูท
pkm

@pkm เพื่อเปิดใช้งานการเชื่อมต่อเครือข่ายคุณจะต้องสะท้อน [pid] ถึง/sys/fs/cgroup/net_cls/tasks(ไม่ 'ปิดกั้น' ในเส้นทาง)
ความเศร้าโศก

10

ใช่ด้วยโปรไฟล์ apparmor ที่กำหนดเองเช่น

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

แต่ด้วยวิธีนี้คุณจะต้องสร้างรายการไฟล์ที่อนุญาตให้เข้าถึงได้เช่นกันขั้นตอนทั้งหมดอาจซับซ้อนเล็กน้อย และดูเอกสารช่วยเหลือที่นี่


7

คุณสามารถใช้sandbox firejail (ควรทำงานบนเมล็ดที่มีคุณสมบัติ seccomp)

ที่จะใช้มันแค่ทำ

firejail --noprofile --net=none <path to executable>

--noprofileปิดใช้งานแซนด์บ็อกซ์เริ่มต้น --net=noneปิดใช้งานเครือข่าย

ฉันเชื่อว่า distros ส่วนใหญ่มีแพ็คเกจอยู่แล้ว แต่แม้ว่าพวกเขาจะไม่ใช่ firejail ก็แทบจะไม่มีการพึ่งพาอื่นนอกจากการสร้าง toolchain และเนมสเปซ / เปิดใช้งานเคอร์เนล

มีคุณสมบัติที่ดีอื่น ๆ ของ firejail ที่สามารถแสดงได้firejail --helpเกี่ยวกับการเชื่อมต่อเครือข่าย (เช่นการจัดเตรียมอินเทอร์เฟซย้อนกลับหรือการบล็อก ip / dns เป็นต้น) แต่สิ่งนี้ควรทำงาน doesn't require rootนอกจากนี้ก็


5

คุณไม่สามารถทำได้ด้วย iptables เพียงอย่างเดียว คุณลักษณะนี้มีอยู่ชั่วครู่แต่ไม่สามารถทำงานได้อย่างน่าเชื่อถือและถูกทอดทิ้ง

หากคุณสามารถรันกระบวนการเป็น ID ผู้ใช้เฉพาะ iptables สามารถทำได้กับownerโมดูล:

iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP

ดูตัวอย่างในIptables: จับคู่ทราฟฟิกขาออกกับ conntrack และเจ้าของ ทำงานร่วมกับหยดแปลก , iptables / กฎ PF จะอนุญาตให้แอปพลิเค XY / ผู้ใช้?

หากคุณสามารถเรียกใช้กระบวนการในที่เก็บของตัวเองคุณสามารถไฟร์วอลล์ที่เก็บอิสระ

โมดูลความปลอดภัยสามารถกรองการเข้าถึงคุณสมบัติเครือข่ายของกระบวนการ คำตอบของ warl0ckให้ตัวอย่างกับ AppArmor


3

โซลูชันที่ 1: ไฟร์วอลล์:

เราสามารถใช้ไฟร์วอลล์เช่นDouaneหรือOpensnitch BUT แต่แอปพลิเคชั่นเหล่านั้นไม่ได้มีประสิทธิภาพ 100% หรืออยู่ในช่วงเริ่มต้นของการพัฒนา (มีข้อบกพร่องมากมาย ฯลฯ ณ ปี 2562)

โซลูชันที่ 2: เคอร์เนล MAC:

Kernel MACs สามารถใช้เป็นไฟร์วอลล์ที่รู้จักมากที่สุดคือTomoyo , SelinuxและApparmor วิธีนี้เป็นวิธีที่ดีที่สุดเมื่อมันมาถึงความเสถียรและประสิทธิภาพ (วิธีแก้ปัญหาไฟร์วอลล์) แต่การตั้งค่าเวลาส่วนใหญ่มีความซับซ้อน

โซลูชันที่ 3: Firejail:

Firejailสามารถใช้เพื่อบล็อกการเข้าถึงเครือข่ายสำหรับแอปพลิเคชันซึ่งไม่จำเป็นต้องรูทผู้ใช้จะได้รับประโยชน์จากมัน

firejail --noprofile --net=none command-application

โซลูชันที่ 4: ยกเลิกการแบ่งปัน

Unshare สามารถเริ่มต้นแอปพลิเคชันบนเนมสเปซที่แตกต่างกันโดยไม่ต้องใช้เครือข่าย แต่ต้องใช้วิธีการแก้ปัญหาของรูท Firejail เกือบจะเหมือนกันทุกประการ แต่ไม่ต้องการรูท

unshare -r -n application-comand

โซลูชันที่ 5: Proxify:

ทางออกหนึ่งคือ proxify แอปพลิเคชันไปยังพร็อกซีnull / ปลอม เราสามารถใช้tsocksหรือproxybound นี่คือรายละเอียดบางอย่างเกี่ยวกับการตั้งค่า

โซลูชันที่ 6: Iptables:

อีกวิธีง่าย ๆ คือ iptables มันสามารถตั้งค่าให้บล็อกแอปพลิเคชัน

  1. สร้างตรวจสอบกลุ่มใหม่ ; เพิ่มผู้ใช้ที่ต้องการในกลุ่มนี้:
    • สร้าง: groupadd no-internet
    • ตรวจสอบ: grep no-internet /etc/group
    • เพิ่มผู้ใช้: useradd -g no-internet username

      หมายเหตุ: หากคุณกำลังแก้ไขผู้ใช้ที่มีอยู่แล้วคุณควรรัน: usermod -a -G no-internet userName ตรวจสอบด้วย:sudo groups userName

  2. สร้างสคริปต์ในเส้นทางของคุณและทำให้มันปฏิบัติการได้:
    • สร้าง: nano /home/username/.local/bin/no-internet
    • ปฏิบัติการ: chmod 755 /home/username/.local/bin/no-internet
    • เนื้อหา: #!/bin/bash
                    sg no-internet "$@"

  3. เพิ่มกฎ iptablesสำหรับการทิ้งกิจกรรมเครือข่ายสำหรับกลุ่มที่ไม่มีอินเทอร์เน็ต :
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      หมายเหตุ: อย่าลืมที่จะทำให้การเปลี่ยนแปลงอย่างถาวรดังนั้นมันจะถูกนำไปใช้โดยอัตโนมัติหลังจากรีบูต ขึ้นอยู่กับการกระจาย Linux ของคุณ


   4. ตรวจสอบตัวอย่างเช่นบน Firefox โดยเรียกใช้:

  • no-internet "firefox"

   5. ในกรณีที่คุณต้องการยกเว้นและอนุญาตให้โปรแกรมเข้าถึงเครือข่ายท้องถิ่น :

  • 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. ทำให้ถาวร

   วิธีหนึ่งในการใช้กฎ iptables เมื่อบู๊ตคือการเพิ่มกฎเป็นบริการที่มี systemd

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
นี่คือแนวทางที่ยอดเยี่ยมอย่างจริงจัง ขอขอบคุณ. แม้ว่าสำหรับฉันแล้วคำสั่ง no-internet ของฉันดูเหมือนจะไม่ผ่านพารามิเตอร์ดังนั้นฉันจึงใช้sg no-internetตอนนี้
Zach Bloomquist

@Zach ฉันปรับปรุงคำตอบของฉันคุณอาจจะสนใจใน firejail;)
intika

2

มันขึ้นอยู่กับสิ่งที่คุณใช้ distro แต่นั่นเป็นคุณสมบัติที่มักจะรวมอยู่ในระบบ MAC ของระบบปฏิบัติการ ตามที่ระบุไว้ก่อนหน้านี้ Ubuntu หรือ AppArmor ของ SuSE สามารถทำได้ หากคุณใช้ RHEL คุณสามารถกำหนดค่า SELinux เพื่ออนุญาตหรือปฏิเสธการเข้าถึงหมายเลขพอร์ตเฉพาะตามป้ายชื่อของกระบวนการดำเนินการ นี่คือทั้งหมดที่ฉันสามารถหาได้หลังจาก googling ที่รวดเร็ว แต่อาจมีแหล่งข้อมูลเชิงลึกมากกว่านี้หากคุณดูยากขึ้นและทำให้คุณมีความคิดทั่วไป


2

คุณสามารถใช้seccomp-bpfเพื่อบล็อกการเรียกระบบบางอย่าง ตัวอย่างเช่นอาจต้องการบล็อกการsocketเรียกของระบบเพื่อป้องกันไม่ให้กระบวนการสร้างซ็อกเก็ต FD

ฉันเขียนตัวอย่างของ approcah นี้ซึ่งป้องกันการsocketเรียกระบบสำหรับการทำงานโดยใช้ libseccomp สรุปคือ (โดยไม่ตรวจสอบข้อผิดพลาด):

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);

สิ่งนี้ไม่จำเป็นต้องมีสิทธิ์รูท

กล่องทรายที่สมบูรณ์นั้นมีความซับซ้อนมากกว่าอย่างไรก็ตามคุณไม่ควรใช้คำสั่งนี้เพื่อบล็อกโปรแกรมที่ไม่ให้ความร่วมมือ / ประสงค์ร้าย


คุณยกตัวอย่างวิธีใช้สิ่งนี้ได้ไหม จำเป็นต้องใช้สิทธิ์รูทหรือไม่
โบนันซ่า

-4

คุณสามารถใช้โปรแกรมบรรทัดคำสั่งที่เรียกว่า "proxychains" และลองใช้วิธีใดวิธีหนึ่งต่อไปนี้:

ตั้งค่าว่าจะใช้ ...

  • ... พร็อกซีที่ไม่มีอยู่หรือไม่ (ฉันไม่ทราบว่ามันจะทำงานด้วยพร็อกซี "ไม่ถูกต้อง")
  • ... พรอกซีท้องถิ่น (เช่น "tinyproxy", "squid", "privoxy", ... ) ที่ จำกัด การเข้าถึงอินเทอร์เน็ตหรือไม่ (เพียงใช้ ACL)

ฉันไม่ได้ทดสอบด้วยตนเองดังนั้นฉันจึงไม่รู้ว่าใช้งานได้หรือไม่


การโพสต์วิธีแก้ปัญหาที่ยังไม่ทดลองโดยทั่วไปไม่ใช่ความคิดที่ดี
Twirrim

proxychains กับพร็อกซี่ nonexisting (เช่น localhost: 1234 หรือชอบ) จริงอาจจะเป็นวิธีการที่เป็นของแข็ง แต่
phil294
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.