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

    image.png

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


    image.png

    • 設定環境變數:

    DOCKER_CONTENT_TRUST=”1”
    DOCKER_CONTENT_TRUST_SERVER=”https://[harbor-ip]:[notary-port]”預設[notary-port]為4443

    • 再上傳一次,上傳前我們再打一個tag為signed,與之前的做區分。上傳時會要求輸入passphrase,保護加密的映像檔
    1. shawnho@shawnho-virtual-machine:~$ docker push harbor.syspks.com/notary-test/alpine:signed
    2. The push refers to a repository [harbor.syspks.com/notary-test/alpine]
    3. 503e53e365f3: Layer already exists
    4. signed: digest: sha256:3f3dfebcf0b9c1918072bc0969a93cb45aea4f4cdc25868db5729ae7488238df size: 528
    5. Signing and pushing trust metadata
    6. Enter passphrase for repository key with ID 6a292a9:
    7. Successfully signed "harbor.syspks.com/notary-test/alpine":signed

    看到我們成功的上傳了映像檔,並且Signed的綠勾勾也生效了。很不是一塊蛋糕的感覺。

    image.png

    • 下一步我們來看,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(封印)之前,即使專案管理者也無法砍掉該映像檔。


    image.png

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


    image.png

    • 封印解除(Unsigned):剛剛看到了,沒解除封印是很慘的。映像檔是完全砍不掉的。所以這裡我們來介紹如何解除notary封印
    1. 解除封印需要透過notary CLI。請由此下載。目前測試的版本為Notary client 0.6.1

    2. 安裝好了之後,我們可以先透過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』(如下圖)
    
    ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1779364/1653836054846-cebad029-cbeb-4a2b-88d6-fb91f97ef3c3.png#clientId=u75ad9913-2268-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ub80bd52f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1378&originWidth=1026&originalType=url&ratio=1&rotation=0&showTitle=false&size=240950&status=done&style=none&taskId=u59064a5d-9069-416b-80d0-d8ad827e1de&title=)<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
    

    image.png

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