本文提出了一種使用后保護集裝箱應(yīng)用程序的新方法。這種額外的保護稱為Seccomp-BPF。
許多企業(yè)使用容器作為管理和運行應(yīng)用程序的基本技術(shù)。如果經(jīng)常使用容器,很容易理解原因。換句話說,它提供了新級別的可移植性和可擴展性。但是,與其他新技術(shù)一樣,容器的采用意味著開發(fā)應(yīng)用程序的新方法。
根據(jù)容器配置的不同,使用中的應(yīng)用程序最終可能會傷害運行容器的主機。容器中還存在其他需要考慮的影響,包括作為環(huán)境變量存儲的潛在秘密和可以訪問的內(nèi)容。如果想進一步了解Docker容器安全最佳實踐,gitGuardian提供了有用的備忘錄。
經(jīng)驗證的軟件開發(fā)生命周期已經(jīng)包含漏洞掃描和軟件配置分析等安全流程,但需要更多的安全流程。大多數(shù)可用的應(yīng)用程序安全技術(shù)都是為了防止應(yīng)用程序受到攻擊而存在的,但不包括成功使用應(yīng)用程序時可能發(fā)生的損壞。為了解決這個問題,一直在研究保護和利用容器應(yīng)用程序的新方法。在這個軟件中,我將分享這個軟件是什么,以及如何無縫集成到已經(jīng)設(shè)置的句子開發(fā)過程中。我說的額外保護稱為Seccomp-BPF。在詳細知道如何使用之前,必須說明它是什么。
背景
我們在電腦上運行的程序嚴重依賴基本操作系統(tǒng),什么都做。打開文件和創(chuàng)建新進程等任務(wù)從現(xiàn)代編程語言中抽象出來,但在底部,代碼正在發(fā)出稱為系統(tǒng)調(diào)用(或系統(tǒng)調(diào)用)的內(nèi)核請求。系統(tǒng)調(diào)用對程序的執(zhí)行有多重要?嗯,在Linux內(nèi)核中可以使用大約400個系統(tǒng)調(diào)用,甚至基本的“Hello,World!”也有。用c語言編寫的程序有兩個:寫作和結(jié)束。
在所謂的“用戶空間”中運行的代碼不經(jīng)過內(nèi)核就不能執(zhí)行任何操作。最終,一些聰明的Linux內(nèi)核開發(fā)者決定利用這一事實創(chuàng)建強大的安全功能。2012年7月,Linux 3.5版增加了對Seccomp-BPF的支持。
Seccomp-BPF是Linux內(nèi)核功能,允許您創(chuàng)建特殊過濾器來限制進程可以執(zhí)行的系統(tǒng)調(diào)用。理論上,可以創(chuàng)建Seccomp-BPF過濾器,該過濾器接受只需要運行一個進程的準確系統(tǒng)調(diào)用。如果應(yīng)用程序被意外使用,以便對方能夠生成其他流程,則這很有用。如果進程不允許調(diào)用新系統(tǒng),Seccomp很可能會攔截攻擊者。
Seccomp非??幔€可以集成到容器運行時和編排工具(如Docker、Kubernetes)中。那是“為什么Seccomp沒有被廣泛使用?”提出問題。我認為,答案是,缺乏資源來填補Seccomp等低級內(nèi)核功能與現(xiàn)代軟件開發(fā)過程之間的差距。(約翰f肯尼迪,美國電視劇)并非所有組織都有對系統(tǒng)調(diào)用很熟悉的低級代碼開發(fā)者。此外,還必須確定程序所需的系統(tǒng)調(diào)用,并使用代碼中實現(xiàn)的每個新功能進行更新。
我在考慮如何解決這個問題,我想到了一個主意?!叭绻覀冊谶\行程序時記錄發(fā)送的系統(tǒng)調(diào)用,會發(fā)生什么?”“我在跟我的一個同事說我的想法。第二天,他發(fā)送了指向在GitHub上找到的工具的鏈接。Red Hat的一些人制作了OCI-seccomp-bpf-hook,這是一款完全滿足我需求的工具!
創(chuàng)建Seccomp-BPF過濾器
此工具oci-seccomp-bpf-hook用于Linux容器。OCI是指“開放容器發(fā)起”,是一組定義需要提供何種類型接口的容器運行時標準。與OCI兼容的容器運行時(例如Docker)提供了一種稱為“掛接”的機制,使您能夠在容器啟動之前和容器刪除后執(zhí)行代碼。比起解釋紅心的工具如何使用這個鉤子,演示似乎更明確。
Red Hatoci-seccomp-bpf-hook是為與容器運行時podman一起使用而開發(fā)的。Podman向后兼容Docker,因此如果使用過Docker,則我示例的語法看起來很熟悉。此外,除非源代碼安裝,否則OCI掛接當前僅在Red-Hat特定的DNF存儲庫中可用。為了使這個演示不那么復雜,我只用了一個Fedora服務(wù)器。(如果沒有Fedora環(huán)境,最好從Virtualbox和VMware等東西運行Fedora虛擬機。)
要開始使用,首先要做的是確保oci-seccomp-bpf-hook與podman一起安裝。為此,可以運行以下命令:
sudo dnf install pod man OCI-sec comp-bpf-hook
現(xiàn)在我們有了podman和OCI鉤子。我們終于可以深入了。
入研究如何生成 Seccomp-BPF 過濾器了。從自述文件中,語法是:sudo podman run --annotation io.con;if:[absolute path to the input file];of:[absolute path to the output file]" IMAGE COMMAND
讓我們ls在基本容器中運行命令并將輸出通過管道傳輸?shù)?dev/null. 當我們這樣做時,我們將記錄該ls命令發(fā)出的系統(tǒng)調(diào)用并將它們保存到/tm.
sudo podman run --annotation io.containers.trace-syscall=of:/tm fedora:35 ls / > /dev/null
由于我們將ls命令的輸出通過管道傳輸?shù)?dev/null,因此終端中應(yīng)該沒有輸出。但是,在命令完成后,我們可以查看保存系統(tǒng)調(diào)用的文件。在那里我們看到該命令確實有效,并且系統(tǒng)調(diào)用被捕獲:
cat /tm {"defaultAction":"SCMP_ACT_ERRNO","architectures":["SCMP_ARCH_X86_64"],"syscalls":[{"names":["access","arch_prctl","brk","capset","chdir","close","close_range","dup2","execve","exit_group","fchdir","fchown","fstatfs","getdents64","getegid","geteuid","getgid","getrandom","getuid","ioctl","lseek","mmap","mount","mprotect","munmap","newfstatat","openat","openat2","pivot_root","prctl","pread64","prlimit64","pselect6","read","rt_sigaction","rt_sigprocmask","seccomp","set_robust_list","set_tid_address","sethostname","setresgid","setresuid","setsid","statfs","statx","umask","umount2","write"],"action":"SCMP_ACT_ALLOW","args":[],"comment":"","includes":{},"excludes":{}}]}
這個文件是我們的 Seccomp 過濾器,我們現(xiàn)在可以將它與任何支持它的容器運行時一起使用。讓我們嘗試將過濾器與ls我們剛剛運行的相同容器化命令一起使用:
sudo podman run --security-opt seccomp=/tm fedora ls / > /dev/null
沒有輸出也沒有任何錯誤,表明該命令能夠在應(yīng)用了 Seccomp 過濾器的情況下成功運行。有趣的來了。我們將向容器添加一些在記錄系統(tǒng)調(diào)用時不存在的功能,以制作我們的 Seccomp 過濾器。我們要做的就是將-l標志添加到我們的ls命令中。
sudo podman run --security-opt seccomp=/tm fedora ls -l / > /dev/null ls: /: Operation not permitted ls: /proc: Operation not permitted ls: /root: Operation not permitted …
如您所見,我們現(xiàn)在收到一堆錯誤,告訴我們無法執(zhí)行命令嘗試執(zhí)行的某些操作。在-l我們的命令中添加標志為ls進程添加了一些新的系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用不在我們的 Seccomp 過濾器的允許列表中。如果我們使用該命令生成一個新的 Seccomp 過濾器ls -l,我們可以看到新過濾器有效,因為它現(xiàn)在具有所有必需的系統(tǒng)調(diào)用。
sudo podman run --annotation io.containers.trace-syscall=of:/tm fedora ls -l / > /dev/null sudo podman run --security-opt seccomp=/tm fedora ls -l / > /dev/null
如您所見,將 Seccomp 過濾器應(yīng)用于您的容器極大地限制了它的功能。在攻擊者可以利用您的應(yīng)用程序的情況下,它可能會阻止他們造成損害,甚至完全阻止利用。
通過使用 Red Hat 的 OCI 掛鉤,您不再需要深入了解 Linux 內(nèi)核的系統(tǒng)調(diào)用來創(chuàng)建 Seccomp 過濾器。您可以輕松地創(chuàng)建一個特定于應(yīng)用程序的過濾器,該過濾器不允許您的容器做任何超出它需要做的事情。這是彌合內(nèi)核特性和高級軟件開發(fā)之間差距的一大步。
結(jié)論
盡管如此,oci-seccomp-bpf-hook該工具本身并不能完全達到我將 Seccomp 集成到成熟的軟件工程工作流程中的期望。運行該工具仍然存在開銷,作為軟件開發(fā)人員,您不希望每次更新應(yīng)用程序都花時間手動更新 Seccomp 過濾器。為了彌合最后的差距并盡可能輕松地在企業(yè)應(yīng)用程序中使用 Seccomp,我們需要找到一種方法來自動生成 Seccomp-BPF 過濾器。幸運的是,當我們看到現(xiàn)代軟件開發(fā)是如何發(fā)生的時,已經(jīng)有一個完美的地方可以實現(xiàn)這種自動化:在 持續(xù)集成 (CI)期間。
CI 工作流已經(jīng)是成熟軟件開發(fā)生命周期中成熟的一部分。對于那些不熟悉 CI 的人,它使您能夠在每次將代碼提交到 git 存儲庫時執(zhí)行自動化單元測試和代碼安全掃描等操作。那里有很多 CI 工具,因此它是為您的容器化應(yīng)用程序自動生成 Seccomp 過濾器的理想場所。
這篇文章的時間已經(jīng)不多了,所以我將在另一篇文章中展示如何創(chuàng)建一個 CI 工作流程,每次更新代碼時都會生成一個 Seccomp 過濾器。然后,您最終將有能力利用 Seccomp 的系統(tǒng)調(diào)用限制并保護您的應(yīng)用程序!
1.《【oz9966sn怎么去保護】使用Seccomp過濾器保護容器》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【oz9966sn怎么去保護】使用Seccomp過濾器保護容器》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/why/3090123.html