文章目錄
- 一、Docker 容器與虛擬機的區別
- 1.隔離與共享
- 2.性能與損耗
- 二、Docker 存在的安全問題
- 1.Docker 自身漏洞
- 2. Docker 原始碼問題
- 三、Docker 架構缺陷與安全機制
- 四、Docker 安全基線標準
- 1.內核級別
- 2.主機級別
- 3.網路級別
- 4.鏡像級別
- 5.容器級別
- 6.其他設定
- 五、容器最小化
- 六、Docker remote api 訪問控制
- 七、限制流量流向
- 八、鏡像安全
- 九、Docker-TLS加密通訊
- 6、TLS配置及部署
首先我們需要來了解一下Docker容器和虛擬機的區別
一、Docker 容器與虛擬機的區別
1.隔離與共享
虛擬機通過添加 Hypervisor 層,虛擬出網卡、記憶體、CPU 等虛擬硬體,再在其上建立 虛擬機,每個虛擬機都有自己的系統內核,
而 Docker 容器則是通過隔離的方式,將檔案系 統、行程、設備、網路等資源進行隔離,再對權限、CPU 資源等進行控制,最終讓容器之間互不影響,
容器無法影響宿主機,容器與宿主機共享內核、檔案系統、硬體等資源,
2.性能與損耗
與虛擬機相比,容器資源損耗要少, 同樣的宿主機下,能夠建立容器的數量要比虛擬 機多,但是,虛擬機的安全性要比容器稍好,
要從虛擬機攻破到宿主機或其他虛擬機,需要 先攻破 Hypervisor 層,這是極其困難的,而 docker 容器與宿主機共享內核、檔案系統等資源,
更有可能對其他容器、宿主機產生影響,
二、Docker 存在的安全問題
1.Docker 自身漏洞
作為一款應用 Docker 本身實作上會有代碼缺陷,CVE官方記錄Docker歷史版本共有超過20項漏洞,
黑客常用的攻擊手段主要有代碼執行、權限提升、 資訊泄露、權限繞過等,目前 Docker 版本更迭非常快,
Docker 用戶最好將 Docker 升級為 最新版本,
2. Docker 原始碼問題
Docker 提供了 Docker hub,可以讓用戶上傳創建的鏡像,以便其他用戶下載,快速搭 建環境,但同時也帶來了一些安全問題,例如下面三種方式:
**(1)**黑客上傳惡意鏡像 如果有黑客在制作的鏡像中植入木馬、后門等惡意軟體,那么環境從一開始就已經不安全了,后續更沒有什么安全可言,
**(2)**鏡像使用有漏洞的軟體 Docker Hub 上能下載的鏡像里面,75%的鏡像都安裝了有漏洞的軟體,所以下載鏡像后,
需要檢查里面軟體的版本資訊,對應的版本是否存在漏洞,并及時更新打上補丁,
**(3)**中間人攻擊篡改鏡像 鏡像在傳輸程序中可能被篡改,目前新版本的 Docker 已經提供了相應的校驗機制來預 防這個問題,
三、Docker 架構缺陷與安全機制
Docker 本身的架構與機制就可能產生問題,例如這樣一種攻擊場景,黑客已經控制了宿主機上的一些容器,或者獲得了通過在公有云上建立容器的方式,然后對宿主機或其他容器發起攻擊,
1. 容器之間的局域網攻擊
主機上的容器之間可以構成局域網,因此針對局域網的 ARP 欺騙、嗅探、廣播風暴等攻 擊方式便可以用上,
所以,在一個主機上部署多個容器需要合理的配置網路,設定 iptable 規則,
2. DDoS 攻擊耗盡資源
Cgroups 安全機制就是要防止此類攻擊的,不要為單一的容器分配過多的資源即可避免此類問題,
3. 有漏洞的系統呼叫
Docker與虛擬機的一個重要的區別就是Docker與宿主機共用一個作業系統內核,
一旦宿主內核存在可以越權或者提權漏洞,盡管Docker使用普通用戶執行,在容器被入侵時,攻擊者還可以利用內核漏洞跳到宿主機做更多的事情,
4. 共享root用戶權限
如果以 root 用戶權限運行容器,容器內的 root 用戶也就擁有了宿主機的root權限,
四、Docker 安全基線標準
從內核、主機、網路、鏡像、容器以及其它等 6 個方 面總結 Docker 安全基線標準
1.內核級別
(1)及時更新內核,
(2)User NameSpace(容器內的 root 權限在容器之外處于非高權限狀態),
(3)Cgroups(對資源的配額和度量),
(4)SELiux/AppArmor/GRSEC(控制檔案訪問權限),
(5)Capability(權限劃分),
(6)Seccomp(限定系統呼叫),
(7)禁止將容器的命名空間與宿主機行程命名空間共享,
2.主機級別
(1)為容器創建獨立磁區,
(2)僅運行必要的服務,
(3)禁止將宿主機上敏感目錄映射到容器,
(4)對 Docker 守護行程、相關檔案和目錄進行審計,
(5)設定適當的默認檔案描述符數,
(檔案描述符:內核(kernel)利用檔案描述符(file descriptor)來訪問檔案,檔案描述符是非負整數,
打開現存檔案或新建檔案時,內核會回傳一個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案)
(6)用戶權限為 root 的 Docker 相關檔案的訪問權限應該為 644 或者更低權限,
(7)周期性檢查每個主機的容器清單,并清理不必要的容器,
3.網路級別
(1)通過 iptables 設定規則實作禁止或允許容器之間網路流量,
(2)允許 Docker 修改 iptables,
(3)禁止將 Docker 系結到其他 IP/Port 或者 Unix Socket,
(4)禁止在容器上映射特權埠,
(5)容器上只開放所需要的埠,
(6)禁止在容器上使用主機網路模式,
(7)若宿主機有多個網卡,將容器進入流量系結到特定的主機網卡上,
4.鏡像級別
(1)創建本地鏡像倉庫服務器,
(2)鏡像中軟體都為最新版本,
(3)使用可信鏡像檔案,并通過安全通道下載,
(4)重新構建鏡像而非對容器和鏡像打補丁,
(5)合理管理鏡像標簽,及時移除不再使用的鏡像,
(6)使用鏡像掃描,
(7)使用鏡像簽名,
5.容器級別
(1)容器最小化,作業系統鏡像最小集,
(2)容器以單一主行程的方式運行,
(3)禁止 privileged 標記使用特權容器,
(4)禁止在容器上運行 ssh 服務,
(5)以只讀的方式掛載容器的根目錄系統,
(6)明確定義屬于容器的資料盤符,
(7)通過設定 on-failure 限制容器嘗試重啟的次數,容器反復重啟容易丟失資料,
(8)限制在容器中可用的行程樹,以防止 fork bomb,(fork炸彈,迅速增長子行程,耗盡系統行程數量)
6.其他設定
(1)定期對宿主機系統及容器進行安全審計,
(2)使用最少資源和最低權限運行容器,
(3)避免在同一宿主機上部署大量容器,維持在一個能夠管理的數量, (48核心的服務器控制控制容器在80-100之間)
(4)監控 Docker 容器的使用,性能以及其他各項指標,
(5)增加實時威脅檢測和事件回應功能,
(6)使用中心和遠程日志收集服務
五、容器最小化
如果僅在容器中運行必要的服務,像 SSH 等服務是不能輕易開啟去連接容器的,通常使用以下方式來進入容器,
docker exec -it a661258f6bfe bash
六、Docker remote api 訪問控制
Docker的遠程呼叫 API 介面存在未授權訪問漏洞,至少應限制外網訪問,建議使用 Socket 方式訪問,
監聽內網 ip,docker daemon 啟動方式如下,
dockerd -H uninx:///var/run/docker.sock -H tcp://192.168.195.128:2375
或者
vim /usr/lib/systemd/system/docker.service
#開放本地監聽地址和埠
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.195.128:2375
systemctl daemon-reload
systemctl restart docker

對于對方而言,如果對方開了防火墻,我們需要做一個防火墻的規則
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.182.11" port protocol="tcp" port="2375" accept"
firewall-cmd --reload #重新加載防火墻
//客戶端操作實作遠程呼叫
docker -H tcp://192.168.200.40 images

這是就能遠程呼叫了
docker -H tcp://宿主機ip 操作命令
docker -H tcp://192.168.182.11 ps -a

七、限制流量流向
使用防火墻過濾器限制 Docker 容器的源 IP 地址范圍與外界通訊,
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.195.0/24" reject"
拒絕這個網段的連接
大量問題是因為Docker容器埠外放引起的漏洞,除了作業系統賬戶權限控制上的問題,更在于對Docker Daemon的行程管理上存在隱患,
目前常用的Docker版本都支持Docker Daemon管理宿主iptables的,而且一旦啟動行程加上-p host_port:guest_port的埠映射,
Docker Daemon會直接增加對應的FORWARD Chain并且-j ACCEPT,而默認的DROP規則是在INPUT鏈做的,對docker沒法限制,
這就留下了很嚴重的安全隱患了,因此建議:
1. 不在有外網ip的機器上使用Docker服務
2. 使用k8s等docker編排系統管理Docker容器
3. 宿主上Docker daemon啟動命令加一個--iptables=false,然后把常用iptables寫進檔案里,再用iptables-restore去刷,
八、鏡像安全
Docker 鏡像安全掃描,在鏡像倉庫客戶端使用證書認證,對下載的鏡像進行檢查,
通過與 CVE 資料庫同步掃描鏡像,一旦發現漏洞則通知用戶處理,或者直接阻止鏡像繼續構建,
如果公司使用的是自己的鏡像源,可以跳過此步;否則,至少需要驗證 baseimage 的 md5 等特征值,確認一致后再基于 baseimage 進一步構建,
一般情況下,要確保只從受信任的庫中獲取鏡像,并且不建議使用–insecure-registry=[] 引數,推薦使用harbor私有倉庫,
九、Docker-TLS加密通訊
1、什么是TLS?有什么作用?
TLS(Transport Layer Security Protocol):傳輸層安全性協議,其前身安全套接層(Secure Sockets Layer,縮寫作SSL)是一種安全協議,目的是為互聯網通信提供安全及資料完整性保障,
TLS協議采用主從式架構模型,用于在兩個應用程式間透過網路創建起安全的連線,防止在交換資料時受到竊聽及篡改
TLS協議的優勢是與高層的應用層協議(如HTTP、FTP、Telnet等)無耦合,應用層協議能透明地運行在TLS協議之上,由TLS協議進行創建加密通道需要的協商和認證,應用層協議傳送的資料在通過TLS協議時都會被加密,從而保證通信的私密性,
2、為什么要使用TLS加密
為了防止鏈路劫持、會話劫持等問題導致 Docker 通信時被中 間人攻擊,c/s 兩端應該通過加密方式通訊,
3、CA認證:
證書頒發機構(CA, Certificate Authority)即頒發數字證書的機構,是負責發放和管理數字證書的權威機構,并作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任,
CA 證書頒發的時候,證書中是包含密鑰對的,同時用戶資訊也是進行加密的,所以CA頒發的證書具有兩個特點:
① 用戶發送的資訊都是加密的
② 身份的唯一性
證書格式:x509(國際標準)
首先CA先頒發ca證書,然后用證書和相關資訊找CA頒發server證書、client證書,cilent證書要推送給client
4、密鑰和私鑰
密鑰
- 秘鑰(AES、DES、3DES) 相當于家里的鎖和對應的鑰匙
- 效率高,但不安全
私鑰
- 非對稱秘鑰(rsa,公鑰-私鑰)相當于古代的虎符,不能從私鑰推匯出公鑰
- 效率不高(需要加密,轉換較慢)
5、什么是Hash值
Hash演算法是一個廣義的演算法,在這里做數字簽名來保障資料傳遞的安全性,如何確保資料的安全性,通過hash值對比確定資料完整性和安全性,
6、TLS配置及部署
| 主機名 | 作業系統 | IP地址 |
|---|---|---|
| server | CentOS7 | 192.168.182.11 |
| client | CentOS7 | 192.168.182.22 |
為了防止鏈路劫持、會話劫持等問題導致 Docker 通信時被中間人攻擊,c/s 兩端應該通過加密方式通訊,
== server服務端配置==
mkdir /tls
cd /tls
hostnamectl set-hostname master
su
vim /etc/hosts
127.0.0.1 master

創建ca密鑰
//創建ca密鑰
openssl genrsa -aes256 -out ca-key.pem 4096
相關引數:
genrsa 使用RSA演算法產生私鑰
-aes256 使用256位密鑰的AES演算法對私鑰進行加密
-out 輸出檔案的路徑
4096 秘鑰的長度

生成ca證書
//創建ca證書;
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
相關引數:
req 請求證書
-new 新證書簽發請求
-x509 生成x509格式證書
-days 證書有效期1000天
-key 指定私鑰路徑
-subj subject的縮寫,可以認為是主題、專案等

創建服務器私鑰
openssl genrsa -out server-key.pem 4096

簽名私鑰
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
#使用server-key.pem 密鑰檔案進行簽名,生成簽名檔案

使用ca證書與私鑰證書簽名
使用ca證書與私鑰證書簽名,輸入123123
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
相關引數:
-in 指定輸入的證書、秘鑰等檔案
-CAcreateserial 表示創建證書序列號檔案(默認為ca.srl)

生成客戶端密鑰
openssl genrsa -out key.pem 4096

簽名客戶端
openssl req -subj "/CN=client" -new -key key.pem -out client.csr

創建組態檔
echo extendedKeyUsage=clientAuth > extfile.cnf

簽名證書,輸入123123,需要(簽名客戶端,ca證書,ca密鑰)
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
洗掉多余檔案
rm -rf ca.srl client.csr extfile.cnf server.csr

配置docker,指定tls證書的路徑、開放的埠、通信的行程等
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
systemctl daemon-reload
systemctl restart docker

將 /tls/ca.pem /tls/cert.pem /tls/key.pem 三個檔案復制到另一臺主機
scp ca.pem root@192.168.182.22:/etc/docker/
scp cert.pem root@192.168.182.22:/etc/docker/
scp key.pem root@192.168.182.22:/etc/docker/


本地驗證
//本地驗證
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
docker pull nginx

client:192.168.182.22
hostnamectl set-hostname client
su
echo '192.168.162.11 server' >> /etc/hosts
或
vim /etc/hosts
192.168.162.11 server
cd /etc/docker
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://server:2376 images

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273659.html
標籤:其他
