發佈者可以選擇是否簽署特定標籤。因此,未簽署標籤的內容和具有相同名稱的已簽署標籤的內容可能不符。例如,發佈者可以推送標記的映像檔 `someimage:latest` 並簽署它。稍後,同一位發佈者可以推送未簽署的 `someimage:latest` 映像檔。第二次推送會取代最後一個未簽署的標籤 `latest`,但不影響已簽署的 `latest` 版本。選擇可以簽署哪些標籤的功能,允許發佈者在正式簽署映像檔之前迭代其未簽署版本。
映像檔消費者可以啟用 DCT,以確保其使用的映像檔已簽署。如果消費者啟用 DCT,則他們只能使用受信任的映像檔進行提取、執行或建置。啟用 DCT 有點像將「篩選器」套用至您的登錄檔。消費者只「看到」已簽署的映像檔標籤,而較不受歡迎的未簽署映像檔標籤對他們來說是「不可見的」。
對於尚未啟用 DCT 的消費者而言,他們使用 Docker 映像檔的方式沒有任何改變。無論映像檔是否已簽署,每個映像檔都可見。
映像檔標籤的信任是透過使用簽章金鑰來管理的。當第一次叫用使用 DCT 的操作時,會建立一組金鑰。一組金鑰包含以下類別的金鑰
- 一個離線金鑰,它是映像檔標籤的 DCT 根目錄
- 簽署標籤的儲存庫或標記金鑰
- 伺服器管理的金鑰,例如時間戳記金鑰,它為您的儲存庫提供新鮮度安全保證
下圖描述了各種簽署金鑰及其關係
警告
根金鑰一旦遺失將無法復原。如果您遺失任何其他金鑰,請發送電子郵件至 Docker Hub 支援團隊。金鑰遺失還需要每個在遺失前使用過此儲存庫簽署標籤的使用者進行手動介入。
您應該將根金鑰備份到安全的地方。鑑於它僅用於建立新的儲存庫,因此最好將其離線儲存在硬體中。有關保護和備份金鑰的詳細資訊,請務必閱讀如何 管理 DCT 的金鑰。
在 Docker CLI 中,我們可以使用 $ docker trust
命令語法簽署並推送容器映像。這是建立在 Notary 功能集之上的。如需更多資訊,請參閱 Notary GitHub 儲存庫。
簽署映像的先決條件是具有附加 Notary 伺服器的 Docker Registry(例如 Docker Hub)。建立自行託管環境的說明可以在 這裡 找到。
要簽署 Docker 映像,您需要一個委派金鑰對。這些金鑰可以使用 $ docker trust key generate
在本地產生,或由憑證授權單位產生。
首先,我們會將委派私鑰新增到本機 Docker 信任儲存庫。(預設情況下,它儲存在 ~/.docker/trust/
中)。如果您使用 $ docker trust key generate
產生委派金鑰,則私鑰會自動新增到本機信任存放區。如果您要匯入單獨的金鑰,則需要使用 $ docker trust key load
命令。
或者,如果您已有現有的金鑰
接下來,我們需要將委派公鑰新增到 Notary 伺服器;這特定於 Notary 中稱為全域唯一名稱 (GUN) 的特定映像儲存庫。如果這是您第一次將委派新增到該儲存庫,則此命令還將使用本機 Notary 標準根金鑰初始化儲存庫。要進一步了解如何初始化儲存庫以及委派的角色,請前往 內容信任的委派。
最後,我們將使用委派私鑰簽署特定標籤並將其推送至登錄檔。
或者,匯入金鑰後,可以透過匯出 DCT 環境變數,使用 $ docker push
命令推送映像。
可以使用 $ docker trust inspect
命令檢視標籤或儲存庫的遠端信任資料。
可以使用 $ docker trust revoke
命令移除標籤的遠端信任資料。
Docker 用戶端中預設停用內容信任。要啟用它,請將 DOCKER_CONTENT_TRUST
環境變數設定為 1
。這可以防止使用者使用未簽名的標籤映像。
在 Docker 用戶端中啟用 DCT 後,對標籤映像進行操作的 docker
CLI 命令必須具有內容簽名或明確的內容雜湊。使用 DCT 運作的命令有:
push(推送)
build(建置)
create(建立)
pull(拉取)
run(執行)
例如,啟用 DCT 後,只有在 someimage:latest
已簽署的情況下,docker pull someimage:latest
才會成功。但是,只要雜湊存在,使用明確內容雜湊的操作就會始終成功。