একক প্রক্রিয়ার (আউটগোয়িং) নেটওয়ার্ক অ্যাক্সেসকে আটকাতে কি সম্ভব?
localhost
তাদের কাজগুলি করতে (একই মেশিনে) মাধ্যমে নেটওয়ার্ক অ্যাক্সেস ব্যবহার করে ।
একক প্রক্রিয়ার (আউটগোয়িং) নেটওয়ার্ক অ্যাক্সেসকে আটকাতে কি সম্ভব?
localhost
তাদের কাজগুলি করতে (একই মেশিনে) মাধ্যমে নেটওয়ার্ক অ্যাক্সেস ব্যবহার করে ।
উত্তর:
লিনাক্স ২.6.২৪+ (২.6.২৯ অবধি পরীক্ষামূলক হিসাবে বিবেচিত) এর সাহায্যে আপনি এর জন্য নেটওয়ার্ক নেমস্পেস ব্যবহার করতে পারেন। সরঞ্জামটির CONFIG_NET_NS=y
সাহায্যে আপনার কার্নেল ( ) এবং ইউজার-লিনাক্সে আপনাকে 'নেটওয়ার্ক নেমস্পেস' সক্ষম করতে হবে unshare
।
তারপরে, নেটওয়ার্ক অ্যাক্সেস ছাড়াই একটি প্রক্রিয়া শুরু করা যেমন সহজ:
unshare -n program ...
এটি প্রক্রিয়াটির জন্য একটি ফাঁকা নেটওয়ার্ক নেমস্পেস তৈরি করে। এটি কোনও লুপব্যাক সহ কোনও নেটওয়ার্ক ইন্টারফেস সহ চালিত হয় । নীচের উদাহরণে আমরা বর্তমান কার্যকর ব্যবহারকারী এবং গোষ্ঠী আইডিগুলি সুপারভাইজারগুলিতে ম্যাপ করার পরে কেবল প্রোগ্রামটি চালাতে যুক্ত করব - (সুডো এড়ানো):
$ 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
নেটওয়ার্ক নেমস্পেসের সাথে চালিত যা পিআইডি 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
মূল অংশের উত্তরাধিকারী with আমার যেমন শেয়ারহীনকে কল করার জন্য সুডো দরকার তাই আমি ভাবছি যে আমি কীভাবে নিশ্চিত করতে পারি যে ডাকা প্রোগ্রামটির মূল অধিকার নেই।
sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ থারস্মোনার
লিনাক্সে নেটওয়ার্ক নেমস্পেসস নামে একটি বৈশিষ্ট্য রয়েছে যা আপনাকে একই মেশিনে মূলত একাধিক নেটওয়ার্ক স্ট্যাক রাখতে দেয় এবং এটি চালানোর সময় একটি প্রোগ্রামে একটি বরাদ্দ দেয়। এটি সাধারণত ধারকগুলির জন্য ব্যবহৃত বৈশিষ্ট্য, তবে আপনি যা চান তা পূরণ করতে আপনি এটি ব্যবহার করতে পারেন।
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
ব্যাশে পরেছিলাম, কেবলমাত্র 'সামুসার' ব্যবহারকারীর জন্য একটি অনিরাপদ শেল পেতে আমি মৃত্যুদন্ড কার্যকর করেছি ।
আপনি iptables ব্যবহার করতে পারেন এবং সেই প্রক্রিয়াটিকে একটি গ্রুপে স্থানান্তর করতে পারেন:
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 এর উদাহরণগুলি দেখুন : কনট্র্যাক এবং মালিকের সাথে বহির্গামী ট্র্যাফিকের মিল matching কেবল এক্সওয়াই অ্যাপ্লিকেশন / ব্যবহারকারীর অনুমতি দেওয়ার জন্য অদ্ভুত ফোঁটা , আইপটিবল / পিএফ নিয়ম নিয়ে কাজ করে?
আপনি যদি নিজের ধারকটিতে প্রক্রিয়াটি চালাতে পারেন তবে আপনি সেই ধারকটি স্বাধীনভাবে ফায়ারওয়াল করতে পারেন (এমনকি এটি নেটওয়ার্ক থেকে সম্পূর্ণ সংযোগ বিচ্ছিন্ন করে দিন)।
একটি সুরক্ষা মডিউল নেটওয়ার্কিং বৈশিষ্ট্যগুলিতে কোনও প্রক্রিয়াটির অ্যাক্সেস ফিল্টার করতে পারে। warl0ck এর উত্তর AppArmor এর সাথে একটি উদাহরণ দেয়।
সমাধান 1: ফায়ারওয়াল:
আমরা মত ফায়ারওয়াল ব্যবহার করতে পারে Douane বা Opensnitch কিন্তু যারা অ্যাপ্লিকেশন 100% দক্ষ বা বিকাশের প্রাথমিক পর্যায়ে নেই (বাগ ইত্যাদি 2019 এর হিসাবে অনেক আছে)
সমাধান 2: কার্নেল ম্যাক:
কার্নেল Macs- এর দ্বারা একটি ফায়ারওয়াল সবচেয়ে পরিচিত হিসাবে ব্যবহার করা যাবে Tomoyo , SELinux এবং Apparmor এই সমাধান সেরা এক যখন এটি স্থায়িত্ব এবং দক্ষতা (ফায়ারওয়াল সলিউশন) কিন্তু অধিকাংশ সময় এই একরকম জটিল সেটিং আসা।
সমাধান 3: ফায়ারজেল:
কোনও অ্যাপ্লিকেশনটির জন্য নেটওয়ার্ক অ্যাক্সেস ব্লক করতে ফায়ারজেল ব্যবহার করা যেতে পারে যার জন্য কোনও ব্যবহারকারী এটি থেকে উপকৃত হতে পারে মূলের প্রয়োজন হয় না
firejail --noprofile --net=none command-application
সমাধান 4: আনশেয়ার
আনশয়ারে নেটওয়ার্ক ছাড়াই আলাদা আলাদা নেমেসিসে অ্যাপ্লিকেশন শুরু করা যেতে পারে তবে এর জন্য রুট ফায়ারজেলের সমাধান প্রায় একই জিনিসটি করতে পারে তবে মূলের প্রয়োজন হয় না Un
unshare -r -n application-comand
সমাধান 5: প্রক্সিফাই:
একটি সমাধান হ'ল অ্যাপ্লিকেশনটি নাল / নকল প্রক্সিতে প্রক্সিফাই করা । আমরা tsocks বা প্রক্সিবাউন্ড ব্যবহার করতে পারেন । সেটআপ সম্পর্কে কিছু বিশদ এখানে
সমাধান 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
৪. এটি পরীক্ষা করে দেখুন, উদাহরণস্বরূপ ফায়ারফক্সে চালিয়ে:
no-internet "firefox"
৫. আপনি যদি একটি ব্যতিক্রম করতে চান এবং কোনও প্রোগ্রামকে স্থানীয় নেটওয়ার্ক অ্যাক্সেস করার অনুমতি দিতে চান :
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 নিয়ম প্রয়োগ করার একটি উপায় হ'ল নিয়মটি সিস্টেমড সহ একটি পরিষেবা হিসাবে যুক্ত করা
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
আপাতত ব্যবহার করছি ।
এটি আপনি কী ডিস্ট্রো ব্যবহার করছেন তার উপর নির্ভর করে তবে এটি একটি বৈশিষ্ট্য যা সাধারণত ওএস এর ম্যাক সিস্টেমে অন্তর্ভুক্ত থাকে। পূর্বে উল্লিখিত হিসাবে উবুন্টু বা সুসির অ্যাপআর্মার এটি করতে পারে। যদি আপনি আরএইচইএল ব্যবহার করে থাকেন তবে এক্সিকিউটিভ প্রক্রিয়াটির লেবেলের ভিত্তিতে কোনও নির্দিষ্ট বন্দর নম্বর অ্যাক্সেসের অনুমতি দিতে বা অস্বীকার করতে আপনি সেলইনাক্স কনফিগার করতে পারেন। কিছু দ্রুত গুগল করার পরে এটিই আমি খুঁজে পেলাম তবে অনলাইনে গভীরতার সংস্থানগুলিতে আরও বেশি থাকতে পারে যদি আপনি আরও কঠোর দেখেন এবং এটি আপনাকে সাধারণ ধারণা দেয়।
কিছু সিস্টেম কল ব্লক করতে আপনি সেকম্পম্প-বিপিএফ ব্যবহার করতে পারেন । উদাহরণস্বরূপ, সকেট এফডি তৈরি থেকে প্রক্রিয়াটি রোধ করার জন্য সিস্টেম কলটি ব্লক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);
এর জন্য মূল অধিকারের দরকার নেই।
একটি সম্পূর্ণ স্যান্ডবক্স তবে আরও জটিল তাই আপনার অসমর্থিত / দূষিত প্রোগ্রামগুলি ব্লক করার জন্য এই আন ক্রমটি ব্যবহার করা উচিত নয়।
আপনি "প্রক্সিচেইনস" নামে একটি কমান্ড লাইন প্রোগ্রাম ব্যবহার করতে পারেন এবং নিম্নলিখিত সম্ভাবনার একটি ব্যবহার করে দেখতে পারেন:
এটি ব্যবহার করুন যা এটি ব্যবহার করে ...
আমি নিজে এটি পরীক্ষা করে নিই তাই কাজ করে কিনা জানি না ...