保證Docker代碼執(zhí)行程序安全性的最佳實(shí)踐
一、Docker 自身的基礎(chǔ)安全機(jī)制
雖然容器共享宿主機(jī)內(nèi)核,但 Docker 提供以下機(jī)制來(lái)隔離和限制容器行為:
安全機(jī)制 | 說(shuō)明 |
---|---|
Linux Namespace | 隔離進(jìn)程、文件系統(tǒng)、網(wǎng)絡(luò)、用戶、主機(jī)名等資源 |
cgroups(Control Groups) | 限制 CPU、內(nèi)存、IO 等資源使用 |
Mount 權(quán)限隔離 | 默認(rèn)容器無(wú)法掛載敏感目錄(如 /proc/kcore) |
AppArmor / SELinux | 限制容器對(duì)系統(tǒng)資源的訪問(wèn)權(quán)限 |
Seccomp 過(guò)濾器 | 限制容器可調(diào)用的 Linux 系統(tǒng)調(diào)用(syscall) |
Capabilities 限制 | 移除容器默認(rèn) root 權(quán)限能做的操作(如掛載、修改時(shí)間) |
只讀文件系統(tǒng) | 禁止容器寫(xiě)入宿主關(guān)鍵目錄 |
二、運(yùn)行用戶代碼時(shí)的“沙箱”強(qiáng)化手段
為了防止用戶代碼危害宿主機(jī)或其他服務(wù),需構(gòu)建更強(qiáng)的“代碼沙箱”環(huán)境。常見(jiàn)的強(qiáng)化措施如下:
1. 使用非 root 用戶運(yùn)行
在 Dockerfile
中指定普通用戶運(yùn)行:
RUN adduser -D sandboxuser USER sandboxuser
2. 啟用 seccomp、AppArmor 或 SELinux
例如:
docker run --security-opt seccomp=/path/to/custom.json ...
使用嚴(yán)格的系統(tǒng)調(diào)用白名單。
3. 只讀文件系統(tǒng)
防止容器代碼寫(xiě)入關(guān)鍵文件:
docker run --read-only ...
4. 資源限制
限制 CPU、內(nèi)存、防止拒絕服務(wù)攻擊(DoS):
docker run --memory=256m --cpus=0.5 ...
5. 限制網(wǎng)絡(luò)訪問(wèn)
避免用戶代碼“內(nèi)網(wǎng)掃描”:
docker run --network=none ...
或使用自定義網(wǎng)絡(luò)并設(shè)置隔離。
6. 運(yùn)行時(shí)間限制 + 自動(dòng)銷毀
使用工具如 timeout
、gvisor
、firecracker
限制代碼運(yùn)行時(shí)間,并在運(yùn)行后立即銷毀容器。
三、額外的安全防護(hù)工具(適合 SaaS 平臺(tái))
工具/技術(shù) | 作用 |
---|---|
gVisor | Google 開(kāi)源的用戶態(tài)內(nèi)核沙箱,完全隔離容器 syscalls |
Firecracker | AWS 用于 Lambda 的超輕虛擬化技術(shù)(基于 KVM) |
Docker seccomp profile | 最小化 syscall 訪問(wèn) |
AppArmor Profile | 針對(duì)容器制定詳細(xì)資源訪問(wèn)規(guī)則 |
Sysdig Falco | 容器運(yùn)行時(shí)入侵檢測(cè)和日志審計(jì) |
示例:運(yùn)行不可信代碼的安全配置
docker run \ --read-only \ --memory=256m \ --cpus=0.5 \ --user=sandbox \ --cap-drop=ALL \ --security-opt=no-new-privileges \ --network=none \ my/sandbox-image
高危行為(切記不要)
--privileged
:讓容器幾乎等同于宿主機(jī) rootmount host:/
:暴露宿主所有資源- 容器中運(yùn)行
curl
、wget
下載腳本執(zhí)行,未經(jīng)校驗(yàn)
總結(jié)一句話:
Docker 提供了基礎(chǔ)隔離機(jī)制,但不是天然安全沙箱,若運(yùn)行用戶上傳代碼,必須配合非 root 用戶、資源限制、網(wǎng)絡(luò)隔離、只讀 FS、系統(tǒng)調(diào)用過(guò)濾、運(yùn)行時(shí)沙箱(如 gVisor)等方式綜合防護(hù)。
- 1.超時(shí)控制:在向容器發(fā)送執(zhí)行命令時(shí),指定超時(shí)參數(shù),超時(shí)自動(dòng)中斷
- 2.資源限制:創(chuàng)建容器實(shí)例時(shí),通過(guò) HostConfig 指定分配的最大內(nèi)存和 CPU 占用
- 3.網(wǎng)絡(luò)限制:創(chuàng)建容器實(shí)例時(shí),通過(guò) withNetworkDisabled 方法禁用網(wǎng)絡(luò)
- 4.權(quán)限管理:通過(guò) seccomp 或者 Java 安全管理器,限制用戶代碼允許的操作和調(diào)用
以上就是保證Docker代碼執(zhí)行程序安全性的最佳實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于Docker代碼執(zhí)行程序安全性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker安裝redis并且設(shè)置密碼,以及進(jìn)入容器修改密碼方式
這篇文章主要介紹了Docker安裝redis并且設(shè)置密碼,以及進(jìn)入容器修改密碼方式,2024-01-01使用Docker部署openGauss國(guó)產(chǎn)數(shù)據(jù)庫(kù)的操作方法
openGauss是一款支持SQL2003標(biāo)準(zhǔn)語(yǔ)法,支持主備部署的高可用關(guān)系型數(shù)據(jù)庫(kù),這篇文章主要介紹了使用Docker部署openGauss國(guó)產(chǎn)數(shù)據(jù)庫(kù),需要的朋友可以參考下2022-10-10Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的詳細(xì)介紹
這篇文章主要介紹了Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的相關(guān)資料,文中介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-02-02docker搭建tomcat運(yùn)行環(huán)境的實(shí)現(xiàn)步驟
很多時(shí)候我們測(cè)試web系統(tǒng)需要一個(gè)tomcat運(yùn)行環(huán)境,這時(shí)docker就派上用場(chǎng)了,本篇文章主要介紹了docker搭建tomcat運(yùn)行環(huán)境的實(shí)現(xiàn)步驟,感興趣的可以了解一下2017-01-01淺談Docker consul的容器服務(wù)更新與發(fā)現(xiàn)
本文主要介紹了淺談Docker consul的容器服務(wù)更新與發(fā)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore的方法步驟
這篇文章主要介紹了Gogs+Jenkins+Docker 自動(dòng)化部署.NetCore,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06