這篇文章主要介紹“Docker中怎么啟用SELinux”,在日常操作中,相信很多人在Docker中怎么啟用SELinux問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Docker中怎么啟用SELinux”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)是專業(yè)的安慶網(wǎng)站建設(shè)公司,安慶接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行安慶網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
AppArmor 主要的作用是設(shè)置某個可執(zhí)行程序的訪問控制權(quán)限,可以限制程序 讀/寫某個目錄/文件,打開/讀/寫網(wǎng)絡(luò)端口等等。
Apparmor 的配置文件保存在/etc/apparmor.d/containers/目錄下
配置文件使用官方文檔下的 Nginx 配置實例
加載一個新的配置文件
$ sudo apparmor_parser -r -W /etc/apparmor.d/containers/docker-nginx
上傳新的配置文件
$ apparmor_parser -R /path/to/profile
在 Docker 里使用 AppArmor
$ docker run --security-opt "apparmor=docker-nginx" -p 80:80 -d --name apparmor-nginx nginx
配置步驟
在宿主機上啟用 SELinux,Docker 守護進程啟用 SELinux,默認啟動容器就開啟了 SELinux
[root@localhost selinux]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 31 [root@localhost selinux]# docker info ... init version: fec3683 Security Options: seccomp WARNING: You're not using the default seccomp profile Profile: /etc/docker/seccomp/default-no-chmod.json selinux userns Kernel Version: 3.10.0-1062.12.1.el7.x86_64 ...
測試,掛載宿主機/
目錄到容器的/hacking
目錄
[root@localhost selinux]# docker run -it --rm -v /:/hacking centos:latest /bin/sh sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700 Status: Downloaded newer image for centos:latest sh-4.4# cd / sh-4.4# ls bin dev etc hacking home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var sh-4.4# cd hacking/ sh-4.4# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var sh-4.4# cd var/log sh-4.4# ls ls: cannot open directory '.': Permission denied
運行參數(shù)可以選擇 SELinux 的級別,標簽包含 4 個部分User:Role:Type:level
,可以設(shè)置 SELinux 不同的標簽設(shè)定運行級別。
docker run --security-opt label=type:spc_t replicated docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bas docker run -it --security-opt label:disable alpine sh
標簽
[root@localhost ~]# ls /etc/selinux/targeted/contexts/files/ file_contexts file_contexts.homedirs file_contexts.subs media file_contexts.bin file_contexts.homedirs.bin file_contexts.subs_dist [root@localhost ~]# cat /etc/selinux/targeted/contexts/files/file_contexts
Linux內(nèi)核能夠?qū)oot用戶的特權(quán)分解為稱為功能的不同單元。例如,CAP_CHOWN功能允許root用戶對文件UID和GID進行任意更改。CAP_DAC_OVERRIDE功能允許root用戶繞過文件讀取,寫入和執(zhí)行操作的內(nèi)核權(quán)限檢查。與Linux root用戶相關(guān)的幾乎所有特殊功能都分解為單獨的功能。
更細粒度的功能限制可以:
從 root 用戶帳戶中刪除單個功能,使其功能/危險性降低。
以非常精細的級別向非root用戶添加特權(quán)。
功能適用于文件和線程。文件功能允許用戶以更高的特權(quán)執(zhí)行程序。這類似于setuid位的工作方式。線程功能跟蹤正在運行的程序中功能的當前狀態(tài)。
默認情況下,Docker使用白名單方法刪除除所需功能之外的所有功能。
啟動命令
docker run --rm -it --cap-drop $CAP alpine sh docker run --rm -it --cap-add $CAP alpine sh docker run --rm -it --cap-drop ALL --cap-add $CAP alpine sh
$CAP 包含http://man7.org/linux/man-pages/man7/capabilities.7.html,在 Linux 接近40項的 Capabilities 中,Docker為了確保容器的安全,僅僅支持了其中的14項基本的 Capabilities:CAP_CHOWN、CAP_DAC_OVERRIDE、CAP_FSETID、CAP_MKNOD、FOWNER、NET_RAW、SETGID、SETUID、SETFCAP、SETPCAP、NET_BIND_SERVICE、SYS_CHROOT、KILL和AUDIT_WRITE。
測試命令
$ docker container run --rm -it alpine chown nobody / $ docker container run --rm -it --cap-drop ALL --cap-add CHOWN alpine chown nobody / $ docker container run --rm -it --cap-drop CHOWN alpine chown nobody / $ docker container run --rm -it --cap-add chown -u nobody alpine chown nobody /
特權(quán)模式參數(shù)--privileged,運行特權(quán)容器時允許容器內(nèi)用戶直接訪問宿主機的資源,因此通過濫用特權(quán)容器,攻擊者可以獲取宿主機資源的訪問權(quán)限。特權(quán)容器產(chǎn)生后,由于增強權(quán)限的許多,攻擊者可能會以root權(quán)限運行代碼。這表明攻擊者可以以root權(quán)限運行主機,包括CAP_SYS_ADMIN。
攻擊者在獲取了暴露的特權(quán)容器訪問權(quán)限后,就可以進一步發(fā)起很多攻擊活動。攻擊者可以識別出主機上運行的軟件,并找出和利用相關(guān)漏洞。還可以利用容器軟件漏洞或錯誤配置,比如使用弱憑證或沒有認證的容器。由于攻擊者有root訪問權(quán)限,因此惡意代碼或挖礦機都可以執(zhí)行并有效地隱藏。
測試
創(chuàng)建容器:
docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init
進入容器:
docker exec -it centos7 /bin/bash
含義如下:
進程可以在內(nèi)核中設(shè)置no_new_privs位,該位在fork,clone和exec之間持續(xù)存在。
no_new_privs位可確保該進程或其子進程不會獲得任何其他特權(quán)。
設(shè)置no_new_privs位后,該進程將無法取消設(shè)置。
即使進程使用設(shè)置了文件功能位的setuid二進制文件或可執(zhí)行文件執(zhí)行,也不允許帶有no_new_privs的進程更改uid / gid或獲得任何其他功能。
no_new_privs還可以防止SELinux之類的Linux安全模塊(LSM)過渡到不允許訪問當前進程的進程標簽。這意味著SELinux進程僅允許轉(zhuǎn)換為具有較少特權(quán)的進程類型。
testnnp.c,打印 uid 信息
#include#include #include int main(int argc, char *argv[]) { printf("Effective uid: %d\n", geteuid()); return 0; }
編譯
[root@localhost ~]# make testnnp cc testnnp.c -o testnnp
制作鏡像,dockerfile
FROM fedora:latest ADD testnnp /root/testnnp RUN chmod +s /root/testnnp ENTRYPOINT /root/testnn
制作測試鏡像
[root@localhost ~]# docker build -t testnnp .
測試
# docker run -it --rm --user=1000 testnnp
使用no-new-privileges
# docker run -it --rm --user=1000 --security-opt=no-new-privileges testnnp
不使用--cgroup-parent選項 ,控制組 CGroups 是 Linux 內(nèi)核的另一個重要特性,主要用來實現(xiàn)對資源的限制和審計等.
控制組(cgroup)是Linux內(nèi)核的一項功能,可讓您限制訪問進程和容器對系統(tǒng)資源(如CPU,RAM,IOPS和網(wǎng)絡(luò))的訪問權(quán)限。
$ docker run -d –name='low_prio' –cpuset-cpus=0 –cpu-shares=20 busybox md5sum /dev/urandom
前面講 docker 守護進程安全時,說過 seccomp 是組內(nèi)核安全策略,不同的策略有不同的名稱,可以在 docker 運行時指定使用的安全策略,而不是使用 docker 守護進程設(shè)置的默認策略。seccomp=unconfined表示不啟用 seccomp,下面是不建議的啟動命令。
$ docker container run --rm -it --security-opt seccomp=unconfined debian:jessie sh
指定 sccomp
$ docker run --rm -it --security-opt seccomp=default-no-chmod.json alpine sh
包括:
/
/boot
/dev
/etc
/lib
/proc
/sys
/usr
使用--read-only會限制運行容器的跟目錄為只讀
[root@localhost ~]# docker run -it --read-only 72300a873c2c /bin/bash root@f077b480dbe5:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@f077b480dbe5:/# touch 111 touch: cannot touch '111': Read-only file system
如果需要掛載的目錄有讀寫權(quán)限可以使用更細的權(quán)限控制,如掛載特定目錄有讀寫權(quán)限。
docker run --interactive --tty --read-only -v /opt/app/data:/run/app/data:rw centos /bin/bash
安裝Docker之后,Docker守護進程會監(jiān)聽Unix域套接字:/var/run/docker.sock。
下面的命令用于運行容器,并采用交互模式(interactive mode,該模式下會直接進入容器內(nèi)),同時綁定docker.sock。
# docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh
綁定Docker套接字之后,容器的權(quán)限會很高,可以控制Docker守護進程。
不使用--volume=/hostPath:/containerPath:shared的配置
# docker run--volume=/hostPath:/containerPath:shared
避免容器內(nèi)用戶直接修改設(shè)備信息。
docker run --interactive --tty --device=/dev/tty0:/dev/tty0:rw --device=/dev/temp_sda:/dev/temp_sda:r centos bash
通過在docker run命令中使用--restart標志,您可以指定重啟策略,以指定容器在啟動失敗時應(yīng)如何重啟。 您應(yīng)該選擇onfailure重新啟動策略,并將重新啟動嘗試限制為5次。
如果無限期地嘗試啟動容器,則可能導(dǎo)致宿主機上的拒絕服務(wù),尤其是在同一主機上有多個容器的情況下。 此外,忽略容器的退出狀態(tài)并始終嘗試重新啟動容器,會導(dǎo)致無法調(diào)查導(dǎo)致容器終止的根本原因。 如果某個容器被終止,則應(yīng)調(diào)查其背后的原因,而不僅僅是嘗試無限期地重新啟動它。 應(yīng)該使用失敗時重新啟動策略將容器重新啟動的次數(shù)限制為最多5次嘗試。
docker run --detach --restart=on-failure:5 nginx
--net=hostHost模式并沒有為容器創(chuàng)建一個隔離的網(wǎng)絡(luò)環(huán)境,該模式下的 Docker 容器會和 host 宿主機共享同一個網(wǎng)絡(luò) namespace,所以容器可以和宿主機一樣,使用宿主機的eth0,實現(xiàn)和外界的通信,特點:
這種模式下的容器沒有隔離的network namespace
容器的 IP 地址同 Docker主機的 IP 地址
要注意容器中服務(wù)的端口號不能與Docker主機上已經(jīng)使用的端口號相沖突
host模式能夠和其它模式共存
默認下,所有的容器都啟用了PID命名空間。PID命名空間提供了進程的分離。PID命名空間刪除系統(tǒng)進程視圖,允許進程ID可重用,包括pid 1。
在一些情況下需要容器共享主機進程命名空間,基本上允許容器內(nèi)的進程可以查看主機的所有進程。例如,構(gòu)建了一個帶調(diào)試工具容器,想在容器使用這些工具來調(diào)試主機的進程。
如果使用--pid=host參數(shù),容器可以直接操作宿主機上的數(shù)據(jù)。如果 dockerd 守護進程設(shè)置了用戶命名空間映射,運行容器時使用該參數(shù)會導(dǎo)致啟動失敗。
docker run --interactive --tty --pid=host centos /bin/bash
--ipc=host
進程與單個"管理程"進程共享內(nèi)存,以便交換數(shù)據(jù)( 通過使用共享緩沖區(qū)) 。 這個解決方案是為了性能需求實現(xiàn)的。 --ipc=MODE
:設(shè)置容器的IPC模式,shareable
自己的私有IPC名稱空間,可以與其他容器共享。host
:使用主機系統(tǒng)的IPC名稱空間。
禁止使用host
模式,下面是錯誤的示例:
docker run --interactive --tty --ipc=host centos /bin/bash
可以與其他容器使用共享 IPC
docker run --ipc=container:docker run -d --ipc=shareable data-server docker run -d --ipc=container:data-server data-client
UTS命名空間用于設(shè)置主機名和對該命名空間中正在運行的進程可見的域。默認下,所有的容器,包括那么以--network=host運行的容器,有它們自己的UTS命名空間。設(shè)置UTS為host將使容器使用與主機相同的UTS命名空間。注意--hostname在host UTS模式是無效的。
當你想在主機更改hostname之后,同時也更改同樣的hostname到容器。
默認情況下,Docker守護程序以root身份運行。 這使守護程序可以創(chuàng)建并使用啟動容器所需的內(nèi)核結(jié)構(gòu)。 但是,它也存在潛在的安全風(fēng)險。
默認的容器以 root 賬號運行
# docker run --rm alpine id # docker run --rm --user 1000:1000 alpine id # docker run --rm --privileged --userns=host alpine id
常用于限制 CPU 和內(nèi)存的參數(shù)
-c --cpu-shares參數(shù)只能限制容器使用 CPU 的比例
--cpus后面跟著一個浮點數(shù),代表容器最多使用的核數(shù),可以精確到小數(shù)點二位,也就是說容器最小可以使用 0.01 核 CPU
-m --memory:容器能使用的最大內(nèi)存大小,最小值為 4m
--memory-swap:容器能夠使用的 swap 大小
docker 守護進程可以配置默認的限制,必要時可以使用 docker run 命令覆蓋的默認
# docker run --ulimit nofile=1024:1024 --interactive --tty centos /bin/bash
使用PID cgroup參數(shù)--pids-limit可以通過限制在指定時間范圍內(nèi)容器內(nèi)部可能創(chuàng)建的進程數(shù)量來防止邏輯**類的攻擊。
# docker run -it --pids-limit 100
用于檢查容器的運行狀態(tài)
# docker run -d --name db --health-cmd "curl --fail http://localhost:8091/pools || exit 1" --health-interval=5s --timeout=3s arungupta/couchbase
指定映射到宿主機上特定網(wǎng)絡(luò)端口:
docker run --detach --publish 10.2.3.4:49153:80 nginx
Docker將以橋接模式創(chuàng)建的虛擬接口連接到名為docker0的通用橋接。 此默認網(wǎng)絡(luò)模型容易受到ARP欺騙和MAC泛洪攻擊,因為沒有對其應(yīng)用過濾。
實際網(wǎng)絡(luò)通常以編排系統(tǒng)的網(wǎng)絡(luò)進行配置。
低于 1024 的端口通常用于系統(tǒng)服務(wù),使用低于 1024 的端口可能與宿主機服務(wù)產(chǎn)生沖突,80 和 443 除外,容器服務(wù)對外映射端口應(yīng)該只映射必須開放的端口。
使用最新版本的鏡像避免引入漏洞。
如 SSH、Telnet 或者其他不需要的組件或服務(wù)。
在docker exec命令中使用--privileged選項可為命令提供擴展的Linux功能。
在docker exec命令中使用--user=root選項,會以root用戶身份在容器內(nèi)執(zhí)行命令。 例如,如果容器以tomcat用戶(或任何其他非root用戶)身份運行,則可以使用--user=root選項通過docker exec以root身份運行命令。
[OPTIONS] | 參數(shù)說明: |
---|---|
--add-host list | 添加自定義主機到ip映射(書寫格式為:主機:ip) |
-a, --attach list | 附加到STDIN、STDOUT或STDERR上 |
--blkio-weight uint16 | Block IO (相對權(quán)重),取值10到1000之間,0為禁用(默認0) |
--blkio-weight-device list | Block IO weight (相對于設(shè)備的權(quán)重) (默認為數(shù)組的形式) |
--cap-add list | 添加Linux功能 |
--cap-drop list | 刪除Linux功能 |
--cgroup-parent string | 容器的可選父級對照組項 |
--cidfile string | 將容器ID寫入文件 |
--cpu-period int | 限制CPU CFS(完全公平調(diào)度程序)周期 |
--cpu-quota int | 限制CPU CFS(完全公平的調(diào)度程序)上限 |
--cpu-rt-period int | 限制CPU運行時周期(以微秒為單位) |
--cpu-rt-runtime int | 限制CPU實時運行時間(以微秒為單位) |
-c, --cpu-shares int | CPU 共享 (相對權(quán)重的設(shè)定) |
--cpus decimal | 設(shè)定cpu的數(shù)量 |
--cpuset-cpus string | 允許執(zhí)行的cpu (0-3,0,1) |
--cpuset-mems string | 允許執(zhí)行的MEMs (0-3,0,1) |
-d, --detach | 在后臺運行容器并打印容器ID |
--detach-keys string | 覆蓋分離容器的鍵序列 |
--device list | 向容器添加主機設(shè)備 |
--device-cgroup-rule list | 向 cgroup 允許的設(shè)備列表中添加一個或多個規(guī)則 |
--device-read-bps list | 限定設(shè)備的讀取速率(單位: byte/s)(默認為 []) |
--device-read-iops list | 限定設(shè)備的讀取速率(單位:IO/s)(默認為 []) |
--device-write-bps list | 限定設(shè)備的寫入速率(單位: byte/s)(默認為 []) |
--device-write-iops list | 限定設(shè)備的寫入速率(單位:IO/s)(默認為 []) |
--disable-content-trust | 跳過鏡像驗證(默認為 true) |
--DNS list | 設(shè)置自定義DNS服務(wù)器 |
--dns-option list | 設(shè)置DNS選項 |
--dns-search list | 設(shè)置自定義的DNS搜索域 |
--entrypoint string | 覆蓋鏡像的默認入口點 |
-e, --env list | 設(shè)置環(huán)境變量 |
--env-file list | 讀取環(huán)境變量內(nèi)容 |
--expose list | 公開一個端口或多個端口 |
--group-add list | 添加其他要加入的組 |
--health-cmd string | 命令運行以檢查健康 |
--health-interval duration | 運行檢查之間的時間(ms |
--health-retries int | 連續(xù)的失敗需要報告不健康 |
--health-start-period duration | 啟動健康重試倒計時前容器初始化的啟動周期(ms |
--health-timeout duration | 健康檢查運行情況的最大時間值 格式為:(ms |
--help | 打印出使用情況 |
-h, --hostname string | 定義容器主機名 |
--init | 在容器中運行初始化,以轉(zhuǎn)發(fā)信號并獲取進程 |
-i, --interactive | 即使沒有連接,也保持STDIN開放 |
--ip string | 設(shè)定容器的 IPv4 地址 (例如,192.168.155.139) |
--ip6 string | 設(shè)定IPv6地址(例如,2001:db8::33) |
--ipc string | 使用IPC模式 |
--isolation string | 容器隔離技術(shù) |
--kernel-memory bytes | 內(nèi)核內(nèi)存限制 |
-l, --label list | 在容器上設(shè)置元數(shù)據(jù) |
--label-file list | 在以行分隔的標簽文件中讀取 |
--link list | 向另一個容器添加鏈接 |
--link-local-ip list | 容器 IPv4/IPv6 鏈接本地地址 |
--log-driver string | 設(shè)定容器的日志驅(qū)動 |
--log-opt list | 設(shè)定日志驅(qū)動器選項 |
--mac-address string | 配置容器MAC地址(例如,92:d0:c6:0a:29:33) |
-m, --memory bytes | 設(shè)定內(nèi)存限額 |
--memory-reservation bytes | 內(nèi)存軟限制 |
--memory-swap bytes | 交換限制等于內(nèi)存加上交換:'-1',以啟用無限交換 |
--memory-swappiness int | 優(yōu)化容器內(nèi)存交換 (0 到 100) (默認為 -1) |
--mount mount | 將文件系統(tǒng)掛載附加到容器 |
--name string | 為容器指定一個名稱 |
--network string | 將容器連接到網(wǎng)絡(luò) |
--network-alias list | 為容器連接的網(wǎng)絡(luò)添加別名 |
--no-healthcheck | 禁止任何容器指定 HEALTHCHECK |
--oom-kill-disable | 禁止OOM事件被殺死 |
--oom-score-adj int | 優(yōu)化主機的OOM事件 ,參數(shù)范圍 (-1000 到 1000) |
--pid string | 設(shè)定PID命名 |
--pids-limit int | 優(yōu)化容器pid限制(如果設(shè)置-1則為無限制) |
--privileged | 賦予容器擴展的權(quán)限 |
-p, --publish list | 將容器的端口發(fā)布到主機 |
-P, --publish-all | 將所有公開的端口發(fā)布到隨機端口 |
--read-only | 將容器的根文件系統(tǒng)掛載為只讀(后面會詳細講到) |
--restart string | 配置容器的重啟策略,當容器退出時重新啟動(默認為“no”) |
--rm | 當容器退出時自動移除這個容器 |
--runtime string | 使用容器的運行時 |
--security-opt list | 指定docker啟動的安全項 |
--shm-size bytes | /dev/shm 的大?。ㄟ@個可以使其容量進行動態(tài)的擴展) |
--sig-proxy | 設(shè)置代理接收京城信號 (默認為 true) |
--stop-signal string | 停止容器的信號 (默認為 "SIGTERM") |
--stop-timeout int | 設(shè)置超時停止容器(以秒為單位) |
--storage-opt list | 設(shè)定容器的存儲驅(qū)動程序選項 |
--sysctl map | 指定系統(tǒng)控制項 (默認為 map[] 的格式) |
--tmpfs list | 掛載tmpfs目錄 |
-t, --tty | 為當前容器分配一個客戶端 |
--ulimit ulimit | 啟動需要限制的項(默認為數(shù)組的形式) |
-u, --user string | 用戶名或UID(格式為: |
--userns string | 使用用戶名稱空間 |
--uts string | 使用UTS名稱空間 |
-v, --volume list | 綁定安裝卷(關(guān)于容器卷,在Docker容器數(shù)據(jù)卷中會具體的講解) |
--volume-driver string | 容器的可選卷驅(qū)動程序 |
--volumes-from list | 指定容器裝載卷 |
-w, --workdir string | 容器內(nèi)的工作目錄 |
到此,關(guān)于“Docker中怎么啟用SELinux”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站名稱:Docker中怎么啟用SELinux
網(wǎng)頁URL:http://weahome.cn/article/jiciip.html