CNCF的十個容器導入地圖,應該大家都不陌生吧?今天我們來聊的就是最後一個地圖:Notary。
什麼是Notary?
Notary是一個由Docker推出,捐給CNCF的開源專案。這個專案的主要目的是為了增加開發者對於所使用映像檔的安全性,保證所使用的映像檔與當初內容提供者是相同的。
這個機制,主要是源於更新框架(The Update Framework, a.k.a TUF)所完成的一個映像檔簽證。TUF這個開源專案和Notary目前一起進到了CNCF基金會中,成為孵化專案之一。
Notary對企業的益處為何?<請見ithome的報導>
映像檔是一個容易上傳/取得,同時也是容易修改的來源檔案。駭客可以很容易的透過修改映像檔layer,或是主動上傳的方式,送入被感染的映像檔。當該映像檔被用到生產環境中,甚至被作為其他映像檔的基礎映像檔,那駭客就可以輕易地控制企業內的整個容器環境。
Notary主要的功能,除了可以用來辨識映像檔來源外,也可以保證被簽署過的映像檔,在沒有原發布者的同意下,其layer是不能被攥改的。通常搭配弱掃一起使用,可以在企業內部,達成儘早發現問題,儘速修補的好處。
該怎麼運用這麼厲害的功能呢?
在PKS內所附的Harbor,就提供了Notary和弱掃的功能。弱掃的功能介紹,如果有人想知道,請留言在本文章的下方,我會再寫給大家。這一篇主要著重在Notary的使用上。這裡介紹的版本資訊為:
- PKS 1.3.0
- Harbor v.1.7.1
- Notary v.0.6.1(內含在Harbor v.1.7.1中)
詳細使用方式如下:
- 在Harbor上,開立一個專案(Notary-Test),勾選Enable Content Trust

- 測試上傳一個alpine的映像檔:怎麼還是沒有Signed!? 因為我們還沒打開對應的環境變數

- 設定環境變數:
DOCKER_CONTENT_TRUST=”1”
DOCKER_CONTENT_TRUST_SERVER=”https://[harbor-ip]:[notary-port]”預設[notary-port]為4443
- 再上傳一次,上傳前我們再打一個tag為signed,與之前的做區分。上傳時會要求輸入passphrase,保護加密的映像檔
shawnho@shawnho-virtual-machine:~$ docker push harbor.syspks.com/notary-test/alpine:signedThe push refers to a repository [harbor.syspks.com/notary-test/alpine]503e53e365f3: Layer already existssigned: digest: sha256:3f3dfebcf0b9c1918072bc0969a93cb45aea4f4cdc25868db5729ae7488238df size: 528Signing and pushing trust metadataEnter passphrase for repository key with ID 6a292a9:Successfully signed "harbor.syspks.com/notary-test/alpine":signed
看到我們成功的上傳了映像檔,並且Signed的綠勾勾也生效了。很不是一塊蛋糕的感覺。

- 下一步我們來看,Notary的威力:
範例1:開發人員試著由這個專案,拉走一個unsigned的image,與一個signed的image。如果Notary運行正常,則前者會失敗,後者成功
shawnho@shawnho-virtual-machine:~/k8s/nginx$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shawnho@shawnho-virtual-machine:~/k8s/nginx$ docker pull harbor.syspks.com/notary-test/alpine:untagged
Error response from daemon: unknown: The image is not signed in Notary.
shawnho@shawnho-virtual-machine:~/k8s/nginx$ docker pull harbor.syspks.com/notary-test/alpine:signed
signed: Pulling from notary-test/alpine
Digest: sha256:3f3dfebcf0b9c1918072bc0969a93cb45aea4f4cdc25868db5729ae7488238df
Status: Downloaded newer image for harbor.syspks.com/notary-test/alpine:signed
- 範例2:我們該映像檔的兩個image一起選起來,並按下『DELETE』,我們會發現,都無法刪除。與我之前的預期不同。我原以為untagged的可以刪除。所以在同一個映像檔底下,如果有任何一個tag是經過Notary Signed過的,在解除signed(封印)之前,即使專案管理者也無法砍掉該映像檔。

- 範例3:在該專案底下的兩個不同的映像檔,其中alpine專案如上,busybox裡面含了一個unsigned的映像檔。結果busybox可以成功被清除,但alpine不行。

- 封印解除(Unsigned):剛剛看到了,沒解除封印是很慘的。映像檔是完全砍不掉的。所以這裡我們來介紹如何解除notary封印
解除封印需要透過notary CLI。請由此下載。目前測試的版本為Notary client 0.6.1
安裝好了之後,我們可以先透過notary list 查詢現有的notary映像檔與tag: ```shell shawnho@shawnho-virtual-machine:~$ notary -s https://harbor.syspks.com:4443 -d ~/.docker/trust —tlscacert ~/.docker/tls/harbor.syspks.com:4443/ca.crt list harbor.syspks.com/notary-test/alpine Enter username: [harbor’s admin-account] Enter password: NAME DIGEST SIZE (BYTES) ROLE
signed 3f3dfebcf0b9c1918072bc0969a93cb45aea4f4cdc25868db5729ae7488238df 528 targets
- s (server): notary server位置
- -d: trust data會存放的檔案夾
- — tlscacert:notary所信任的ca憑證。如果你的harbor是透過opsmgr佈建出來的,恭喜憑證可直接由opsmgr下載,下載處在opsmgr右上方『Settings』->『Advanced』->『Download Root CA Cert』(如下圖)
<br />由於notary的命令每次都需要帶以上三個參數,建議直接做一個alias如下:<br />alias notary=’notary -s [https://harbor.syspks.com:4443](https://harbor.syspks.com:4443/) -d ~/.docker/trust — tlscacert ~/.docker/tls/harbor.syspks.com:4443/ca.crt’
- 解除封印:透過上方的alias,解除封印命令如下。有一個很重要的點,在notary remove命令中,tag是分開的,不像前面是帶著冒號的。輸入後,如果設定一切正確,就會詢問harbor的帳密以及剛剛加密時,要求的passphrase。-p是讓解除封印後,映像檔能夠立即重新發佈。執行結果如下所示。
```shell
shawnho@shawnho-virtual-machine:~$ notary remove harbor.syspks.com/notary-test/alpine signed -p
Removal of signed from harbor.syspks.com/notary-test/alpine staged for next publish.
Auto-publishing changes to harbor.syspks.com/notary-test/alpine
Enter username: admin
Enter password:
Enter passphrase for targets key with ID 6a292a9:
Successfully published changes for repository harbor.syspks.com/notary-test/alpine

- 最後,就可以成功移除整個專案囉!大功告成,來杯咖啡吧!
