GitHub の Secrets に JSON などの構造化データを登録してはいけない


Posted at: 2023-01-03

GitHub
GitHub logo

JSON などは GitHub Secrets にそのまま登録してはいけない

表題の通り、JSON をはじめとした構造化データを GitHub の Secrets に登録することは非推奨です。 これは GitHub 公式ドキュメントで、以下の通り明言されています1

To help ensure that GitHub redacts your secret in logs, avoid using structured data as the values of secrets. For example, avoid creating secrets that contain JSON or encoded Git blobs.

具体的には、一例として actions/runner の Issue で問題になったケースが報告されています。

I have this json secrets. And this will give readable prints which is not very secret. Only { and } are masked.

Registered secrets

{
  "id": 123,
  "uname": "john-doe",
  "password": "foobar"
}

Workflow example

      - run:  echo "${{ secrets.ITEM_JSON }}"

Output

***
  id: 123,
  uname: john-doe,
  password: foobar
***

このケースでは、Secrets に登録した JSON のうち {} のみが秘匿化され、本当に隠したいはずのその内側の key / value ペアはそのまま出力されてしまっています。 このように、JSON 形式の Secrets を登録しても、適切に Secrets が秘匿化されずに露出するなどの問題が起きる場合があります。

JSON 形式の秘密情報を GitHub Secrets に登録している記事をいくつか見かけますが、非推奨なのでご注意ください

代替案

では JSON のようなデータを Secrets で扱いたい場合どうしたら良いかですが、公式ドキュメントに記載がある方法を使えます。

1. Base64 でフラットな構造にする

例えば、Base64 でフラットなデータ構造にして登録することは可能です。 そしてそのデータを取り出す時にデコードして利用します。

cf. https://docs.github.com/en/actions/security-guides/encrypted-secrets#storing-base64-binary-blobs-as-secrets

base64 コマンドの利用方法は base64(1) の man などを参照してください。

なお、Base64 エンコーディングは容易にデコード可能なので、Base64 エンコードした値が露出することは必ず避けてください
言うまでもなく、Base64 でデコードした値ももちろん露出させてはいけません

Base64 エンコーディング時の注意点

Base64 エンコードしたデータを Secrets に登録する際は、エンコードした値から改行コードを取り除いてから Secrets に登録 する必要があります。
これをしないと、デコード時に改行コード部分までで区切られてしまい、中途半端なデータしか得られませんのでご注意ください。

2. 暗号化したファイルをリポジトリに登録し、そのファイルの複合キー・パスフレーズを Secrets に登録する

大きいサイズの Secrets を利用する workaround として紹介されているものですが、Storing large secrets の方法も使えます。

結論

JSON をはじめとする構造化データは GitHub Secrets に登録する際は気をつけてください。
Base64 でフラットな構造にする、暗号化したファイルの複合キー・パスフレーズを Secrets に登録して利用するなどの workaround が公式ドキュメントで紹介されているのでそちらを参照して利用してください。

About This Blog

Blog: 学習メモや読書記録など

Zenn: 体系的にまとめたもの

Qiita: 過去記事

はてなブログ: 過去記事


ご意見・ご質問などは Twitter にお送りください

Author

大学院修士課程で認知/教育心理学を学びました

1社目: 保守コンサルタント

2社目: QAエンジニア

Links

Tags

Discord (1)Docker (1)GatsbyJS (2)GitHub (2)Markdown (2)React (2)Shell Script (1)TypeScript (1)VS Code (1)multipass (1)