在內容信任沙盒中操作

本頁面介紹瞭如何設定和使用沙盒來體驗信任功能。該沙盒允許您在本地配置和嘗試信任操作,而不會影響您的生產映象。

在體驗此沙盒之前,您應該已經閱讀了信任概述

先決條件

這些說明假設您在 Linux 或 macOS 上執行。您可以在本地計算機或虛擬機器上執行此沙盒。您需要有許可權在本地計算機或虛擬機器中執行 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 伺服器一個本地註冊中心服務。
Notary 伺服器負責管理信任所有繁重工作的服務

這意味著您執行自己的內容信任(Notary)伺服器和註冊中心。如果您只使用 Docker Hub,您將不需要這些元件。它們已經內置於 Docker Hub 中。然而,對於沙盒,您將構建自己的完整的模擬生產環境。

trustsandbox 容器內,您與本地註冊中心互動,而不是 Docker Hub。這意味著您日常的映象倉庫不會被使用。在您體驗時,它們是受保護的。

當您在沙盒中操作時,您還會建立根金鑰和倉庫金鑰。沙盒被配置為將所有金鑰和檔案儲存在 trustsandbox 容器內。由於您在沙盒中建立的金鑰僅供體驗使用,銷燬容器也會銷燬它們。

透過為 trustsandbox 容器使用 docker-in-docker 映象,您也不會用任何您推送和拉取的映象汙染您真實的 Docker 守護程序快取。這些映象儲存在附加到此容器的匿名卷中,並且可以在您銷燬容器後被銷燬。

構建沙盒

在本節中,您將使用 Docker Compose 來指定如何設定和連結 trustsandbox 容器、Notary 伺服器和 Registry 伺服器。

  1. 建立一個新的 trustsandbox 目錄並進入該目錄。

     $ mkdir trustsandbox
     $ cd trustsandbox
    
  2. 使用您喜歡的編輯器建立一個名為 compose.yaml 的檔案。例如,使用 vim

     $ touch compose.yaml
     $ vim compose.yaml
    
  3. 將以下內容新增到新檔案中。

     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
    
  4. 儲存並關閉檔案。

  5. 在您的本地系統上執行容器。

     $ docker compose up -d
    

    首次執行時,會從 Docker Hub 下載 docker-in-docker、Notary 伺服器和註冊中心映象。

在沙盒中執行

現在一切都設定好了,您可以進入您的 trustsandbox 容器並開始測試 Docker 內容信任。從您的主機,進入 trustsandbox 容器的 shell。

$ docker container exec -it trustsandbox sh
/ #

測試一些信任操作

現在,從 trustsandbox 容器內部拉取一些映象。

  1. 下載一個 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
    
  2. 為其打上標籤,以便推送到我們的沙盒註冊中心

     / # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
    
  3. 啟用內容信任。

     / # export DOCKER_CONTENT_TRUST=1
    
  4. 識別信任伺服器。

     / # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
    

    此步驟僅在沙盒使用其自己的伺服器時才需要。通常,如果您使用的是 Docker 公共 Hub,則不需要此步驟。

  5. 拉取測試映象。

     / # 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 上。

  6. 推送並簽署受信任的映象。

     / # 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 會建立新的根金鑰和倉庫金鑰,並要求您輸入用於加密它們的密碼。如果您在此之後再次推送,它只會要求您輸入倉庫密碼,以便解密金鑰並再次簽名。

  7. 嘗試拉取您剛剛推送的映象

     / # 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 並篡改一些資料。然後,您將嘗試拉取它。

  1. 保持 trustsandbox 的 shell 和容器執行。

  2. 從您的主機開啟一個新的互動式終端,並進入 sandboxregistry 容器的 shell。

    $ docker container exec -it sandboxregistry bash
    root@65084fc6f047:/#
    
  3. 列出您推送的 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
    
  4. 進入其中一個層的註冊中心儲存目錄(這在一個不同的目錄中)

    root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
    
  5. 向其中一個 trusttest 層新增惡意資料

    root@65084fc6f047:/# echo "Malicious data" > data
    
  6. 回到您的 trustsandbox 終端。

  7. 列出 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
    
  8. 從我們的本地快取中移除 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:c22f7bc058a9a8ffeb32989b5d3338787e73855bf224af7aa162823da015d44c
    

    Docker 不會重新下載它已經快取的映象,但我們希望 Docker 嘗試從註冊中心下載被篡改的映象,並因為它無效而拒絕它。

  9. 再次拉取映象。這將從註冊中心下載映象,因為我們沒有快取它。

    / # 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