
eBPF-संचालित सुरक्षा उपकरण जो Linux मशीनों को लॉक और ऑडिट करने के लिए है। यह कर्नेल सुविधाओं को प्रतिबंधित करता है, फ़ाइल रहित निष्पादन को रोकता है, मेमोरी की सुरक्षा करता है, और घोषणात्मक प्रोफाइल के माध्यम से कंटेनरों और IoT उपकरणों को कठोर बनाता है।

bpflock - लिनक्स मशीनों को लॉक करने और ऑडिट करने के लिए eBPF-संचालित सुरक्षा।
नोट: bpflock वर्तमान में प्रायोगिक चरण में है, यह टूट सकता है, विकल्प और सुरक्षा अर्थ बदल सकते हैं, कुछ BPF प्रोग्राम Cilium ebpf library का उपयोग करने के लिए अपडेट किए जाएंगे।
bpflock लिनक्स सुरक्षा को मजबूत करने के लिए eBPF का उपयोग करता है। लिनक्स सुविधाओं की एक विस्तृत श्रृंखला तक पहुंच को प्रतिबंधित करके, bpflock हमले की सतह को कम करने और कुछ प्रसिद्ध हमला तकनीकों को अवरुद्ध करने में सक्षम है।
केवल कंटेनर प्रबंधकों, systemd और अन्य कंटेनरों/प्रोग्रामों जैसे प्रोग्राम जो होस्ट pid and network namespaces में चलते हैं, को पूर्ण लिनक्स सुविधाओं तक पहुंच की अनुमति है; अपने स्वयं के नेमस्पेस में चलने वाले कंटेनर और एप्लिकेशन प्रतिबंधित होंगे।
यदि bpflock bpf प्रोग्राम restricted प्रोफ़ाइल के तहत चलते हैं तो विशेषाधिकार प्राप्त प्रोग्रामों सहित सभी प्रोग्रामों/कंटेनरों की पहुंच अस्वीकार कर दी जाएगी।
bpflock Linux Security Modules + BPF सहित कई सुरक्षा सुविधाओं का लाभ उठाकर लिनक्स मशीनों की सुरक्षा करता है।
वास्तुकला और सुरक्षा डिजाइन नोट:
bpflock अनेक सुरक्षा सुरक्षाएं प्रदान करता है जिन्हें निम्नानुसार वर्गीकृत किया जा सकता है:
फाइलसिस्टम सुरक्षा
नेटवर्क सुरक्षा
bpflock सुरक्षा अर्थशास्त्र को सरल रखता है। यह सुरक्षा स्पेक्ट्रम को व्यापक रूप से कवर करने और विशिष्ट लिनक्स सुविधाओं तक पहुंच को प्रतिबंधित करने के लिए तीन वैश्विक प्रोफ़ाइलों का समर्थन करता है।
profile: यह वैश्विक प्रोफ़ाइल है जिसे प्रति bpf प्रोग्राम लागू किया जा सकता है, यह निम्नलिखित में से एक लेता है:
allow|none|privileged : ये समान हैं, ये सबसे कम सुरक्षित प्रोफ़ाइल को परिभाषित करते हैं। इस प्रोफ़ाइल में सभी प्रक्रियाओं के लिए पहुंच लॉग और अनुमत है। सुरक्षा घटनाओं को लॉग करने के लिए उपयोगी।baseline : प्रतिबंधात्मक प्रोफ़ाइल जहां सभी प्रक्रियाओं के लिए पहुंच अस्वीकार कर दी गई है, सिवाय विशेषाधिकार प्राप्त एप्लिकेशन और कंटेनरों के जो होस्ट नेमस्पेस में चलते हैं, या bpflock_cgroupmap bpf मानचित्र में प्रति cgroup अनुमत प्रोफ़ाइलों के।restricted : भारी प्रतिबंधित प्रोफ़ाइल जहां सभी प्रक्रियाओं के लिए पहुंच अस्वीकार कर दी गई है।Allowed या blocked संचालन/आदेश:
allow|privileged या baseline प्रोफ़ाइलों के तहत, अनुमत या अवरुद्ध आदेशों की एक सूची निर्दिष्ट की जा सकती है और लागू की जाएगी।
--protection-allow : अनुमत संचालनों की अल्पविराम-पृथक सूची। यह baseline प्रोफ़ाइल के तहत मान्य है, यह उन एप्लिकेशनों के लिए उपयोगी है जो बहुत विशिष्ट हैं और विशेषाधिकार प्राप्त संचालन करते हैं। यह प्रोफ़ाइल के उपयोग को कम करेगा, ताकि प्रोफ़ाइल का उपयोग करने के बजाय, हम प्रोफ़ाइल निर्दिष्ट कर सकते हैं और ऐसे एप्लिकेशनों के लिए केस-दर-केस परिभाषा प्रदान करने के लिए अनुमत आदेशों का एक सेट जोड़ सकते हैं।bpf सुरक्षा उदाहरणों के लिए bpflock कॉन्फ़िगरेशन उदाहरण देखें।
bpflock को निम्नलिखित की आवश्यकता है:
निम्नलिखित कॉन्फ़िगरेशन के साथ लिनक्स कर्नेल संस्करण >= 5.13:
CONFIG_BPF_SYSCALL=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_KPROBES=y
CONFIG_LSM="...,bpf"
CONFIG_BPF_LSM=y
स्पष्ट रूप से BTF सक्षम कर्नेल।
यदि आपका कर्नेल CONFIG_BPF_LSM=y के साथ संकलित किया गया था, तो पुष्टि करने के लिए /boot/config-* देखें, लेकिन bpflock चलाने पर यह निम्नलिखित संदेश के साथ विफल होता है:
must have a kernel with 'CONFIG_BPF_LSM=y' 'CONFIG_LSM=\"...,bpf\"'"
फिर उबंटू पर उदाहरण के लिए BPF LSM सक्षम करने के लिए:
GRUB_CMDLINE_LINUX चर में जोड़ें और सहेजें।
"lsm=lockdown,capability,yama,apparmor,bpf"
GRUB_CMDLINE_LINUX="lsm=lockdown,capability,yama,apparmor,bpf"
sudo update-grub2
डिफ़ॉल्ट allow या privileged प्रोफ़ाइल (सबसे कम सुरक्षित प्रोफ़ाइल) का उपयोग करके चलाने के लिए:
docker run --name bpflock -it --rm --cgroupns=host \
--pid=host --privileged \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
फाइललेस बाइनरी निष्पादन को लॉग और प्रतिबंधित करने के लिए इसके साथ चलाएं:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_FILELESSLOCK_PROFILE=restricted" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
restricted प्रोफ़ाइल के तहत चलने पर, कंटेनर लॉग प्रदर्शित करेगा:
time="2022-02-04T14:54:33Z" level=info msg="event=syscall_execve tgid=1833 pid=1833 ppid=1671 uid=1000 cgroupid=8821 comm=loader pcomm=bash filename=./loader retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-04T14:54:33Z" level=info msg="event=lsm_bprm_creds_from_file tgid=1833 pid=1833 ppid=1671 uid=1000 cgroupid=8821 comm=loader pcomm=bash filename=memfd:memfd-test retval=-1 reason=denied (restricted)" bpfprog=filelesslock subsys=bpf
time="2022-02-04T14:54:33Z" level=info msg="event=syscall_execve tgid=1833 pid=1833 ppid=0 uid=1000 cgroupid=8821 comm= pcomm= filename=/proc/self/fd/3 retval=-1" bpfprog=execsnoop subsys=bpf
restricted प्रोफ़ाइल के तहत चलने से चीजें टूट सकती हैं, यही कारण है कि डिफ़ॉल्ट प्रोफ़ाइल allow है।
कर्नेल मॉड्यूल सुरक्षा लागू करने के लिए पर्यावरण चर BPFLOCK_KMODLOCK_PROFILE=baseline या BPFLOCK_KMODLOCK_PROFILE=restricted के साथ चलाएं:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_KMODLOCK_PROFILE=restricted" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
उदाहरण:
$ sudo unshare -p -n -f
# modprobe xfs
modprobe: ERROR: could not insert 'xfs': Operation not permitted
time="2022-02-07T06:50:25+01:00" level=info msg="event=syscall_execve tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=/usr/sbin/modprobe retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-07T06:50:25+01:00" level=info msg="event=lsm_kernel_read_file operation=loading module tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=xfs.ko retval=-1 reason=denied (restricted)" bpfprog=kmodlock subsys=bpf
कर्नेल इमेज लॉक-डाउन लागू करने के लिए पर्यावरण चर BPFLOCK_KIMGLOCK_PROFILE=baseline के साथ चलाएं:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_KIMGLOCK_PROFILE=baseline" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
$ sudo unshare -f -p -n bash
# head -c 1 /dev/mem
head: cannot open '/dev/mem' for reading: Operation not permitted
time="2022-02-07T06:57:22+01:00" level=info msg="event=syscall_execve tgid=52428 pid=52428 ppid=52288 uid=0 cgroupid=7014 comm=head pcomm=bash filename=/usr/bin/head retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-07T06:57:22+01:00" level=info msg="event=lsm_locked_down operation=/dev/mem,kmem,port tgid=52428 pid=52428 ppid=52288 uid=0 cgroupid=7014 comm=head pcomm=bash retval=-1 reason=denied (baseline)" bpfprog=kimglock subsys=bpf
BPF प्रतिबंध लागू करने के लिए पर्यावरण चर BPFLOCK_BPFRESTRICT_PROFILE=baseline या BPFLOCK_BPFRESTRICT_PROFILE=restricted के साथ चलाएं:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_BPFRESTRICT_PROFILE=baseline" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
अलग pid और नेटवर्क नेमस्पेस में चलाने और bpftool का उपयोग करने का उदाहरण:
$ sudo unshare -f -p -n bash
# bpftool prog
Error: can't get next program: Operation not permitted
time="2022-02-04T15:40:56Z" level=info msg="event=lsm_bpf tgid=2378 pid=2378 ppid=2364 uid=0 cgroupid=9458 comm=bpftool pcomm=bash filename= retval=-1 reason=baseline" bpfprog=bpfrestrict subsys=bpf
time="2022-02-04T15:40:56Z" level=info msg="event=lsm_bpf tgid=2378 pid=2378 ppid=2364 uid=0 cgroupid=9458 comm=bpftool pcomm=bash filename= retval=-1 reason=baseline" bpfprog=bpfrestrict subsys=bpf
-e "BPFLOCK_BPFRESTRICT_PROFILE=restricted" प्रोफ़ाइल के साथ चलाने पर सभी के लिए bpf अस्वीकार हो जाएगा:
time="2022-02-04T15:44:13Z" level=info msg="event=syscall_execve tgid=2500 pid=2500 ppid=2499 uid=0 cgroupid=9458 comm=bpftool pcomm=sudo filename=./tools/amd64/bpftool retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-04T15:44:13Z" level=info msg="event=lsm_bpf tgid=2500 pid=2500 ppid=2499 uid=0 cgroupid=9458 comm=bpftool pcomm=sudo filename= retval=-1 reason=denied (restricted)" bpfprog=bpfrestrict subsys=bpf
time="2022-02-04T15:44:13Z" level=info msg="event=lsm_bpf tgid=2500 pid=2500 ppid=2499 uid=0 cgroupid=9458 comm=bpftool pcomm=sudo filename= retval=-1 reason=denied (restricted)" bpfprog=bpfrestrict subsys=bpf
बाइंड माउंट के रूप में कॉन्फ़िगरेशन पास करना निम्नलिखित कमांड का उपयोग करके प्राप्त किया जा सकता है।
मान लें bpflock.yaml और bpf.d प्रोफ़ाइलें कॉन्फ़िग्स वर्तमान निर्देशिका के अंदर bpflock निर्देशिका में हैं, तो हम बस इसका उपयोग कर सकते हैं:
ls bpflock/
bpf.d bpflock.d bpflock.yaml
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-v $(pwd)/bpflock/:/etc/bpflock \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
पर्यावरण चर को फ़ाइलों का उपयोग करके --env-file के साथ भी पास किया जा सकता है। सभी पैरामीटर को BPFLOCK_$VARIABLE_NAME=VALUE प्रारूप का उपयोग करके पर्यावरण चर के रूप में पास किया जा सकता है।
फ़ाइल में पर्यावरण चर के साथ उदाहरण चलाएं:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
--env-file bpflock.env.list \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
दस्तावेज़ीकरण फ़ाइलें यहां पाई जा सकती हैं।
bpflock निर्माण के लिए docker BuildKit का उपयोग करता है और कुछ जांच और परीक्षण चलाने के लिए Golang का उपयोग करता है। bpflock उबंटू कंटेनर के अंदर बनाया गया है जो मानक गोलांग पैकेज डाउनलोड करता है।
bpflock डॉकर कंटेनर बनाने के लिए निम्नलिखित चलाएं:
git submodule update --init --recursive
make
Bpf प्रोग्राम libbpf का उपयोग करके बनाए जाते हैं। उपयोग की गई डॉकर इमेज उबंटू है।
यदि आप डॉकर का उपयोग किए बिना सीधे bpf प्रोग्राम बनाना चाहते हैं, तो उबंटू पर:
sudo apt install -y pkg-config bison binutils-dev build-essential \
flex libc6-dev clang-12 libllvm12 llvm-12-dev libclang-12-dev \
zlib1g-dev libelf-dev libfl-dev gcc-multilib zlib1g-dev \
libcap-dev libiberty-dev libbfd-dev
फिर चलाएं:
make bpf-programs
इस मामले में उत्पन्न प्रोग्राम ./bpf/build/... निर्देशिका के अंदर होंगे।
bpflock बहुत सारे संसाधनों का उपयोग करता है जिसमें Cilium और bcc प्रोजेक्ट्स का स्रोत कोड शामिल है।
bpflock यूज़र स्पेस घटक Apache License, Version 2.0 के तहत लाइसेंस प्राप्त हैं। जहां नोट किया गया है, BPF कोड General Public License, Version 2.0 के तहत लाइसेंस प्राप्त है।
allow | privilegedprivilegedbaseline--protection-block : अवरुद्ध संचालनों की अल्पविराम-पृथक सूची। यह allow|privileged और baseline प्रोफ़ाइलों के तहत मान्य है, यह पूर्ण restricted प्रोफ़ाइल का उपयोग किए बिना कुछ सुविधाओं तक पहुंच को प्रतिबंधित करने की अनुमति देता है जो कुछ विशिष्ट एप्लिकेशनों को तोड़ सकता है। baseline या privileged प्रोफ़ाइल का उपयोग करने से अधिकांश लिनक्स सुविधाओं तक पहुंच का द्वार खुल जाता है, लेकिन --protection-block विकल्प के साथ इस पहुंच में से कुछ को अवरुद्ध किया जा सकता है।