किसी प्रक्रिया का नेटवर्क एक्सेस ब्लॉक करें?


74

क्या एकल प्रक्रिया के नेटवर्क आउटगोइंग (आउटगोइंग) को ब्लॉक करना संभव है?


6
प्रक्रिया की पहचान करने का आपका इरादा कैसा है? PID, नाम, पथ?
मार्को

1
आप किस एक्सेस को ब्लॉक करना चाहते हैं? कुछ प्रोग्राम localhostअपना काम करने के लिए (उसी मशीन पर) नेटवर्क एक्सेस का उपयोग करते हैं।
वॉनब्रांड

जवाबों:


78

लिनक्स 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

4
unshare -nrootविशेषाधिकार के बिना "ऑपरेशन की अनुमति नहीं है" फेंकने के लिए लगता है , इसके बारे में मुझे कुछ भी याद नहीं है?
बाल्डर्स

1
शायद एक बेवकूफी भरा सवाल ... क्या यह नामपट्ट भी चाइल्ड प्रोसेस पर लागू होता है / अनसेंडेड एप्लिकेशन की प्रक्रिया कहा जाता है?
बोनांजा २

3
हाँ। यह नाम स्थान पर स्विच करने के बाद पैदा हुए सभी बच्चों को विरासत में मिला है।
माइकल गोरी

2
मुझे लगता है कि मैं किसी भी कार्यक्रम की तरह दिखता हूं जिसे मैं ठीक करना चाहता हूं जैसे sudo unshare -nकि मूल अधिकार के साथ। जैसा कि मुझे सूडो को कॉल करने की आवश्यकता है, मैं सोच रहा हूं कि मैं यह कैसे सुनिश्चित कर सकता हूं कि बुलाए गए कार्यक्रम के मूल अधिकार नहीं हैं।
बोनान्ज़ा

3
एक लाइनर एक उपयोगकर्ता के लिए प्रक्रिया को प्रतिबंधित करने के लिए। सिर्फ sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'सूडो दो बार: @ थोरसुमोनर bbs.archlinux.org/viewtopic.php?id=205240
जैकब

21

लिनक्स में एक नेटवर्क नेमस्पेस नामक एक सुविधा है जो आपको अनिवार्य रूप से एक ही मशीन पर कई नेटवर्क स्टैक करने की अनुमति देता है, और इसे चलाने के बाद एक प्रोग्राम को असाइन करें। यह आमतौर पर कंटेनरों के लिए उपयोग की जाने वाली एक विशेषता है, लेकिन आप इसका उपयोग उस चीज़ को पूरा करने के लिए भी कर सकते हैं जो आप चाहते हैं।

ip netnsSubcommands यह लेते हैं। किसी भी चीज तक पहुंच के साथ एक नया नेटवर्क नेमस्पेस बनाना आसान नहीं है, यह एक नए नामस्थान की डिफ़ॉल्ट स्थिति है:

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' के लिए एक अनपेक्षित शेल प्राप्त करने के लिए निष्पादित किया।
ऋषि १

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
जब उस रूट से डेटा हटाने या हटाने की कोशिश की जा रही हो, तो उस टास्क में से
पीड

@pkm नेटवर्किंग को सक्षम करने के लिए, आपको केवल [pid] /sys/fs/cgroup/net_cls/tasks(पथ में कोई 'ब्लॉक) गूंजने की आवश्यकता नहीं है
दुख की बात है

10

हां, अनुकूलित एपर्मर प्रोफाइल के साथ, यानी

/usr/bin/curl {
    ...

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

}

लेकिन उस तरीके से, आपको एक्सेस करने के लिए अनुमत फ़ाइलों की सूची तैयार करनी होगी, पूरी प्रक्रिया थोड़ी जटिल हो सकती है। और सहायता दस्तावेज यहां देखें


7

आप फायरजेल सैंडबॉक्स का उपयोग कर सकते हैं (सेक्युलर सुविधा के साथ गुठली पर काम करना चाहिए)।

इसका उपयोग करने के लिए बस करो

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

--noprofileडिफ़ॉल्ट सैंडबॉक्स --net=noneअक्षम करता है नेटवर्किंग अक्षम करता है

मेरा मानना ​​है कि अधिकांश डिस्ट्रोस पहले से ही पैकेज प्रदान करते हैं, लेकिन भले ही वे फायरजेल न हों, लगभग टूलचिन और नेमस्पेस / सेकंपल सक्षम कर्नेल के अलावा कोई अन्य निर्भरता नहीं है।

फायरजेल की कुछ अन्य अच्छी विशेषताएं हैं जिन्हें firejail --helpनेटवर्किंग के संबंध में दिखाया जा सकता है (जैसे कि केवल लूपबैक इंटरफ़ेस प्रदान करना या आईपी / डीएनएस आदि को अवरुद्ध करना) लेकिन यह काम करना चाहिए। इसके अलावा, यह doesn't require root


5

आप इसे केवल iptables के साथ नहीं कर सकते। यह सुविधा संक्षिप्त रूप से मौजूद थी , लेकिन मज़बूती से काम नहीं किया जा सका और इसे छोड़ दिया गया।

यदि आप इस प्रक्रिया को एक समर्पित उपयोगकर्ता आईडी के रूप में चला सकते हैं, तो iptables इसे ownerमॉड्यूल के साथ कर सकते हैं :

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

Iptables में उदाहरण देखें : कॉनट्रैक और मालिक के साथ आउटगोइंग ट्रैफ़िक का मिलान। अजीब बूंदों के साथ काम करता है , iptables / pf नियम केवल XY एप्लिकेशन / उपयोगकर्ता को अनुमति देता है?

यदि आप अपने स्वयं के कंटेनर में प्रक्रिया को चला सकते हैं, तो आप उस कंटेनर को स्वतंत्र रूप से फ़ायरवॉल कर सकते हैं (यहां तक ​​कि इसे पूरी तरह से नेटवर्क से डिस्कनेक्ट किया गया है)।

एक सुरक्षा मॉड्यूल एक प्रक्रिया की नेटवर्किंग सुविधाओं तक पहुँच फ़िल्टर कर सकता है। warl0ck का जवाब AppArmor के साथ एक उदाहरण देता है।


3

समाधान 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 है, यह किसी एप्लिकेशन को ब्लॉक करने के लिए सेटअप हो सकता है

  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 नियम जोड़ें :


   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

1
यह एक गंभीर रूप से उत्कृष्ट मार्गदर्शक है। धन्यवाद। हालाँकि, मेरे लिए, मेरा नो-इंटरनेट कमांड कभी भी पैरामीटर को पास नहीं करता था, इसलिए मैं अभी उपयोग कर रहा हूं sg no-internet
जच ब्लूमक्विस्ट

@Zach ने मेरे उत्तर को अपडेट किया जिसे आप फायरजेल में रुचि रख सकते हैं;)
intika

2

यह इस बात पर निर्भर करता है कि आप किस डिस्ट्रो का उपयोग कर रहे हैं लेकिन यह आमतौर पर ओएस के मैक सिस्टम में शामिल एक विशेषता है। जैसा कि पहले कहा गया है उबंटू या SuSE का AppArmor ऐसा कर सकता है। यदि आप RHEL का उपयोग कर रहे हैं, तो आप निष्पादन प्रक्रिया के लेबल के आधार पर किसी विशेष पोर्ट नंबर तक पहुंच की अनुमति देने या अस्वीकार करने के लिए SELinux को कॉन्फ़िगर कर सकते हैं। यह सब मैं कुछ तेज गुगली के बाद पा सकता हूं लेकिन अगर आप कठिन दिखते हैं तो ऑनलाइन संसाधनों में अधिक संभावनाएं हैं और यह आपको सामान्य विचार देता है।


2

कुछ सिस्टम कॉल को ब्लॉक करने के लिए आप 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);

इसके लिए रूट विशेषाधिकार की जरूरत नहीं है।

एक पूर्ण सैंडबॉक्स बहुत अधिक जटिल है, लेकिन आपको गैर-सहकारी / दुर्भावनापूर्ण कार्यक्रमों को अवरुद्ध करने के लिए इस संयुक्त आदेश का उपयोग नहीं करना चाहिए।


क्या आप इसका उपयोग करने का एक उदाहरण दे सकते हैं? क्या इसे काम करने के लिए मूल विशेषाधिकारों की आवश्यकता है?
बोनान्ज़ा

-4

आप "प्रॉक्साइहांस" नामक एक कमांड लाइन प्रोग्राम का उपयोग कर सकते हैं और निम्नलिखित संभावनाओं में से एक का प्रयास कर सकते हैं:

इसे सेट करें कि यह उपयोग करता है ...

  • ... एक प्रॉक्सी जो मौजूद नहीं है? (मुझे नहीं पता कि यह "अमान्य" प्रॉक्सी के साथ चलेगा)
  • ... एक स्थानीय प्रॉक्सी (जैसे "टिनिप्रोक्सी", "स्क्विड", "प्राइवेटॉक्सी", ...) जो इंटरनेट तक पहुंच को सीमित करता है? (बस ACLs का उपयोग करें)

मैंने खुद इसका परीक्षण नहीं किया है इसलिए मुझे नहीं पता कि यह काम करता है ...


अछूता समाधान पोस्ट करना आम तौर पर एक अच्छा विचार नहीं है।
ट्विर्टिम

समीपस्थ प्रॉक्सी के साथ समीपस्थ छद्म (जैसे लोकलहोस्ट: 1234 या इस तरह) वास्तव में एक ठोस दृष्टिकोण हो सकता है, हालांकि
16:29
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.