開発者は今でも API トークン、パスワード、認証情報をコードや .env ファイルに直接書き込み、Git にプッシュしています。個人プロジェクトでも本番でも同じです。

理由は単純です。自動化やデプロイのワークフローにシークレットを渡す適切な方法がないと、Git が唯一信頼できる選択肢に見えます。「あとで片付ける」。しかし Git に入ったものが本当に消えることはありません。

Git がシークレットに危険な理由

Git はバージョン管理システムです。コミットしたものはすべて履歴の一部になります。最新のコミットからトークンを消しても、過去のコミットには残っています。履歴はローカルリポジトリ、自動化エージェント、ミラー、フォークにコピーされます。シークレットがコミットに含まれた瞬間、それは露出したと考えるべきです。

リポジトリへのアクセスは、必要以上に広くなりがちです。外部委託者、一時的なコントリビュータ、テスト用フォーク — 見るべきでない認証情報を誰かが見られる可能性があります。

GitHub と GitLab は認証情報のスキャンを積極的に行います。プラットフォームがトークンを検知したら、侵害されたものとして直ちに失効させてください。

Git の代わりに必要なもの

シークレットは静的ファイルではありません。コードの外に置き、権限を制御し、ローテーションでき、環境ごとに分離できるアクセス資格情報です。

Vault や OpenBao を運用することもできますが、インフラ、保守、運用の負荷が伴います。

Semaphore には自動化ワークフローに直接組み込まれた Key Store があります。シークレットは次のいずれかに置けます。

  • Semaphore の暗号化データベース(デフォルト)
  • HashiCorp Vault、Devolutions、OpenBao などの外部ストア(PRO 機能)

シンプルな内蔵オプションを選ぶか、既存の企業向けシークレット管理と接続します。すぐ使えます。

Key Store が保存するもの

  • API トークン
  • SSH キー
  • パスワード
  • 環境変数
  • JSON などの設定ファイル

シークレットはコードベースに触れません。ジョブの実行時にだけ注入されます。開発、ステージング、本番で別の認証情報を定義し、特定のユーザー、チーム、ワークフローにスコープできます。

実際の流れ

Key Store を作成し、シークレットを追加し、ワークフロー設定で参照します。Semaphore が実行時に値を注入します。

AWS へのデプロイでは、例えばアクセスキーはそのジョブが動いている間だけ、そのジョブを実行するエージェント上にだけ存在します。開発者はシークレットを見ません。Git には載りません。

UI から Secret を作成: Secrets → New Secret で変数を追加します。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

ワークフローでシークレット名を参照すると、Semaphore が実行時に環境変数として注入します。

blocks:
  - name: Deploy
    task:
      secrets:
        - name: aws-credentials
      jobs:
        - name: deploy
          commands:
            - aws s3 sync ./dist s3://my-bucket

SSH 用には秘密鍵ファイルを含むシークレットを作成します。Semaphore が自動的に ~/.ssh/ に配置します。

blocks:
  - name: Deploy via SSH
    task:
      secrets:
        - name: production-ssh-key
      jobs:
        - name: deploy
          commands:
            - ssh deploy@production-server "cd /app && git pull"

Key Store と他の方法

方法 安全 可視性 失効可能
Git 内の .env いいえ チーム全体 いいえ
GitHub Actions Secrets 条件付き 場合による はい
Semaphore Key Store はい スコープ付き はい

さらに、コードを触らずにトークンをローテーションし、ロールやチームでアクセスを制御し、環境ごとに別のシークレットを使えます。

まとめ

Git にコミットされたトークンは侵害されたものとして扱うべきです。履歴はコントリビュータ、フォーク、ミラー、自動化エージェントに広がり — コピーごとに露出ポイントが増えます。

Key Store はシークレットをリポジトリの外に保ち、実行時にだけ注入し、ローテーションとアクセスを制御します。Ansible、Terraform、OpenTofu、PowerShell の自動化を行うチームにとって、これはオプションのインフラではなく基盤です。

Twitter

案 1

Git にシークレット = シークレットは露出。永遠に。

Git の履歴はフォーク、ミラー、CI エージェントに複製されます。コミットされた 1 つのトークンは、いつまでも侵害されたままです。

なぜ繰り返されるのか、Semaphore Key Store がどう解決するかを書きました。

案 2

Semaphore Key Store のシークレットの扱い:

→ トークン、SSH キー、環境変数をリポジトリ外に保存

→ ジョブ設定で {{ your_secret }} と参照

→ 実行時、そのジョブ用にエージェント上だけ注入

開発者は見えません。Git には載りません。
詳細記事 → [リンク]

LinkedIn

Semaphore Key Store の仕組みと、なぜそれがあるのかをまとめた記事を公開しました。

要約: シークレットは Git に置くべきではありません。決して。しかし適切な代替がないと、開発者はそこに置き続けます。

Key Store は Semaphore の自動化ワークフローに直接組み込まれます。流れは次のとおりです。

  1. UI で Key Store を作成
  2. シークレットを追加 — API トークン、SSH キー、環境変数、設定ファイル
  3. ジョブ設定で {{ your_secret }} と参照
  4. Semaphore が実行時に、エージェント上で、そのジョブのためだけに注入

開発者はシークレットを見ません。リポジトリにも載りません。ジョブが終われば実行環境から消えます。

ユーザー、チーム、環境ごとにアクセスを制限できます。コード 1 行も変えずにトークンをローテーション。dev、ステージング、本番で別の認証情報。

Ansible、Terraform、OpenTofu を使うチームにとって、「動く」と「本当に安全」の間に欠けていたピースです。

詳細記事 →

You might also like