Docker 安全

該文爲《深入淺出Docker》的學習筆記,感謝查看,如有錯誤,歡迎指正

這裏主要針對 Linux 平臺中的 Docker 安全進行學習。

安全的本質就是分層,安全層越多,安全性就越高

一、簡介

Linux 本身就具有相當多的安全技術,而 Docker 可以直接利用這些安全技術,並且 Docker 平臺自身也提供了一些很好的安全技術。

主要涉及的安全技術有這些:

Linux 安全技術

  • 內核命名空間(Namespace)
  • 控制組(Control Group)
  • 系統權限(Capability)
  • 強制訪問控制(MAC)
  • 安全計算(Seccomp)

Docker 平臺安全技術

  • Swarm 模式
  • Docker 安全掃描
  • Docker 內容信任
  • Docker 密鑰

Linux 的安全技術略微複雜,Docker 平臺的安全技術非常簡單,下面我們一起來了解一下。

二、Docker 安全詳解

2.1 Linux 安全技術

2.1.1 Namespace

命名空間的作用就是隔離,對於 Docker 來說,內核命名空間可以將操作系統(OS)進行拆分,使一個操作系統看起來像是多個獨立的操作系統。

比如在相同的 OS 上運行多個不同的 Web 服務,並且不存在端口衝突,同時還能共享配置文件以及類庫。簡單點說就是在 Docker 主機上啓動多個容器,容器內運行的都是 Web 服務,使用的都是 443 端口,並且容器還擁有自己的 IP 地址。

具體使用到的內核命名空間以及作用:

  • 進程ID(PID):爲每個容器提供相互獨立的進程樹,每個容器都有自己得 PID 爲 1 的進程。
  • 網絡(NET):爲每個容器提供互相隔離的網絡棧,每個容器都有自己的 eth0 網絡接口、IP 和端口,路由表。
  • 文件系統/掛載(MNT):每個容器都有互相隔離的根目錄/、包括/etc/var,只能訪問自己,不能訪問 Docker 主機及其它容器。
  • 進程內通信(IPC):在容器內提供共享內存,在不同容器間也是獨立的。
  • 用戶(USER):將容器內的用戶映射到 Docker 主機中的某一用戶上。常用操作是將容器的 root 用戶映射到 Docker 主機上的非 root 用戶上。
  • UTS爲每個容器提供自己的主機名稱。

可以認爲,Docker 容器就是由命名空間組成的。

2.1.2 Control Group

控制組的作用是限額,限制公共資源的消耗情況,如CPURAM硬盤I/O等。不允許全部被一個容器佔完了。

2.1.3 Capability

如果直接用 root 用戶運行容器,授予的權限過大,有安全隱患,如果不用 root 用戶運行容器,容器內部又會處處受限,Capability就是爲了解決該問題。用 root 用戶運行容器時,Capability會移除不需要的 root 權限。

2.1.4 MAC

Docker 採用主流 Linux MAC 技術,例如AppArmorSELinux。Docker 允許用戶在啓動容器時不設置相應策略,還允許用戶根據需求自己設置合適的策略。

2.1.5 Seccomp

Docker 使用過濾模式下的Seccomp 來限制容器對宿主機內核發起的系統調用,每個新容器都會設置默認的Seccomp配置,用戶也可以自定義該配置,也可以選擇不設置任何Seccomp配置。

以上配置建議使用默認值,自定義配置比較麻煩。


2.2 Docker 安全技術

2.2.1 Swarm 模式

Swarm 模式是 Docker 未來的趨勢,包含了很多開箱即用的安全特性,並且設置了合理的默認值。主要包括以下幾點:

  • 加密節點 ID
  • 基於 TLS 的認證機制
  • 安全准入令牌
  • 支持週期性證書自動更新的 CA 配置
  • 加密集羣存儲(etcd)
  • 加密網絡

使用docker swarm init創建 Swarm 集羣時,當前節點會被配置爲第 1 個管理節點。並且賦予 Swarm 集羣加密ID、以及安全准入令牌。加密 ID,節點角色這些信息都是存放在證書中的,證書默認 90 天更新一次。集羣數據庫也配置完成並處於加密狀態。只需要一條命令,即可完成上述所有操作。

1)我們看一下證書詳情,證書位於/var/lib/docker/swarm/certificates/路徑下

[root@huanzi-001 certificates]# openssl x509 -in swarm-node.crt -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            48:27:56:18:8d:6c:8f:b7:97:e9:13:6a:93:05:e5:93:12:78:55:c7
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: CN=swarm-ca
        Validity
            Not Before: Feb  2 07:09:00 2020 GMT
            Not After : May  2 08:09:00 2020 GMT
        Subject: O=qqf7k4kamkrmvh3lpksrtiuox, OU=swarm-manager, CN=8bet9fg0tnoqlfp0ebrrqdapn
        Subject Public Key Info:

其中,Subject內,

  • O(組織字段)保存的是 Swarm ID
  • OU(組織單元字段)表示節點在 Swarm 中的角色
  • CN保存的是節點的加密 ID 信息。

Validity中還能看到證書的創建時間和下次更新時間,默認爲 90 天。

上述信息也可以通過docker system info查看

[root@huanzi-001 certificates]# docker system info 
<...>
 Swarm: active
  NodeID: 8bet9fg0tnoqlfp0ebrrqdapn
  Is Manager: true
  ClusterID: qqf7k4kamkrmvh3lpksrtiuox
  <...>
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
 <...>
 
[root@huanzi-001 certificates]# 

使用docker swarm update --cert-expiry修改 CA 的更新週期

[root@huanzi-001 certificates]# docker swarm update --cert-expiry 720h
Swarm updated.
[root@huanzi-001 certificates]# docker system info | grep "Expiry Duration"
   Expiry Duration: 4 weeks
[root@huanzi-001 certificates]#

CA 的相關命令可以使用docker swarm ca --help獲取。

2)我們再看一下令牌格式

[root@huanzi-001 certificates]# docker swarm join-token manager 
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy 192.168.124.17:2377

[root@huanzi-001 certificates]#

其中SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy的格式是:
PREFIX - VERSION - SWARM ID - TOKEN

  • PREFIX 永遠是SWMTKN,避免意外發布至公共環境
  • VERSION 是 Swarm 的版本信息
  • SWARM ID 是 Swarm 認證信息的一個 hash 值,Swarm 集羣創建時會生成這個
  • TOKEN 決定該令牌是manager還是worker

如何手動更新令牌呢?可以使用docker swarm join-token --rotate manager更新。

[root@huanzi-001 certificates]# docker swarm join-token --rotate manager 
Successfully rotated manager join token.

To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-4mblx41ep8g7ymnobvg6vvazv 192.168.124.17:2377

[root@huanzi-001 certificates]#

對比一下新舊令牌:
舊:SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy
新:SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-4mblx41ep8g7ymnobvg6vvazv
我們發現只有 TOKEN 變了。

令牌保存在數據庫中,默認是加密的

3)再看一下集羣存儲

存儲目前使用的是etcd,並且在 Swarm 集羣所有 manager 之間自動複製,存儲默認加密

集羣存儲的日常維護由 Docker 自動完成,生產環境中,我們需要完成的是完整的備份和恢復方案

2.2.2 Docker 安全掃描

Docker 安全掃描功能可以檢測鏡像中的已知缺陷,進行二進制級別的掃描,並在掃描完成以後生成詳細的報告。

已知缺陷都在已知缺陷數據庫中(CVE 數據庫)

2.2.3 Docker 內容信任

Docker 內容信任(Docker Content Trust,DCT)讓用戶可以很容易的確認所下載鏡像的完整性和發佈者。

允許開發者在將鏡像推送至 Docker Hub 時進行簽名。

  • 一旦 DCT 功能開啓,用戶將無法獲取並使用未簽名鏡像。
  • DCT 還允許僅使用某一個簽名的鏡像。

要開啓 DCT 功能,只用在環境中將DOCKER_CONTENT_TRUST變量設置爲 1 即可。

$ export DOCKER_CONTENT_TRUST=1

2.2.4 Docker 密鑰

Docker 密鑰使用docker screct來管理,密鑰在創建後以及傳輸中都是加密的,使用時被掛載到內存文件系統,一旦容器(服務任務)完成,內存文件系統關閉,密鑰也隨之刪除。


感謝閱讀,有興趣的小夥伴可以關注我的公衆號DevOps探索之旅,大家一起學習進步
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章