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
心得
將 Drone 安裝在公司內部,又想要防止團隊成員直接拿到 Pem 資料,就必須透過 drone cli 工具來達成此功能,否則當同事可以輕易拿到這把 Key 時,就可以隨時登入機器惡搞。如果你拿 Drone 管理開源專案,更是要這麼做了。上述教學,我已經錄製成影片檔放在
Udemy 線上課程,如果已經購買的朋友們,可以直接看線上教學。