掩蓋你的蹤跡: 如何隱藏GitHub操作日誌中的內容

如何隱藏GitHub操作日誌中的內容

GitHub Actions是GitHub內建的持續整合和持續交付(CI/CD)平臺,使開發團隊能夠實現工作流程的自動化,包括構建、測試和部署管道。

使用GitHub Actions的一個缺點是,你的日誌是公開的,任何人都可以通過必要的許可權訪問它們。

為了防止敏感資料暴露在GitHub Actions的日誌中,你應該使用加密的環境變數來安全儲存敏感資料。這些加密的環境變數被稱為GitHub Actions Secrets。

本文告訴你如何使用GitHub Actions Secrets來防止敏感資訊出現在GitHub Actions日誌中。

  1. 先決條件
  2. 如何保持GitHub操作日誌的安全性
  3. 如何遮蔽日誌
  4. 如何使用GitHub Actions Secrets
  5. 如何遮蔽Secret

先決條件

要學習本教程:

  • 確保你有一個GitHub賬戶
  • 擁有一個現有的GitHub倉庫。對於本教程,你可以克隆這個演示倉庫。
  • 按照這些說明克隆演示倉庫

如何保持GitHub操作日誌的安全性

當你使用GitHub Actions構建工作流程時,任何訪問你倉庫的人都可以檢視日誌,所以它們不應該包括敏感資訊。然而,你不能就這樣刪除你的令牌、密碼和其他敏感資訊–你需要它們來進行測試和讓你的應用程式正常執行。

解決方案是用 ::add-mask:: 工作流命令來隱藏它們,該命令將星號(*)放在它所應用的敏感資料的位置上。

下面的部分向你展示瞭如何遮蔽日誌。

如何遮蔽日誌

首先,在你的文字編輯器中開啟克隆的版本庫。

在版本庫的根部建立.github/workflows/目錄,以儲存你的工作流檔案。然後,在.github/workflows目錄中建立一個名為hide-secrets.yml的新檔案,並在其中新增以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: echo a secret
run: echo "your secret token is verySecretToken"
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: echo a secret run: echo "your secret token is verySecretToken"
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: echo a secret
run: echo "your secret token is verySecretToken"

提交修改並推送到你的GitHub倉庫。更新後的GitHub操作工作流程是啟用的,每當你推送一個新的改動時,就會觸發。

在GitHub上開啟你的倉庫,選擇Actions標籤來檢視日誌。你的工作流程應該顯示如下:

預覽你的工作流程

預覽你的工作流程

檢查工作流程的日誌,你會發現列印在日誌上的 verySecretToken 字串。點選你的工作流程,然後點選任務名稱(print-secret-token)來檢視日誌。它應該看起來像這樣:

檢查你的GitHub動作日誌

檢查你的GitHub動作日誌

要隱藏它,使用 ::add-mask:: 命令,編輯hide-secrets.yml檔案,並在 print-secret-token 工作中新增一個新步驟:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: Add Mask
run: echo "::add-mask::verySecretToken"
- name: echo a secret
run: echo "your secret token is verySecretToken"
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: Add Mask run: echo "::add-mask::verySecretToken" - name: echo a secret run: echo "your secret token is verySecretToken"
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: Add Mask
run: echo "::add-mask::verySecretToken"
- name: echo a secret  
run: echo "your secret token is verySecretToken"

你應該在頂部新增 Add Mask 的步驟,因為掩碼只在 ::add-mask:: 執行後適用。如果你把Secret的 verySecretToken 放在 Add Mask 步驟之前,它仍然會出現未被掩碼。因此,為了確保該值被遮蔽,必須儘快使用 ::add-mask::

一旦你提交併釋出你的修改到你的GitHub倉庫,字串 verySecretToken 將被星號(*)取代,無論它出現在你的日誌中:

製作普通文字

製作普通文字

雖然這解決了遮蔽的問題,但卻引入了一個新的問題。你的 verySecretToken 仍然在工作流檔案中,所以任何能夠訪問原始碼的人都可以看到它。

遮蔽純文字的另一個缺點是,只遮蔽一個詞的一部分會隱藏它的所有例項。例如,以下面的句子為例: “Programming is great, but my most productive days are those when I do not write a program”。如果你遮蔽了 “program” 這個詞,它不僅會遮蔽句子末尾的這個詞,還會遮蔽它出現的任何地方,比如 “programming” 中。

如果你試圖遮蔽純文字,你會得到這樣的結果:

遮蔽純文字的問題

遮蔽純文字的問題

在GitHub動作日誌中隱藏敏感資料的更好方法是使用GitHub Actions Secrets,如下節所示。

如何使用GitHub Actions Secrets

你可以使用GitHub Actions Secrets來儲存任何你想在GitHub操作工作流程中使用的私人資料。Secret是在倉庫或組織層面以鍵/值對的形式建立的。

倉庫只能訪問在倉庫級別建立的Secret,而在組織級別建立的Secret則由組織內的所有倉庫共享。

在儲存庫級別建立的Secret可供任何有合作者角色許可權的人在操作中使用。你可以在任何時候改變你的Secret的值。然而,Secret不能被用於分支版本庫的工作流。

以下準則適用於命名Secret:

  • Secret名稱不能包含空格。
  • Secret名稱不區分大小寫。
  • Secret名稱不能以數字開頭。
  • Secret名稱不能以字首 GITHUB_ 開頭。
  • Secret名稱必須是唯一的 – 具有相同名稱的祕密不能存在於同一級別。

你可以在GitHub操作的工作流程中使用這些Secret,只需在Secret名稱前新增 secrets 作為YML變數,如下所示:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
${{ secrets.MY_SECRET_TOKEN }}
${{ secrets.MY_SECRET_TOKEN }}
${{ secrets.MY_SECRET_TOKEN }}

你也可以掩蓋Secret,以獲得更多的安全性,如下所示。

如何遮蔽secret

首先,建立一個GitHub secret。在你的 GitHub 倉庫中,點選設定標籤,從左邊的側邊欄中選擇Secrets Actions,然後點選New repository secret來新增一個新的secret:

建立一個新的版本庫secret

建立一個新的版本庫secret

給你的secret一個名字和一個secret值,然後點選Add secret

新增一個新的GitHub Secret

新增一個新的GitHub Secret

現在你已經建立了你的secret,並給了它 verySecretToken 值,你可以在你的工作流檔案中使用它。開啟你的 hide-secrets.yml 檔案,做如下修改:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: Add Mask
run: echo "::add-mask::${{ secrets.MY_SECRET_TOKEN }}"
- name: Echo a secret
run: echo "your secret token is ${{ secrets.MY_SECRET_TOKEN }}"
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: Add Mask run: echo "::add-mask::${{ secrets.MY_SECRET_TOKEN }}" - name: Echo a secret run: echo "your secret token is ${{ secrets.MY_SECRET_TOKEN }}"
name: Hide Sensitive Information
on: push
jobs:
print-secret-token:
runs-on: ubuntu-latest
steps:
- name: Add Mask
run: echo "::add-mask::${{ secrets.MY_SECRET_TOKEN }}"
- name: Echo a secret  
run: echo "your secret token is ${{ secrets.MY_SECRET_TOKEN }}"

這與之前的程式碼唯一的區別是,你用新建立的GitHub secret ” ${{secrets.MY_SECRET_TOKEN }} ” 替換了Secret令牌。

一旦你提交了程式碼並將修改推送到你的GitHub倉庫,你的Secret就被遮蔽了:

遮蔽的GitHub操作私鑰

遮蔽的GitHub操作私鑰

小結

你不能在你的GitHub操作日誌中洩露任何敏感資訊。純文字遮蔽是隱藏資料的一種方式,但任何訪問工作流檔案的人都可以看到你試圖隱藏的資訊。

正如本教程所展示的,GitHub Actions Secret是一種更安全的方法,可以保護你的敏感資料,然後將其遮蔽。

評論留言