亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker中怎么啟用SELinux

發布時間:2021-12-13 15:42:37 來源:億速云 閱讀:521 作者:iii 欄目:網絡安全

這篇文章主要介紹“Docker中怎么啟用SELinux”,在日常操作中,相信很多人在Docker中怎么啟用SELinux問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Docker中怎么啟用SELinux”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、docker run 語法

語法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

二、 Docker 運行安全相關參數

2.1 啟用 AppArmor

AppArmor 主要的作用是設置某個可執行程序的訪問控制權限,可以限制程序 讀/寫某個目錄/文件,打開/讀/寫網絡端口等等。

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

2.2 啟用 SELinux

配置步驟

在宿主機上啟用 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

運行參數可以選擇 SELinux 的級別,標簽包含 4 個部分User:Role:Type:level,可以設置 SELinux 不同的標簽設定運行級別。

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

2.3 限制運行容器的內核功能

Linux內核能夠將root用戶的特權分解為稱為功能的不同單元。例如,CAP_CHOWN功能允許root用戶對文件UID和GID進行任意更改。CAP_DAC_OVERRIDE功能允許root用戶繞過文件讀取,寫入和執行操作的內核權限檢查。與Linux root用戶相關的幾乎所有特殊功能都分解為單獨的功能。

更細粒度的功能限制可以:

從 root 用戶帳戶中刪除單個功能,使其功能/危險性降低。

以非常精細的級別向非root用戶添加特權。

功能適用于文件和線程。文件功能允許用戶以更高的特權執行程序。這類似于setuid位的工作方式。線程功能跟蹤正在運行的程序中功能的當前狀態。

默認情況下,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 /

2.4 不使用特權模式運行容器

特權模式參數--privileged,運行特權容器時允許容器內用戶直接訪問宿主機的資源,因此通過濫用特權容器,攻擊者可以獲取宿主機資源的訪問權限。特權容器產生后,由于增強權限的許多,攻擊者可能會以root權限運行代碼。這表明攻擊者可以以root權限運行主機,包括CAP_SYS_ADMIN。

攻擊者在獲取了暴露的特權容器訪問權限后,就可以進一步發起很多攻擊活動。攻擊者可以識別出主機上運行的軟件,并找出和利用相關漏洞。還可以利用容器軟件漏洞或錯誤配置,比如使用弱憑證或沒有認證的容器。由于攻擊者有root訪問權限,因此惡意代碼或挖礦機都可以執行并有效地隱藏。

測試

創建容器:

docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init

進入容器:

docker exec -it centos7 /bin/bash

2.5 限制容器獲取新的特權,使用--security-opt=no-new-privileges

含義如下:

進程可以在內核中設置no_new_privs位,該位在fork,clone和exec之間持續存在。

no_new_privs位可確保該進程或其子進程不會獲得任何其他特權。

設置no_new_privs位后,該進程將無法取消設置。

即使進程使用設置了文件功能位的setuid二進制文件或可執行文件執行,也不允許帶有no_new_privs的進程更改uid / gid或獲得任何其他功能。

no_new_privs還可以防止SELinux之類的Linux安全模塊(LSM)過渡到不允許訪問當前進程的進程標簽。這意味著SELinux進程僅允許轉換為具有較少特權的進程類型。

testnnp.c,打印 uid 信息

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

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

2.6 使用 cgroup 確保容器在定義的 cgroup 中運行

不使用--cgroup-parent選項 ,控制組 CGroups 是 Linux 內核的另一個重要特性,主要用來實現對資源的限制和審計等.

Docker中怎么啟用SELinux

控制組(cgroup)是Linux內核的一項功能,可讓您限制訪問進程和容器對系統資源(如CPU,RAM,IOPS和網絡)的訪問權限。

$ docker run -d –name='low_prio' –cpuset-cpus=0 –cpu-shares=20 busybox md5sum /dev/urandom

2.7 啟用 seccomp

前面講 docker 守護進程安全時,說過 seccomp 是組內核安全策略,不同的策略有不同的名稱,可以在 docker 運行時指定使用的安全策略,而不是使用 docker 守護進程設置的默認策略。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

2.8 運行容器不掛載主機的系統分區

包括:

/

/boot

/dev

/etc

/lib

/proc

/sys

/usr    

2.9 容器根目錄以只讀方式掛載--read-only

使用--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

如果需要掛載的目錄有讀寫權限可以使用更細的權限控制,如掛載特定目錄有讀寫權限。

docker run --interactive --tty --read-only -v /opt/app/data:/run/app/data:rw centos /bin/bash

2.10 不掛載宿主機的docker.sock到任何容器

Docker中怎么啟用SELinux

安裝Docker之后,Docker守護進程會監聽Unix域套接字:/var/run/docker.sock。

下面的命令用于運行容器,并采用交互模式(interactive mode,該模式下會直接進入容器內),同時綁定docker.sock。

# docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh

綁定Docker套接字之后,容器的權限會很高,可以控制Docker守護進程。

2.11 不使用共享的掛載傳播模式

不使用--volume=/hostPath:/containerPath:shared的配置

# docker run <Run arguments> --volume=/hostPath:/containerPath:shared <Container Image Name or ID> <Command>

2.12 不要直接掛載主機設備,如果需要,設置成只讀

避免容器內用戶直接修改設備信息。

docker run --interactive --tty --device=/dev/tty0:/dev/tty0:rw --device=/dev/temp_sda:/dev/temp_sda:r centos bash

2.13 on-failure容器重啟策略設置為 5

通過在docker run命令中使用--restart標志,您可以指定重啟策略,以指定容器在啟動失敗時應如何重啟。 您應該選擇onfailure重新啟動策略,并將重新啟動嘗試限制為5次。

如果無限期地嘗試啟動容器,則可能導致宿主機上的拒絕服務,尤其是在同一主機上有多個容器的情況下。 此外,忽略容器的退出狀態并始終嘗試重新啟動容器,會導致無法調查導致容器終止的根本原因。 如果某個容器被終止,則應調查其背后的原因,而不僅僅是嘗試無限期地重新啟動它。 應該使用失敗時重新啟動策略將容器重新啟動的次數限制為最多5次嘗試。

docker run --detach --restart=on-failure:5 nginx

2.14 不使用網絡空間共享

--net=hostHost模式并沒有為容器創建一個隔離的網絡環境,該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,所以容器可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信,特點:

這種模式下的容器沒有隔離的network namespace

容器的 IP 地址同 Docker主機的 IP 地址

要注意容器中服務的端口號不能與Docker主機上已經使用的端口號相沖突

host模式能夠和其它模式共存

2.15 主機進程命名空間不共享,禁用--pid=host

默認下,所有的容器都啟用了PID命名空間。PID命名空間提供了進程的分離。PID命名空間刪除系統進程視圖,允許進程ID可重用,包括pid 1。

在一些情況下需要容器共享主機進程命名空間,基本上允許容器內的進程可以查看主機的所有進程。例如,構建了一個帶調試工具容器,想在容器使用這些工具來調試主機的進程。

如果使用--pid=host參數,容器可以直接操作宿主機上的數據。如果 dockerd 守護進程設置了用戶命名空間映射,運行容器時使用該參數會導致啟動失敗。

docker run --interactive --tty --pid=host centos /bin/bash

2.16 主機 IPC 命名空間不共享,禁用--ipc=host

進程與單個"管理程"進程共享內存,以便交換數據( 通過使用共享緩沖區) 。 這個解決方案是為了性能需求實現的。    
--ipc=MODE:設置容器的IPC模式,shareable自己的私有IPC名稱空間,可以與其他容器共享。host:使用主機系統的IPC名稱空間。

禁止使用host模式,下面是錯誤的示例:

docker run --interactive --tty --ipc=host centos /bin/bash

可以與其他容器使用共享 IPC

docker run --ipc=container:<id> <image>
docker run -d --ipc=shareable data-server
docker run -d --ipc=container:data-server data-client

2.17 不共享主機 UTS 命名空間,禁用--uts=host

UTS命名空間用于設置主機名和對該命名空間中正在運行的進程可見的域。默認下,所有的容器,包括那么以--network=host運行的容器,有它們自己的UTS命名空間。設置UTS為host將使容器使用與主機相同的UTS命名空間。注意--hostname在host UTS模式是無效的。

當你想在主機更改hostname之后,同時也更改同樣的hostname到容器。

2.18 不共享主機用戶命名空間,禁用--users=host

默認情況下,Docker守護程序以root身份運行。 這使守護程序可以創建并使用啟動容器所需的內核結構。 但是,它也存在潛在的安全風險。

默認的容器以 root 賬號運行

# docker run --rm alpine id

# docker run --rm --user 1000:1000 alpine id

# docker run --rm --privileged --userns=host alpine id

2.19 限制容器運行時占用內存和 CPU

常用于限制 CPU 和內存的參數

-c --cpu-shares參數只能限制容器使用 CPU 的比例

--cpus后面跟著一個浮點數,代表容器最多使用的核數,可以精確到小數點二位,也就是說容器最小可以使用 0.01 核 CPU

-m --memory:容器能使用的最大內存大小,最小值為 4m

--memory-swap:容器能夠使用的 swap 大小

2.20 必要時 Docker 運行覆蓋默認的ulimit

docker 守護進程可以配置默認的限制,必要時可以使用 docker run 命令覆蓋的默認

# docker run --ulimit nofile=1024:1024 --interactive --tty centos /bin/bash

2.21 使用--pids-limit限制指定時間內生成的進程數

使用PID cgroup參數--pids-limit可以通過限制在指定時間范圍內容器內部可能創建的進程數量來防止邏輯**類的攻擊。

# docker run -it --pids-limit 100 <Image_ID>

2.22 運行時檢查容器運行狀態,使用--health-cmd參數

用于檢查容器的運行狀態

# docker run -d --name db --health-cmd "curl --fail http://localhost:8091/pools || exit 1" --health-interval=5s --timeout=3s arungupta/couchbase

2.23 傳入容器的流量綁定特定的宿主機端口

指定映射到宿主機上特定網絡端口:

docker run --detach --publish 10.2.3.4:49153:80 nginx

2.24 不使用 docker 默認的橋接網絡 docker0

Docker將以橋接模式創建的虛擬接口連接到名為docker0的通用橋接。 此默認網絡模型容易受到ARP欺騙和MAC泛洪攻擊,因為沒有對其應用過濾。

實際網絡通常以編排系統的網絡進行配置。

2.25 使用大于 1024 的端口,容器只映射必須使用的端口

低于 1024 的端口通常用于系統服務,使用低于 1024 的端口可能與宿主機服務產生沖突,80 和 443 除外,容器服務對外映射端口應該只映射必須開放的端口。

2.26 確保Docker命令始終使用其映像的最新版本

使用最新版本的鏡像避免引入漏洞。

2.27 使用最小化的容器,確保不包含多余的組件或服務

如 SSH、Telnet 或者其他不需要的組件或服務。

2.28 docker exec 命令不使用--privileged選項

在docker exec命令中使用--privileged選項可為命令提供擴展的Linux功能。

2.29 docker exec 命令不使用--user=root選項

在docker exec命令中使用--user=root選項,會以root用戶身份在容器內執行命令。 例如,如果容器以tomcat用戶(或任何其他非root用戶)身份運行,則可以使用--user=root選項通過docker exec以root身份運行命令。

三、其他參數說明

[OPTIONS]參數說明:
--add-host list添加自定義主機到ip映射(書寫格式為:主機:ip)
-a, --attach list附加到STDIN、STDOUT或STDERR上
--blkio-weight uint16Block IO (相對權重),取值10到1000之間,0為禁用(默認0)
--blkio-weight-device listBlock IO weight (相對于設備的權重) (默認為數組的形式)
--cap-add list添加Linux功能
--cap-drop list刪除Linux功能
--cgroup-parent string容器的可選父級對照組項
--cidfile string將容器ID寫入文件
--cpu-period int限制CPU CFS(完全公平調度程序)周期
--cpu-quota int限制CPU CFS(完全公平的調度程序)上限
--cpu-rt-period int限制CPU運行時周期(以微秒為單位)
--cpu-rt-runtime int限制CPU實時運行時間(以微秒為單位)
-c, --cpu-shares intCPU 共享 (相對權重的設定)
--cpus decimal設定cpu的數量
--cpuset-cpus string允許執行的cpu (0-3,0,1)
--cpuset-mems string允許執行的MEMs (0-3,0,1)
-d, --detach在后臺運行容器并打印容器ID
--detach-keys string覆蓋分離容器的鍵序列
--device list向容器添加主機設備
--device-cgroup-rule list向 cgroup 允許的設備列表中添加一個或多個規則
--device-read-bps list限定設備的讀取速率(單位: byte/s)(默認為 [])
--device-read-iops list限定設備的讀取速率(單位:IO/s)(默認為 [])
--device-write-bps list限定設備的寫入速率(單位: byte/s)(默認為 [])
--device-write-iops list限定設備的寫入速率(單位:IO/s)(默認為 [])
--disable-content-trust跳過鏡像驗證(默認為 true)
--dns list設置自定義DNS服務器
--dns-option list設置DNS選項
--dns-search list設置自定義的DNS搜索域
--entrypoint string覆蓋鏡像的默認入口點
-e, --env list設置環境變量
--env-file list讀取環境變量內容
--expose list公開一個端口或多個端口
--group-add list添加其他要加入的組
--health-cmd string命令運行以檢查健康
--health-interval duration運行檢查之間的時間(ms
--health-retries int連續的失敗需要報告不健康
--health-start-period duration啟動健康重試倒計時前容器初始化的啟動周期(ms
--health-timeout duration健康檢查運行情況的最大時間值 格式為:(ms
--help打印出使用情況
-h, --hostname string定義容器主機名
--init在容器中運行初始化,以轉發信號并獲取進程
-i, --interactive即使沒有連接,也保持STDIN開放
--ip string設定容器的 IPv4 地址 (例如,192.168.155.139)
--ip6 string設定IPv6地址(例如,2001:db8::33)
--ipc string使用IPC模式
--isolation string容器隔離技術
--kernel-memory bytes內核內存限制
-l, --label list在容器上設置元數據
--label-file list在以行分隔的標簽文件中讀取
--link list向另一個容器添加鏈接
--link-local-ip list容器 IPv4/IPv6 鏈接本地地址
--log-driver string設定容器的日志驅動
--log-opt list設定日志驅動器選項
--mac-address string配置容器MAC地址(例如,92:d0:c6:0a:29:33)
-m, --memory bytes設定內存限額
--memory-reservation bytes內存軟限制
--memory-swap bytes交換限制等于內存加上交換:'-1',以啟用無限交換
--memory-swappiness int優化容器內存交換 (0 到 100) (默認為 -1)
--mount mount將文件系統掛載附加到容器
--name string為容器指定一個名稱
--network string將容器連接到網絡
--network-alias list為容器連接的網絡添加別名
--no-healthcheck禁止任何容器指定 HEALTHCHECK
--oom-kill-disable禁止OOM事件被殺死
--oom-score-adj int優化主機的OOM事件 ,參數范圍 (-1000 到 1000)
--pid string設定PID命名
--pids-limit int優化容器pid限制(如果設置-1則為無限制)
--privileged賦予容器擴展的權限
-p, --publish list將容器的端口發布到主機
-P, --publish-all將所有公開的端口發布到隨機端口
--read-only將容器的根文件系統掛載為只讀(后面會詳細講到)
--restart string配置容器的重啟策略,當容器退出時重新啟動(默認為“no”)
--rm當容器退出時自動移除這個容器
--runtime string使用容器的運行時
--security-opt list指定docker啟動的安全項
--shm-size bytes/dev/shm 的大小(這個可以使其容量進行動態的擴展)
--sig-proxy設置代理接收京城信號 (默認為 true)
--stop-signal string停止容器的信號 (默認為 "SIGTERM")
--stop-timeout int設置超時停止容器(以秒為單位)
--storage-opt list設定容器的存儲驅動程序選項
--sysctl map指定系統控制項 (默認為 map[] 的格式)
--tmpfs list掛載tmpfs目錄
-t, --tty為當前容器分配一個客戶端
--ulimit ulimit啟動需要限制的項(默認為數組的形式)
-u, --user string用戶名或UID(格式為: <name
--userns string使用用戶名稱空間
--uts string使用UTS名稱空間
-v, --volume list綁定安裝卷(關于容器卷,在Docker容器數據卷中會具體的講解)
--volume-driver string容器的可選卷驅動程序
--volumes-from list指定容器裝載卷
-w, --workdir string容器內的工作目錄

到此,關于“Docker中怎么啟用SELinux”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

望谟县| 罗山县| 五峰| 宜阳县| 陆丰市| 阆中市| 甘孜| 张家界市| 蒙城县| 敖汉旗| 新河县| 改则县| 茶陵县| 米脂县| 南城县| 延安市| 建湖县| 永城市| 三台县| 和硕县| 肃南| 金阳县| 大名县| 南安市| 无棣县| 万安县| 丹东市| 临江市| 耿马| 雅安市| 平江县| 定南县| 娄烦县| 甘孜县| 舟曲县| 广宁县| 浦东新区| 桐梓县| 于田县| 舟山市| 新兴县|