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