Drone Secret 安全性管理

drone-logo_512 Drone 是一套以 Docker 容器技術為主的 CI/CD 開源專案,來聊聊 Drone 如何管理專案內的 Secret 資料,首先先來定義什麼是 Secret,舉個簡單例子,Drone 可以輕易完成基本打包+上傳到遠端伺服器,過程中一定會需要用到兩個 Plugin,就是 drone-scpdrone-ssh,而使用這兩個 plugin 需要有一組 Password 或是一把金鑰 (Public Key Authentication),在 Drone 可以透過後台 UI 介面將密碼或者是金鑰內容儲存在 Secret 設定頁面。預覽圖如下: Screen Shot 2017-11-20 at 9.10.10 AM

安全性?

但是透過 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-testingmhart/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 線上課程,如果已經購買的朋友們,可以直接看線上教學。
  • 我发现 Drone 好像没办法做到不指定 repo 设定 secret?比如说 telegram 插件,虽然有很多 repo,但是基本上 token 都不会变,目前只能给每一个 repo 手工添加。如果之后 revoke 了这个 token,每一个项目还要重新 update。