iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
DevOps

菜逼八用Github Actions系列 第 8

Day 08 - 儲存敏感資訊的secret

  • 分享至 

  • xImage
  •  

目錄

摘要

在上一篇我們學到了context是什麼,以及有哪些常見的context可以使用

在這篇我們會來了解一下一種用於儲存敏感資訊的叫做secret的變數

secret是什麼

secret是一種用於存敏感資訊的變數,當建立完以後,在workflow內加上permissions屬性就可以在Github Actions上讀取它

secret with mask

上圖圈起來的就是secret,***則是Github Actions自動幫它上的mask

建立後可以隨時改掉值,不過看不到之前的值,在edit頁只會顯示一個空空的textarea

根據scope,secret可以分為organization level、environment level和repo level 3種

  • repo level

    • 常用的secret
    • 優先序最低 (同名時會被以下兩個覆蓋掉)
    • free plan可以用
    • 最多100個
  • environment level

    • 必須要有owner權限的人才能新增、編輯
    • free plan的public repo可以用
    • 最多100個
  • organization level

    • 能被多個repo共用
    • 優先序最高 (同名時會覆蓋掉以上兩個)
    • 必須要有owner權限的人才能新增、編輯
    • free plan無法使用這個功能
    • 最多1000個

命名

  • 不以GITHUB_、數字開頭
  • 只能有英、數字、下底線,且大小寫敏感
  • 在同個level內,每個secret的名稱不可重複
    • name is not unique

建立secret

repo level

選擇repo > setting > secret and variables > actions

https://ithelp.ithome.com.tw/upload/images/20240805/20135568aCAAlIWDrm.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568IZcqHRhqE6.png

environment level

org > setting (> 建立環境) > 選擇環境

https://ithelp.ithome.com.tw/upload/images/20240805/20135568AVluXyld4h.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568UZyCTqfx7n.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568Y3BgnAs7ut.png

organization level

org > setting > security > secret and variables

https://ithelp.ithome.com.tw/upload/images/20240805/20135568sDd4XpDafd.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568S2NKlC4Z3U.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568UbZiMV11do.png

https://ithelp.ithome.com.tw/upload/images/20240805/20135568DLULSv3Ze7.png

更詳細的操作可以看Manage Secrets in GitHub

使用secret

假設我的repo裡的程式碼有一段要打TDX的API

是我不想要把client secret暴露在程式碼內,那顯然新增.env,再把client secret放進去也不是個好主意 (如果不是敏感資訊就算了,但偏偏它就是)

不過可以這樣做

export const getAccessToken = async () => {
  const { data } = await axios({
    method: "POST",
    url: `https://tdx.transportdata.tw/auth/realms/TDXConnect/protocol/openid-connect/token`,
    data: {
      grant_type: "client_credentials",
      client_id: "your client id",
      // Next或者Remix則改成process.env.TDX_CLIENT_SECRET
      client_secret: import.meta.env.VITE_PUBLIC_TDX_CLIENT_SECRET,
    },
    headers: { "content-type": "application/x-www-form-urlencoded" },
  });

  return data.access_token;
};

看到這裡你可能會想「WTF?!.env不是不上git嗎」、「WTF?!不是說不放在.env嗎」

事實上我們是要透過Github Actions把client secret寫入.env

https://ithelp.ithome.com.tw/upload/images/20240805/20135568ukmWmaxk1B.png

- name: Set secret for calling API
  env: 
    clientSecret: ${{secrets.TDX_CLIENT_SECRET}}
  run: | 
    echo VITE_PUBLIC_TDX_CLIENT_SECRET=${clientSecret}

這邊可能會有人覺得疑惑為什麼要多一步把secret放到step的環境變數

那是因為如果沒有放進去的話,會被log記錄到,這可能導致安全問題

但千萬記得放入env後不要把它印出來,因為這時Github Actions就不會自動用mask把它遮住


上一篇
Day 07 - context
下一篇
Day 09 - Github Actions的表達式 & function
系列文
菜逼八用Github Actions30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言