क्या एकल प्रक्रिया के नेटवर्क आउटगोइंग (आउटगोइंग) को ब्लॉक करना संभव है?
localhost
अपना काम करने के लिए (उसी मशीन पर) नेटवर्क एक्सेस का उपयोग करते हैं।
क्या एकल प्रक्रिया के नेटवर्क आउटगोइंग (आउटगोइंग) को ब्लॉक करना संभव है?
localhost
अपना काम करने के लिए (उसी मशीन पर) नेटवर्क एक्सेस का उपयोग करते हैं।
जवाबों:
लिनक्स 2.6.24+ (2.6.29 तक प्रयोगात्मक माना जाता है) के साथ, आप उसके लिए नेटवर्क नामस्थान का उपयोग कर सकते हैं। आपको उपकरण के CONFIG_NET_NS=y
साथ अपने कर्नेल ( ) और उपयोग-लिनेक्स में 'नेटवर्क नेमस्पेस' सक्षम होना चाहिए unshare
।
फिर, नेटवर्क एक्सेस के बिना एक प्रक्रिया शुरू करना उतना ही सरल है:
unshare -n program ...
यह प्रक्रिया के लिए एक खाली नेटवर्क नेमस्पेस बनाता है। यही है, यह बिना लूपबैक सहित नेटवर्क इंटरफेस के साथ चलाया जाता है । नीचे दिए गए उदाहरण में, हम प्रोग्राम को चलाने के लिए जोड़ते हैं, केवल वर्तमान प्रभावी उपयोगकर्ता और समूह आईडी के बाद सुपरयुसर को मैप किया गया है (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 -n sudo -u dude bash -c 'echo Hello, my name is $USER'
सूडो दो बार: @ थोरसुमोनर bbs.archlinux.org/viewtopic.php?id=205240
लिनक्स में एक नेटवर्क नेमस्पेस नामक एक सुविधा है जो आपको अनिवार्य रूप से एक ही मशीन पर कई नेटवर्क स्टैक करने की अनुमति देता है, और इसे चलाने के बाद एक प्रोग्राम को असाइन करें। यह आमतौर पर कंटेनरों के लिए उपयोग की जाने वाली एक विशेषता है, लेकिन आप इसका उपयोग उस चीज़ को पूरा करने के लिए भी कर सकते हैं जो आप चाहते हैं।
ip netns
Subcommands यह लेते हैं। किसी भी चीज तक पहुंच के साथ एक नया नेटवर्क नेमस्पेस बनाना आसान नहीं है, यह एक नए नामस्थान की डिफ़ॉल्ट स्थिति है:
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
आईपी कमांड्स को निष्पादित करने की आवश्यकता थी , एक बार मैं बैश में था, मैंने सिर्फ 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
(पथ में कोई 'ब्लॉक) गूंजने की आवश्यकता नहीं है
हां, अनुकूलित एपर्मर प्रोफाइल के साथ, यानी
/usr/bin/curl {
...
# block ipv4 acces
deny network inet,
# ipv6
deny network inet6,
# raw socket
deny network raw,
}
लेकिन उस तरीके से, आपको एक्सेस करने के लिए अनुमत फ़ाइलों की सूची तैयार करनी होगी, पूरी प्रक्रिया थोड़ी जटिल हो सकती है। और सहायता दस्तावेज यहां देखें
आप फायरजेल सैंडबॉक्स का उपयोग कर सकते हैं (सेक्युलर सुविधा के साथ गुठली पर काम करना चाहिए)।
इसका उपयोग करने के लिए बस करो
firejail --noprofile --net=none <path to executable>
--noprofile
डिफ़ॉल्ट सैंडबॉक्स
--net=none
अक्षम करता है नेटवर्किंग अक्षम करता है
मेरा मानना है कि अधिकांश डिस्ट्रोस पहले से ही पैकेज प्रदान करते हैं, लेकिन भले ही वे फायरजेल न हों, लगभग टूलचिन और नेमस्पेस / सेकंपल सक्षम कर्नेल के अलावा कोई अन्य निर्भरता नहीं है।
फायरजेल की कुछ अन्य अच्छी विशेषताएं हैं जिन्हें firejail --help
नेटवर्किंग के संबंध में दिखाया जा सकता है (जैसे कि केवल लूपबैक इंटरफ़ेस प्रदान करना या आईपी / डीएनएस आदि को अवरुद्ध करना) लेकिन यह काम करना चाहिए। इसके अलावा, यह doesn't require root
।
आप इसे केवल iptables के साथ नहीं कर सकते। यह सुविधा संक्षिप्त रूप से मौजूद थी , लेकिन मज़बूती से काम नहीं किया जा सका और इसे छोड़ दिया गया।
यदि आप इस प्रक्रिया को एक समर्पित उपयोगकर्ता आईडी के रूप में चला सकते हैं, तो iptables इसे owner
मॉड्यूल के साथ कर सकते हैं :
iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP
Iptables में उदाहरण देखें : कॉनट्रैक और मालिक के साथ आउटगोइंग ट्रैफ़िक का मिलान। अजीब बूंदों के साथ काम करता है , iptables / pf नियम केवल XY एप्लिकेशन / उपयोगकर्ता को अनुमति देता है?
यदि आप अपने स्वयं के कंटेनर में प्रक्रिया को चला सकते हैं, तो आप उस कंटेनर को स्वतंत्र रूप से फ़ायरवॉल कर सकते हैं (यहां तक कि इसे पूरी तरह से नेटवर्क से डिस्कनेक्ट किया गया है)।
एक सुरक्षा मॉड्यूल एक प्रक्रिया की नेटवर्किंग सुविधाओं तक पहुँच फ़िल्टर कर सकता है। warl0ck का जवाब AppArmor के साथ एक उदाहरण देता है।
समाधान 1: फ़ायरवॉल:
हम फायरवॉल्स का उपयोग कर सकते हैं जैसे डौने या ओपेंस्निच BUT उन अनुप्रयोगों को 100% कुशल या विकास के प्रारंभिक चरण में नहीं है (2019 तक कई कीड़े आदि हैं)
समाधान 2: कर्नेल मैक:
कर्नेल MACs हैं एक फ़ायरवॉल सबसे ज्ञात के रूप में इस्तेमाल किया जा सकता Tomoyo , SELinux और AppArmor यह समाधान सबसे अच्छा एक है जब यह स्थिरता और दक्षता (फ़ायरवॉल समाधान), लेकिन समय के सबसे अधिक इस किसी भी तरह जटिल है सेटिंग के लिए आते हैं।
समाधान 3: फायरजेल:
फायरजेल का उपयोग किसी एप्लिकेशन के लिए नेटवर्क एक्सेस को ब्लॉक करने के लिए किया जा सकता है, इसके लिए रूट की आवश्यकता नहीं होती है जिससे कोई भी उपयोगकर्ता इससे लाभ उठा सकता है
firejail --noprofile --net=none command-application
समाधान 4: अनशेयर
बिना नेटवर्क के बिना किसी अलग नाम के ऐप पर अनशेयर शुरू किया जा सकता है, लेकिन इसके लिए रूट फायरजेल के सॉल्यूशन की आवश्यकता लगभग एक ही तरह की होती है, लेकिन रूट की आवश्यकता नहीं होती है
unshare -r -n application-comand
समाधान 5: अनुमानित करें:
एक समाधान के लिए एक अशक्त / नकली प्रॉक्सी के लिए आवेदन करना है । हम उपयोग कर सकते हैं 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 "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
4. इसे जांचें, उदाहरण के लिए फ़ायरफ़ॉक्स पर चलाकर:
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
।
यह इस बात पर निर्भर करता है कि आप किस डिस्ट्रो का उपयोग कर रहे हैं लेकिन यह आमतौर पर ओएस के मैक सिस्टम में शामिल एक विशेषता है। जैसा कि पहले कहा गया है उबंटू या SuSE का AppArmor ऐसा कर सकता है। यदि आप RHEL का उपयोग कर रहे हैं, तो आप निष्पादन प्रक्रिया के लेबल के आधार पर किसी विशेष पोर्ट नंबर तक पहुंच की अनुमति देने या अस्वीकार करने के लिए SELinux को कॉन्फ़िगर कर सकते हैं। यह सब मैं कुछ तेज गुगली के बाद पा सकता हूं लेकिन अगर आप कठिन दिखते हैं तो ऑनलाइन संसाधनों में अधिक संभावनाएं हैं और यह आपको सामान्य विचार देता है।
कुछ सिस्टम कॉल को ब्लॉक करने के लिए आप seccomp-bpf का उपयोग कर सकते हैं । उदाहरण के लिए, सॉकेट्स एफडी बनाने से प्रक्रिया को रोकने के लिए सिस्टम कॉल को ब्लॉकsocket
करना चाह सकते हैं ।
मैंने इस दृष्टिकोण का एक उदाहरण लिखा है जो socket
लिबासकैंप का उपयोग करके काम करने के लिए सिस्टम कॉल को रोकता है । सारांश (त्रुटि जाँच के बिना) है:
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);
इसके लिए रूट विशेषाधिकार की जरूरत नहीं है।
एक पूर्ण सैंडबॉक्स बहुत अधिक जटिल है, लेकिन आपको गैर-सहकारी / दुर्भावनापूर्ण कार्यक्रमों को अवरुद्ध करने के लिए इस संयुक्त आदेश का उपयोग नहीं करना चाहिए।
आप "प्रॉक्साइहांस" नामक एक कमांड लाइन प्रोग्राम का उपयोग कर सकते हैं और निम्नलिखित संभावनाओं में से एक का प्रयास कर सकते हैं:
इसे सेट करें कि यह उपयोग करता है ...
मैंने खुद इसका परीक्षण नहीं किया है इसलिए मुझे नहीं पता कि यह काम करता है ...