Secrets は、パスワードやAPIキー、トークンなど、コードに書いてはいけない機密の値と、それを安全に扱う仕組みの総称です。 GitHub Actions をはじめ、多くのCI/CDサービスが同名の機能を持っています。
なぜコードに書いてはいけないのか
「private リポジトリだから大丈夫」は成り立ちません。理由は3つあります。
- 履歴に残る。あとで削除しても、過去のコミットから取り出せる
- 公開範囲は変わる。private を public にした瞬間に全部出る
- アクセスできる人が増える。外注・退職者・フォークにも渡る
Git の履歴からの完全削除は、履歴の書き換えが必要で非常に手間がかかります。入れないことが唯一の現実的な対策です。
入ってしまったらどうするか
万一コミットしてしまった場合、優先順位はこうです。
- まず値を無効化する(ローテーション)。履歴の掃除より先
- 新しい値を発行して Secrets へ登録する
- そのうえで履歴の扱いを検討する
削除だけして無効化しないのが最悪の対応です。値が生きている限り、履歴を見た誰でも使えます。
CI で使うときの注意点
Secrets はログ上でマスクされますが、万能ではありません。
- Base64 などで加工して出力するとマスクをすり抜けます
- 環境変数として渡した先のプロセスからは普通に読めます
- フォークからのプルリクエストには渡されないのが既定。ここを緩めると、外部の人が書いたコードに機密が渡ります
3つ目はrunnerの安全設計と直結する話です。緩める前に何が起きるかを理解してください。