1. 程式人生 > >Docker 中的內容信任(content trust)

Docker 中的內容信任(content trust)

原文地址

在聯網系統間傳輸資料時,信任是一個核心問題。特別是,當通過網際網路等不可信介質進行通訊時,確保系統執行的所有資料的完整性和釋出者至關重要。使用 Docker Engine 可以將映象(資料)推送到公共或私有 registry。內容信任使你能夠驗證通過任何通道從 registry 接收的所有資料的完整性和釋出者。

1. 關於 Docker 中的信任

內容信任允許使用遠端 Docker registry 執行操作,以強制客戶端對映象的標記進行簽名和驗證。內容信任提供了使用數字簽名來收發遠端 Docker registry 資料的能力。這些簽名允許客戶端驗證特定映象標籤的完整性和釋出者。

目前,內容信任被預設禁用。要啟用它,請將 DOCKER_CONTENT_TRUST 環境變數設定為 1。請參閱 Docker 客戶端的 環境變數Notary 配置以獲取更多選項。

一旦啟用內容信任,映象釋出者就可以對其映象進行簽名。映象消費者可以確保他們使用的映象已經經過簽名。釋出者和消費者可以是單獨的個人或組織中的個人。Docker 的內容信任支援使用者和自動化程序,如構建。

當啟用內容信任時,如果你使用 Docker CE,則在客戶端進行推送和驗證後,在客戶端上進行簽名。如果將 Docker EE 與 UCP 一起使用,並且已將 UCP 配置為要求在部署之前對映象進行簽名,則簽名將由 UCP 進行驗證。

1.1 映象標籤和內容信任

單個映象記錄具有以下識別符號:

[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

一個特定的映象 REPOSITORY 可以有多個標籤。例如,latest3.1.2 都是 mongo 映象上的標籤。映象釋出者可以在每次構建時多次更改映象來構建映象和標籤組合。

內容信任與映象的 TAG 部分相關聯。每個映象倉庫都有一組給映象釋出者使用的用於簽署映象標籤的金鑰。映象釋出者可以自行決定簽署哪些標籤。

映象儲存庫可以包含同時具有已簽名標籤和未簽名標籤的映象。例如,考慮 Mongo 映象倉庫latest 標籤是未簽名的,而 3.1.6

標籤是簽名的。映象釋出者有責任決定映象標籤是否已簽名。下圖中,一些映象標籤被簽名,而另一些則沒有:

tag_signing

映象釋出者可以選擇是否簽名特定標籤。這將導致未簽名標籤的內容與同名的已簽名標籤的內容可能不匹配。例如,映象釋出者可以將已經標記的映象推送到 someimage:latest 並簽名。稍後,同一個釋出者可以推送未簽名的 someimage:latest 映象。第二次推送替換 latest 未簽名標籤,但不會影響已簽名的 latest 版本。可以自由選擇為哪個標籤簽名,使得映象釋出者可以在正式簽名之前迭代未簽名的映象版本。

映象使用者可以啟用內容信任以確保他們使用的映象已被簽名。如果使用者啟用內容信任,則只能使用受信任的映象進行 pull,run 或 build。啟用內容信任就像戴著一副有色眼鏡。使用者“看到”只有簽名的映象標籤,不想要的、未簽名的映象標籤對他們來說是“不可見的”。

trust_view

對於尚未啟用內容信任的消費者,可以正常使用所有的 Docker 映象。無論是否簽名,每個映象都可見。

1.2 內容信任操作和金鑰

啟用內容信任時,對標記映象執行操作的 docker CLI 命令必須具有內容簽名或顯式內容雜湊。與內容信任一起執行的命令是:

  • push
  • build
  • create
  • pull
  • run

例如,開啟內容信任後,docker pull someimage:latest 命令只有在 someimage:latest 確實被簽名時才會成功執行。然而,附帶顯式內容雜湊的操作只要雜湊在匹配就會成功執行。

$ docker pull someimage@sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a

對映象標籤的信任通過使用簽名金鑰來管理。首次呼叫使用內容信任的操作時會建立金鑰集。金鑰集由以下幾類金鑰組成:

  • 作為映象標記的內容信任的根的離線金鑰
  • 簽名標籤的倉庫或標籤金鑰
  • 伺服器管理的金鑰,如時間戳金鑰,為倉庫提供最新的安全保證

下圖描述了各種簽名金鑰及其關係:

trust_components

警告:丟失根金鑰非常難以恢復。糾正這種損失需要 Docker 支援人員的干預來重置倉庫狀態。這種損失還需要所有使用此倉庫中的簽名標記的使用者在丟失之前進行手動干預。

應該將根金鑰備份到安全的地方。鑑於根金鑰僅用於建立新的倉庫,最好將其離線儲存在硬體中。有關保護和備份金鑰的詳細資訊,請務必閱讀 如何為內容信任管理金鑰。

2. 典型內容信任操作

本節將學習使用 Docker 映象執行的典型可信操作。具體來說,我們通過以下步驟來幫助我們執行這些可信操作:

  • Build 並 push 未簽名映象
  • Pull 未簽名映象
  • Build 並 push 簽名映象
  • Pull 之前 push 的簽名映象
  • Pull 之前 push 的未簽名映象

2.1 啟用和禁用每個 shell 或每個呼叫的內容信任

在 shell 中,可以通過設定 DOCKER_CONTENT_TRUST 環境變數來啟用內容信任。在每個 shell 中啟用是非常有用的,因為可以為可信操作配置一個 shell,為不可信操作配置另一個終端 shell。還可以將此宣告新增到 shell 配置檔案中,以便預設情況下始終開啟它。

要在 bash shell 中啟用內容信任,請輸入以下命令:

export DOCKER_CONTENT_TRUST=1

一旦設定,每個“tag”操作都需要一個用於獲取可信 tag 的金鑰。

在設定了 DOCKER_CONTENT_TRUST 環境變數的環境中,可以通過 --disable-content-trust 標誌關閉內容信任後在標記映象上執行單獨的操作。

看看使用不受信任的父映象的 Dockerfile:

$  cat Dockerfile
FROM docker/trusttest:latest
RUN echo

要通過這個 Dockerfile 成功構建容器,可以這麼做:

$  docker build --disable-content-trust -t <username>/nottrusttest:latest .
Sending build context to Docker daemon 42.84 MB
...
Successfully built f21b872447dc

其他命令的操作都類似:

$  docker pull --disable-content-trust docker/trusttest:latest
...
$  docker push --disable-content-trust <username>/nottrusttest:latest
...

要在呼叫命令時開啟內容信任,而不管 DOCKER_CONTENT_TRUST 環境變數是如何設定的:

$  docker build --disable-content-trust=false -t <username>/trusttest:testing .

所有受信任的操作都支援 --disable-content-trust 標誌。

2.2 推送可信的內容

要為特定映象標記建立簽名內容,只需啟用內容信任並推送標記的映象即可。如果這是第一次在系統上使用內容信任推送映象,則會話如下所示:

$ docker push <username>/trusttest:testing
The push refers to a repository [docker.io/<username>/trusttest] (len: 1)
9a61b6b1315e: Image already exists
902b87aaaec9: Image already exists
latest: digest: sha256:d02adacee0ac7a5be140adb94fa1dae64f4e71a68696e7f8e7cbf9db8dd49418 size: 3220
Signing and pushing trust metadata
You are about to create a new root signing key passphrase. This passphrase
will be used to protect the most sensitive key in your signing system. Please
choose a long, complex passphrase and be careful to keep the password and the
key file itself secure and backed up. It is highly recommended that you use a
password manager to generate the passphrase and keep it safe. There will be no
way to recover this key. You can find the key in your config directory.
Enter passphrase for new root key with id a1d96fb:
Repeat passphrase for new root key with id a1d96fb:
Enter passphrase for new repository key with id docker.io/<username>/trusttest (3a932f1):
Repeat passphrase for new repository key with id docker.io/<username>/trusttest (3a932f1):
Finished initializing "docker.io/<username>/trusttest"

開啟內容信任後第一次推送標記映象時,docker 客戶端會識別出這是你第一次推送,並且會:

  • 警告你這會建立一個新的根金鑰
  • 請求根金鑰的密碼
  • ~/.docker/trust 目錄中生成一個根金鑰
  • 請求倉庫金鑰的密碼
  • ~/.docker/trust 目錄中生成一個倉庫金鑰

為根金鑰和儲存庫金鑰對選擇的密碼應隨機生成並存儲在密碼管理器中。

注意:如果省略 testing 標記,則跳過內容信任。即使啟用了內容信任,即使這是第一次推送,情況也是如此。

$ docker push <username>/trusttest
The push refers to a repository [docker.io/<username>/trusttest] (len: 1)
9a61b6b1315e: Image successfully pushed
902b87aaaec9: Image successfully pushed
latest: digest: sha256:a9a9c4402604b703bed1c847f6d85faac97686e48c579bd9c3b0fa6694a398fc size: 3220
No tag specified, skipping trust metadata push

它被跳過,因為訊息指出,你沒有提供映象 TAG 值。在 Docker 內容信任中,簽名與標籤相關聯。

一旦在系統上擁有 root 金鑰,建立的後續映象倉庫就可以使用相同的 root 金鑰:

$ docker push docker.io/<username>/otherimage:latest
The push refers to a repository [docker.io/<username>/otherimage] (len: 1)
a9539b34a6ab: Image successfully pushed
b3dbab3810fc: Image successfully pushed
latest: digest: sha256:d2ba1e603661a59940bfad7072eba698b79a8b20ccbb4e3bfb6f9e367ea43939 size: 3346
Signing and pushing trust metadata
Enter key passphrase for root key with id a1d96fb:
Enter passphrase for new repository key with id docker.io/<username>/otherimage (bb045e3):
Repeat passphrase for new repository key with id docker.io/<username>/otherimage (bb045e3):
Finished initializing "docker.io/<username>/otherimage"

新映象具有自己的倉庫金鑰和時間戳金鑰。latest 標籤用這兩個標籤簽名。

2.3 獲取映象內容

使用映象的常用方法是 pull 映象。啟用內容信任後,Docker 客戶端僅允許 docker pull 檢索已簽名的映象。讓我們試著獲取你之前簽名和推送的映象:

$  docker pull <username>/trusttest:testing
Pull (1 of 1): <username>/trusttest:[email protected]:d149ab53f871
...
Tagging <username>/[email protected]:d149ab53f871 as docker/trusttest:testing

下面的例子中,命令沒有指定 tag,所以系統使用預設的 latest tag,但是 docker/trusttest:latest 並沒有簽名。

$ docker pull docker/trusttest
Using default tag: latest
no trust data available

因為 docker/trusttest:latest沒有簽名,所以 pull 失敗。

相關推薦

Docker 內容信任content trust

原文地址 在聯網系統間傳輸資料時,信任是一個核心問題。特別是,當通過網際網路等不可信介質進行通訊時,確保系統執行的所有資料的完整性和釋出者至關重要。使用 Docker Engine 可以將映象(資料)推送到公共或私有 registry。內容信任使你能夠驗證通過

Docker踩坑筆記[二]:Docker使用MySQL基於CentOS7

Docker之MySQL的使用 拉取Mysql映象 docker中國加速:docker pull registry.docker-cn.com/library/ docke-hub地址:https://hub.docker.com/r/_/mysql/ 檢視TAG

安卓儲存資料和檔案系列4:內容提供者Content Provider方式

內容提供者(Content Provider)是android的四大元件之一,重要性可想而知,一個程序的資料可以被另外一個程序訪問(在不同的apk之間可以訪問),內容提供者可以跨應用,資料庫跨應用的使用場景:一個應用中提供資料給其他應用;允許使用者從一個應用中拷貝資料到另一

Android學習之基礎知識十—內容提供器Content Provider

一、跨程式共享資料——內容提供器簡介   內容提供器(Content Provider)主要用於在不同的應用程式之間實現資料共享的功能,它提供了一套完整的機制,允許一個程式訪問另一個程式中的資料,同時還能保證被訪資料的安全性,目前,使用內容提供器是Android實現跨程式共享資料的標準方式。  

redis 在 php 的應用string篇

否則 發現 版本 com 偏移量 .html incrby his num 本文為我閱讀了 redis參考手冊 之後結合 博友的博客 編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) 上一篇:redis 在 php 中

redis 在 php 的應用List篇

color .com 博客 長度 多個 列表 conn ref ron 本文為我閱讀了 redis參考手冊 之後結合 博友的博客 編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) 目錄: 一、List(列表) 1、LPUS

redis 在 php 的應用Set篇

之間 進行 group center 集合運算 返回 world cut 數據 上一篇:redis 在 php 中的應用(List篇) 本文為我閱讀了 redis參考手冊 之後編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) Re

Rigidbody Angular Drag 角阻力

rigidbody 物體 如果 行鎖 發生 strong 凍結 free 設置 Rigidbody中 Angular Drag (角阻力):同樣指的是空氣阻力,只不過是用來阻礙物體旋轉的。如果設置成無限的話,物體會立即停止旋轉。如果設置成0,物體在上升過程中,會發生側翻旋

常用對照表的參考_chapter-twoContent-Type

接下來 adding 網頁服務器 發送請求 不一致 行修改 用戶信息 官網 頁面 HTTP狀態碼詳解 狀態碼含義 100 客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩余部

正確處理下載文件時HTTP頭的編碼問題Content-Disposition

robot shel 回歸 發布 合並 市場 ots 例子 int 轉自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做項目時遇到了一個 case

c#的delegate委托和event事件

sel 指針 添加 自動 關鍵字 only cnblogs 私有 part 委托: 托付其他人做這件事 ,包括 托付自己 ,即 一個方法 可以 調用 沒有關系的其他方法 , 也可以 將委托傳遞過去 ,回調自己的方法 ,且 可以自定義參數 ,非常方便 互相傳值, 適

docker 之 基本操作 幹貨

eight -s 本地 arch 進入容器 name height 官方 -- 1、下載鏡像:docker pull <name>2、查看本地鏡像:docker images3、查看官方鏡像:docker search <name>4、運行容器:d

在 Ubuntu13.10 服務器安裝 Munin監視工具【轉】

一個 程序 系統 htm 打開終端 install 監視 pac apt-get Munin 監測工具可檢測所有的計算機,並記錄好看到的計算機。通過圖形Web界面的的方式顯示所有信息。重點是即插即用的功能。完成安裝後,大量的控插件會被打。 使用 Munin 您可以輕松地監視

js閉包積累總結

結果 ons 網頁 不能 創建 ner alert 子函數 存在 什麽是閉包: 當內部函數 在定義它的作用域 的外部 被引用時,就創建了該內部函數的閉包 ,如果內部函數引用了位於外部函數的變量,當外部函數調用完畢後,這些變量在內存不會被 釋放,因為閉包需要它們. 例子1 f

js:nodejs的session登陸驗證

登陸 filter action xtend div post方法 獲取參數 password keys 一,下載模塊 npm install cookie-session 本例通過在用戶登陸成功後創建session控制部分頁面的訪問權限 app.js /** * Cr

斯坦福大學公開課機器學習:machine learning system design | trading off precision and recallF score公式的提出:學習算法如何平衡取舍查準率和召回率的數值

ron 需要 color 不可 關系 machine 同時 機器學習 pos 一般來說,召回率和查準率的關系如下:1、如果需要很高的置信度的話,查準率會很高,相應的召回率很低;2、如果需要避免假陰性的話,召回率會很高,查準率會很低。下圖右邊顯示的是召回率和查準率在一個學習算

關於openwrt+ipv6在H3C教育網環境的研究未完

網絡 現實 sdn ipv san 關系 協議 慢慢 network 這裏先開個頭,考完試繼續補充。 教育網的IPv6提供了非常好的一些性能,也起到了試驗性的作用,確是所謂Next Generation Network ;於是乎,如何能充分發揮IPv6也成

Android studioTerminal使用gitWindows環境

默認 clone fig android RM 發現 mage body image 因為之前用的是Mac Pro,現在公司使用的是PC機,這2種系統AS的terminal使用還是有點不一樣。 1、下載git,進行安裝(下載地址: http://git-scm.com/

oracle11gSQL優化SQL TUNING新特性之Adaptive Cursor Sharing (ACS)

ise cut info xtend 優化器 指標 語法 oracl 綁定 1. ACS簡介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不該共享的遊標被共享的可能性。ACS使用兩個新指標:se

Postgresql臨時表temporary table的特性和用法

.net 他會 acl tmp 就會 fonts 功能 不能 聲明 熟悉Oracle的人,相比對臨時表(temporary table)並不陌生,很多場景對解決問題起到不錯的作用,開源庫Postgresql中,也有臨時表的概念,雖然和Oracle中臨時表名字相同,使用方法和