?
This document uses PHP Chinese website manual Release
本頁面介紹了如何設置和使用沙盒進行信任實驗。沙箱允許您在本地配置和嘗試信任操作,而不會影響生產(chǎn)映像。
在通過這個沙盒之前,您應該仔細閱讀信任概述。
這些說明假定您正在Linux或macOS中運行。您可以在本地機器或虛擬機上運行此沙箱。您需要擁有在本地機器或虛擬機上運行docker命令的權限。
此沙箱需要您安裝兩個Docker工具:Docker Engine> = 1.10.0和Docker Compose> = 1.6.0。要安裝Docker引擎,請從支持的平臺列表中進行選擇。要安裝Docker Compose,請參閱此處的詳細說明。
最后,您需要在本地系統(tǒng)或VM上安裝一個文本編輯器。
如果您只是使用信任開箱即用,則只需要您的Docker Engine客戶端并訪問Docker Hub。沙盒模擬生產(chǎn)信任環(huán)境,并設置這些附加組件。
容器 | 描述 |
---|---|
trustsandbox | 具有最新版Docker Engine和一些預配置證書的容器。這是您的沙箱,您可以使用docker客戶端來測試信任操作。 |
注冊服務器 | 本地注冊表服務。 |
公證服務器 | 這項服務完成所有重要的管理信任 |
這意味著您將運行您自己的內容信任(公證)服務器和注冊表。如果您只使用Docker Hub工作,則不需要這些組件。它們?yōu)槟鴺嫿ㄔ贒ocker Hub中。但是,對于沙箱,您可以構建自己的整個模擬生產(chǎn)環(huán)境。
在trustsandbox
容器中,您與本地注冊表交互而不是Docker Hub。這意味著您的日常圖像存儲庫不被使用,他們受到保護
當你在使用沙盒時,你也會創(chuàng)建root和倉庫密鑰。沙箱被配置為存儲trustsandbox
容器內的所有密鑰和文件。由于您在沙盒中創(chuàng)建的鍵僅用于播放,因此銷毀容器也會破壞它們。
通過在trustsandbox
容器中使用docker-in-docker圖像,您不會使用任何您推送和拖動的圖像來毀壞您的真正docker守護進程緩存。這些圖像將存儲在附加到此容器的匿名卷中,并且可以在銷毀容器后銷毀。
在本節(jié)中,您將使用Docker Compose來指定如何設置trustsandbox
容器,公證服務器和注冊服務器并將其鏈接在一起。
1. 創(chuàng)建一個新的trustsandbox
目錄并進行更改。$ mkdir trustsandbox $ cd trustsandbox
2. 用你最喜歡的編輯器創(chuàng)建一個文件docker-compose.yml
。例如,使用vim:
$ touch docker-compose.yml $ vim docker-compose.yml
3. 將以下內容添加到新文件中。version: "2" services: notaryserver: image: dockersecurity/notary_autobuilds:server-v0.4.2 volumes: - notarycerts:/go/src/github.com/docker/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. 在本地系統(tǒng)上運行容器。$ docker-compose up -d
第一次運行這個時,docker-in-docker,Notary服務器和注冊表映像將首先從Docker Hub下載。在sandbox中播放現(xiàn)在所有東西都已設置好了,你可以進入你的trustsandbox
容器并開始測試Docker內容信任。在你的主機上,在trustsandbox
容器中獲取一個shell 。$ docker exec -it trustsandbox sh /#測試一些信任操作現(xiàn)在,你將從trustsandbox
容器中取出一些圖像。
6. 下載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
7. 標記為推送到我們的沙盒注冊表中:/#docker標記docker / trusttest sandboxregistry:5000 / test / trusttest:latest
8. 啟用內容信任。
/ # export DOCKER_CONTENT_TRUST=1
9. 識別信任服務器。/#export DOCKER_CONTENT_TRUST_SERVER = https:// notaryserver:4443這一步只是必要的,因為沙盒正在使用它自己的服務器。通常,如果您使用的是Docker公共集線器,則此步驟不是必需的。
10. 測試圖像。
/ # 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
。
11. 推送并簽署可信映像。/ # 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.
此密碼將用于保護簽名系統(tǒng)中最敏感的密鑰。請選擇一個長而復雜的密碼,并小心保持密碼和密鑰文件本身的安全和備份。強烈建議您使用密碼管理器來生成密碼并保持安全。將無法恢復此密鑰。您可以在您的配置目錄中找到該密鑰。輸入ID為27ec255的新根密鑰的密碼:為ID為27ec255的新根密鑰重復密碼:為ID為58233f9(sandboxregistry:5000 / test / trusttest)的新存儲庫密鑰輸入密碼:為ID為58233f9(sandboxregistry:5000 / test / trusttest)的新存儲庫密鑰重復密碼:完成初始化“sandboxregistry:5000 / test / trusttest”已成功簽署“sandboxregistry:5000 / test / trusttest”:latest
由于您第一次推送此存儲庫,因此docker會創(chuàng)建新的根和存儲庫密鑰并要求您輸入加密密碼。如果在此之后再次推送,它只會要求您輸入存儲庫密碼,以便它可以解密密鑰并再次簽名。對ID為58233f9(sandboxregistry:5000 / test / trusttest)的新存儲庫密鑰重復密碼:完成初始化“sandboxregistry:5000 / test / trusttest”成功簽名為“sandboxregistry:5000 / test / trusttest”:latest由于您要將此存儲庫Docker首次創(chuàng)建新的根和存儲庫密鑰,并要求您輸入密碼來加密密碼。如果在此之后再次推送,它只會要求您輸入存儲庫密碼,以便它可以解密密鑰并再次簽名。對ID為58233f9(sandboxregistry:5000 / test / trusttest)的新存儲庫密鑰重復密碼:完成初始化“sandboxregistry:5000 / test / trusttest”成功簽名為“sandboxregistry:5000 / test / trusttest”:latest
由于您要將此存儲庫Docker首次創(chuàng)建新的根和存儲庫密鑰,并要求您輸入密碼來加密密碼。如果在此之后再次推送,它只會要求您輸入存儲庫密碼,以便它可以解密密鑰并再次簽名。碼頭工人創(chuàng)建新的根和存儲庫密鑰,并要求您輸入用于加密它們的密碼。如果在此之后再次推送,它只會要求您輸入存儲庫密碼,以便它可以解密密鑰并再次簽名。碼頭工人創(chuàng)建新的根和存儲庫密鑰,并要求您輸入用于加密它們的密碼。如果在此之后再次推送,它只會要求您輸入存儲庫密碼,以便它可以解密密鑰并再次簽名。
12. 試著拉你剛才推送的圖片:
/ # 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
數(shù)據(jù)損壞時會發(fā)生什么情況,并且在啟用信任時嘗試將其拉出?在本節(jié)中,您將進入sandboxregistry
并篡改一些數(shù)據(jù)。然后,你試著拉它。
保持trustsandbox
外殼和容器運行。
從您的主機打開一個新的交互式終端,并在sandboxregistry
容器中獲得一個shell 。
$ docker 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
切換到其中一個圖層的注冊表存儲(請注意,它位于不同的目錄中):
root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
將惡意數(shù)據(jù)添加到其中一個trusttest
圖層:root @ 65084fc6f047:/#echo“惡意數(shù)據(jù)”>數(shù)據(jù)
回到你的trustsandbox
終端。
列出trusttest
圖像。/ # docker images | 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 rmi -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不會重新下載它已經(jīng)緩存的圖像,但我們希望Docker嘗試從注冊表中下載被篡改的圖像并拒絕它,因為它是無效的。
再次拉動圖像。這將從注冊表中下載圖像,因為我們沒有緩存它。
/ # 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
你會看到拉操作沒有完成,因為信任系統(tǒng)無法驗證圖像。
現(xiàn)在,您的本地系統(tǒng)上有一個完整的Docker內容信任沙箱,可以隨時使用它并查看它的行為。如果您發(fā)現(xiàn)Docker存在任何安全問題,請隨時通過security@docker.com向我們發(fā)送電子郵件。
完成后,要清理所有已啟動的服務和已創(chuàng)建的所有匿名卷,只需在創(chuàng)建Docker Compose文件的目錄中運行以下命令:
$ docker-compose down -v