เป็นไปได้หรือไม่ที่จะบล็อกการเข้าถึงเครือข่าย (ขาออก) ของกระบวนการเดียว?
localhost
(ไปยังเครื่องเดียวกัน) เพื่อทำงานของพวกเขา
เป็นไปได้หรือไม่ที่จะบล็อกการเข้าถึงเครือข่าย (ขาออก) ของกระบวนการเดียว?
localhost
(ไปยังเครื่องเดียวกัน) เพื่อทำงานของพวกเขา
คำตอบ:
ด้วย 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
unshare -n
ดูเหมือนว่าจะโยน "การดำเนินการไม่ได้รับอนุญาต" โดยไม่มีroot
สิทธิ์อะไรที่ฉันหายไป?
sudo unshare -n
สืบทอดสิทธิ เนื่องจากฉันต้องการ sudo โทร unshare ฉันสงสัยว่าฉันจะแน่ใจได้อย่างไรว่าโปรแกรมที่ถูกเรียกนั้นไม่มีสิทธิ์รูท
sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
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'
คุณสามารถใช้ 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
/sys/fs/cgroup/net_cls/tasks
(ไม่ 'ปิดกั้น' ในเส้นทาง)
ใช่ด้วยโปรไฟล์ apparmor ที่กำหนดเองเช่น
/usr/bin/curl {
...
# block ipv4 acces
deny network inet,
# ipv6
deny network inet6,
# raw socket
deny network raw,
}
แต่ด้วยวิธีนี้คุณจะต้องสร้างรายการไฟล์ที่อนุญาตให้เข้าถึงได้เช่นกันขั้นตอนทั้งหมดอาจซับซ้อนเล็กน้อย และดูเอกสารช่วยเหลือที่นี่
คุณสามารถใช้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
นอกจากนี้ก็
คุณไม่สามารถทำได้ด้วย iptables เพียงอย่างเดียว คุณลักษณะนี้มีอยู่ชั่วครู่แต่ไม่สามารถทำงานได้อย่างน่าเชื่อถือและถูกทอดทิ้ง
หากคุณสามารถรันกระบวนการเป็น ID ผู้ใช้เฉพาะ iptables สามารถทำได้กับowner
โมดูล:
iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP
ดูตัวอย่างในIptables: จับคู่ทราฟฟิกขาออกกับ conntrack และเจ้าของ ทำงานร่วมกับหยดแปลก , iptables / กฎ PF จะอนุญาตให้แอปพลิเค XY / ผู้ใช้?
หากคุณสามารถเรียกใช้กระบวนการในที่เก็บของตัวเองคุณสามารถไฟร์วอลล์ที่เก็บอิสระ
โมดูลความปลอดภัยสามารถกรองการเข้าถึงคุณสมบัติเครือข่ายของกระบวนการ คำตอบของ warl0ckให้ตัวอย่างกับ AppArmor
โซลูชันที่ 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 มันสามารถตั้งค่าให้บล็อกแอปพลิเคชัน
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 "$@"
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
sg no-internet
ตอนนี้
มันขึ้นอยู่กับสิ่งที่คุณใช้ distro แต่นั่นเป็นคุณสมบัติที่มักจะรวมอยู่ในระบบ MAC ของระบบปฏิบัติการ ตามที่ระบุไว้ก่อนหน้านี้ Ubuntu หรือ AppArmor ของ SuSE สามารถทำได้ หากคุณใช้ RHEL คุณสามารถกำหนดค่า SELinux เพื่ออนุญาตหรือปฏิเสธการเข้าถึงหมายเลขพอร์ตเฉพาะตามป้ายชื่อของกระบวนการดำเนินการ นี่คือทั้งหมดที่ฉันสามารถหาได้หลังจาก googling ที่รวดเร็ว แต่อาจมีแหล่งข้อมูลเชิงลึกมากกว่านี้หากคุณดูยากขึ้นและทำให้คุณมีความคิดทั่วไป
คุณสามารถใช้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);
สิ่งนี้ไม่จำเป็นต้องมีสิทธิ์รูท
กล่องทรายที่สมบูรณ์นั้นมีความซับซ้อนมากกว่าอย่างไรก็ตามคุณไม่ควรใช้คำสั่งนี้เพื่อบล็อกโปรแกรมที่ไม่ให้ความร่วมมือ / ประสงค์ร้าย
คุณสามารถใช้โปรแกรมบรรทัดคำสั่งที่เรียกว่า "proxychains" และลองใช้วิธีใดวิธีหนึ่งต่อไปนี้:
ตั้งค่าว่าจะใช้ ...
ฉันไม่ได้ทดสอบด้วยตนเองดังนั้นฉันจึงไม่รู้ว่าใช้งานได้หรือไม่