在內容信任沙箱中操作
本頁面介紹如何設定並使用沙盒來進行信任實驗。沙盒允許您在本地配置並嘗試信任操作,而不會影響您的生產環境映像檔。
在開始操作沙盒之前,您應該先閱讀信任概述。
先決條件
這些說明假設您在 Linux 或 macOS 上執行。您可以在本地機器或虛擬機器上執行此沙盒。您需要擁有在本地機器或 VM 上執行 docker 指令的權限。
此沙盒要求您安裝兩個 Docker 工具:Docker Engine >= 1.10.0 和 Docker Compose >= 1.6.0。若要安裝 Docker Engine,請從支援的平台列表中進行選擇。若要安裝 Docker Compose,請參閱此處的詳細說明。
沙盒中包含什麼?
如果您只是直接使用信任功能,只需要 Docker Engine 用戶端和對 Docker Hub 的存取權限。此沙盒模擬了一個生產環境中的信任環境,並設定了以下額外元件。
| 容器 | 描述 |
|---|---|
| trustsandbox | 一個包含最新版本 Docker Engine 和預先配置憑證的容器。這是您的沙盒,您可以在其中使用 docker 用戶端來測試信任操作。 |
| Registry 伺服器 | 一個本地的 Registry 服務。 |
| Notary 伺服器 | 負責處理管理信任所有繁重工作的服務。 |
這意味著您執行自己的內容信任 (Notary) 伺服器和 Registry。如果您僅使用 Docker Hub,則不需要這些元件,因為它們已經為您內建在 Docker Hub 中。然而,為了這個沙盒,您需要建立自己完整的模擬生產環境。
在 trustsandbox 容器內,您將與本地 Registry 互動,而不是與 Docker Hub 互動。這意味著您平時使用的映像檔儲存庫不會被使用。在您遊玩時,它們是受到保護的。
當您在沙盒中遊玩時,您也會建立根金鑰和儲存庫金鑰。沙盒被配置為將所有金鑰和檔案儲存在 trustsandbox 容器內。由於您在沙盒中建立的金鑰僅用於遊玩,因此銷毀容器也會將其一併刪除。
透過對 trustsandbox 容器使用 docker-in-docker 映像檔,您也不會用推播和拉取的映像檔污染您真實的 Docker daemon 快取。映像檔儲存在連接到此容器的匿名卷中,並且可以在您銷毀容器後進行刪除。
建立沙盒
在本節中,您將使用 Docker Compose 來指定如何設定並連結 trustsandbox 容器、Notary 伺服器和 Registry 伺服器。
建立一個新的
trustsandbox目錄並進入該目錄。$ mkdir trustsandbox $ cd trustsandbox使用您最喜歡的編輯器建立一個名為
compose.yaml的檔案。例如,使用 vim:$ touch compose.yaml $ vim compose.yaml將以下內容新增至新檔案中。
version: "2" services: notaryserver: image: dockersecurity/notary_autobuilds:server-v0.5.1 volumes: - notarycerts:/var/lib/notary/fixtures networks: - sandbox environment: - NOTARY_SERVER_STORAGE_TYPE=memory - NOTARY_SERVER_TRUST_SERVICE_TYPE=local sandboxregistry: image: registry:2.4.1 networks: - sandbox container_name: sandboxregistry trustsandbox: image: docker:dind networks: - sandbox volumes: - notarycerts:/notarycerts privileged: true container_name: trustsandbox entrypoint: "" command: |- sh -c ' cp /notarycerts/root-ca.crt /usr/local/share/ca-certificates/root-ca.crt && update-ca-certificates && dockerd-entrypoint.sh --insecure-registry sandboxregistry:5000' volumes: notarycerts: external: false networks: sandbox: external: false儲存並關閉檔案。
在您的本地系統上執行容器。
$ docker compose up -d第一次執行此操作時,會從 Docker Hub 下載 docker-in-docker、Notary 伺服器和 Registry 映像檔。
在沙盒中遊玩
現在一切都已設定完畢,您可以進入您的 trustsandbox 容器並開始測試 Docker 內容信任。從您的主機,取得 trustsandbox 容器的 shell。
$ docker container exec -it trustsandbox sh
/ #
測試一些信任操作
現在,從 trustsandbox 容器內拉取一些映像檔。
下載一個
docker映像檔來進行測試。/ # docker pull docker/trusttest docker pull docker/trusttest Using default tag: latest latest: Pulling from docker/trusttest b3dbab3810fc: Pull complete a9539b34a6ab: Pull complete Digest: sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a Status: Downloaded newer image for docker/trusttest:latest為其加上標籤,以便推送到我們的沙盒 Registry。
/ # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest啟用內容信任。
/ # export DOCKER_CONTENT_TRUST=1識別信任伺服器。
/ # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443此步驟僅在沙盒使用其自己的伺服器時才是必要的。通常情況下,如果您使用的是 Docker 公共 Hub,則不需要此步驟。
拉取測試映像檔。
/ # docker pull sandboxregistry:5000/test/trusttest Using default tag: latest Error: remote trust data does not exist for sandboxregistry:5000/test/trusttest: notaryserver:4443 does not have trust data for sandboxregistry:5000/test/trusttest您會看到一個錯誤,因為該內容尚未存在於
notaryserver上。推送並簽署受信任的映像檔。
/ # docker push sandboxregistry:5000/test/trusttest:latest The push refers to a repository [sandboxregistry:5000/test/trusttest] 5f70bf18a086: Pushed c22f7bc058a9: Pushed latest: digest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 size: 734 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 27ec255: Repeat passphrase for new root key with ID 27ec255: Enter passphrase for new repository key with ID 58233f9 (sandboxregistry:5000/test/trusttest): Repeat passphrase for new repository key with ID 58233f9 (sandboxregistry:5000/test/trusttest): Finished initializing "sandboxregistry:5000/test/trusttest" Successfully signed "sandboxregistry:5000/test/trusttest":latest因為這是您第一次推送此儲存庫,Docker 會建立新的根金鑰和儲存庫金鑰,並要求您提供用於加密它們的密碼短語。在此之後如果您再次推送,它只會要求您輸入儲存庫密碼短語,以便它可以解密金鑰並再次簽署。
嘗試拉取您剛剛推送的映像檔。
/ # docker pull sandboxregistry:5000/test/trusttest Using default tag: latest Pull (1 of 1): sandboxregistry:5000/test/trusttest:latest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926: Pulling from test/trusttest Digest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 Status: Downloaded newer image for sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 Tagging sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 as sandboxregistry:5000/test/trusttest:latest
使用惡意映像檔進行測試
當資料損壞且在啟用信任的情況下嘗試拉取時會發生什麼?在本節中,您將進入 sandboxregistry 並篡改一些資料。然後,您將嘗試拉取它。
保持
trustsandboxshell 和容器執行中。從您的主機開啟一個新的互動式終端機,並取得
sandboxregistry容器的 shell。$ docker container exec -it sandboxregistry bash root@65084fc6f047:/#列出您所推送的
test/trusttest映像檔的圖層。root@65084fc6f047:/# ls -l /var/lib/registry/docker/registry/v2/repositories/test/trusttest/_layers/sha256 total 12 drwxr-xr-x 2 root root 4096 Jun 10 17:26 a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 drwxr-xr-x 2 root root 4096 Jun 10 17:26 aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042 drwxr-xr-x 2 root root 4096 Jun 10 17:26 cc7629d1331a7362b5e5126beb5bf15ca0bf67eb41eab994c719a45de53255cd進入其中一個圖層的 Registry 儲存區(這在不同的目錄中)。
root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042將惡意資料新增至其中一個
trusttest圖層。root@65084fc6f047:/# echo "Malicious data" > data回到您的
trustsandbox終端機。列出
trusttest映像檔。/ # docker image ls | grep trusttest REPOSITORY TAG IMAGE ID CREATED SIZE docker/trusttest latest cc7629d1331a 11 months ago 5.025 MB sandboxregistry:5000/test/trusttest latest cc7629d1331a 11 months ago 5.025 MB sandboxregistry:5000/test/trusttest <none> cc7629d1331a 11 months ago 5.025 MB從我們的本地快取中移除
trusttest:latest映像檔。/ # docker image rm -f cc7629d1331a Untagged: docker/trusttest:latest Untagged: sandboxregistry:5000/test/trusttest:latest Untagged: sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 Deleted: sha256:cc7629d1331a7362b5e5126beb5bf15ca0bf67eb41eab994c719a45de53255cd Deleted: sha256:2a1f6535dc6816ffadcdbe20590045e6cbf048d63fd4cc753a684c9bc01abeea Deleted: sha256:c22f7bc058a9a8ffeb32989b5d3338787e73855bf224af7aa162823da015d44cDocker 不會重新下載已經快取的映像檔,但我們希望 Docker 嘗試從 Registry 下載被篡改的映像檔,並因為無效而拒絕它。
再次拉取映像檔。這會從 Registry 下載映像檔,因為我們的快取中沒有它。
/ # docker pull sandboxregistry:5000/test/trusttest Using default tag: latest Pull (1 of 1): sandboxregistry:5000/test/trusttest:latest@sha256:35d5bc26fd358da8320c137784fe590d8fcf9417263ef261653e8e1c7f15672e sha256:35d5bc26fd358da8320c137784fe590d8fcf9417263ef261653e8e1c7f15672e: Pulling from test/trusttest aac0c133338d: Retrying in 5 seconds a3ed95caeb02: Download complete error pulling image configuration: unexpected EOF拉取未完成,因為信任系統無法驗證該映像檔。
在沙盒中進行更多練習
現在,您的本地系統上已經擁有一個完整的 Docker 內容信任沙盒,請隨意遊玩並觀察它的運作方式。如果您發現任何 Docker 的安全性問題,請隨時發送電子郵件至 security@docker.com。
清理您的沙盒
當您完成並想要清理所有已啟動的服務以及已建立的任何匿名卷時,只需在建立 Docker Compose 檔案的目錄中執行以下指令:
$ docker compose down -v