Drone 是一套以 Docker 容器技術為主的 CI/CD 開源專案,本篇來聊聊 Drone 如何管理專案內的 Secret 資料,首先先來定義什麼是 Secret,舉個簡單例子,如果你是透過 Drone 來完成基本打包+上傳到遠端伺服器,那一定會需要用到兩個 Plugin,就是 drone-scp 及 drone-ssh,而使用這兩個 plugin 需要有一組 Password 或是一把金鑰 (Public Key Authentication),在 Drone 裡面可以透過後台 UI 介面將密碼或者是金鑰內容儲存在 Secret 設定頁面。預覽圖如下:
安全性?
如果透過 Drone 後台新增的 Secret 資料都不是很安全,因為每個 Steps 都可以直接存取 Secret 資料。pipeline: test1: image: mhart/alpine-node:9.1.0 group: testing secrets: [ test46 ] commands: - echo "node.js" - echo $TEST46 test2: image: appleboy/golang-testing group: testing secrets: [ test46, readme ] commands: - echo "golang" - echo $TEST46 - echo $README從上面可以得知,透過
appleboy/golang-testing
或 mhart/alpine-node:9.1.0
都可以存取 test46
變數,這樣哪裡不安全?答案是,假設今天服務的是開源專案,這樣別人是不是可以發個 PR,內容新增一個步驟,將變數內容直接印出來即可。當然你可以把 Drone 的頁面關閉,只有管理者可以存取,但是這樣就失去開源專案的意義,因為貢獻者總該需要看到哪裡編譯錯誤,或者是測試失敗的地方。
透過 drone cli 管理
要解決安全性問題,必須要將 Secret 變數綁定只有特定 Image 才可以存取。而要做到此功能只能透過 drone cli 工具才可以完成。該如何使用 drone secret 指令呢?其實不會很難,drone cli 可以做的比 Web UI 還強大。所以關於 Secret 部分,我幾乎都是用 cli 來管理$ drone secret -h NAME: drone secret - manage secrets USAGE: drone secret command [command options] [arguments...] COMMANDS: add adds a secret rm remove a secret update update a secret info display secret info ls list secrets OPTIONS: --help, -h show help先假設
ssh-password
變數需要綁定在 appleboy/drone-ssh
映像檔上面,該如何下指令:
$ drone secret add \ --name ssh-password \ --value 1234567890 \ --image appleboy/drone-ssh \ --repository go-training/drone-workshop上述例子可以用在存密碼欄位,如果是想存
檔案
類型呢?也就是把金鑰 public.pem
給存進變數。這邊可以透過 @檔案路徑
的方式來存取該檔案,並且直接寫入到 Drone 資料庫。注意只要是 @
開頭,後面就必須接實體檔案路徑。
$ drone secret add \ --name ssh-key \ --value @/etc/server.pem \ --image appleboy/drone-ssh \ --repository go-training/drone-workshop