A human and robot hand drawing each other

シークレットと変数で CI/CD を安全にする

このガイドでは、Organization レベルで極秘情報を管理する方法、ワークフローでの変数の役割を理解する方法、堅牢なクラウド認証のために OpenID Connect (OIDC) を実装する方法について説明します。このガイドは、自動化プロセスでセキュリティと効率を両方強化するように設計されています。


このガイドの学習内容

  • Organization レベルでシークレットを安全に管理し、全てのリポジトリに統一された大まかなセキュリティ フレームワークを提供する方法を学びます。

  • 変数の役割、シークレットとの違い、ワークフローの効率を上げるために変数をどのように活用するかを理解する

  • OpenID Connect を実装してクラウド プロバイダーと堅牢で自動化された認証を実現し、サードパーティのリスクと管理オーバーヘッドを削減する方法を学びます。


組織のシークレットと変数

シークレット

自動ワークフローを保護する場合、シークレットは絶対に守らなければなりません。これらの暗号化されたアセットには、API トークンや資格情報などの極秘情報が含まれています。Organization レベルでシークレットを追加および管理する方法を説明します。

自動ワークフローを保護する場合、シークレットは絶対に守らなければなりません。これらの暗号化されたアセットには、API トークンや資格情報などの極秘情報が含まれています。Organization レベルでシークレットを追加および管理する方法を説明します。

1. 設定に移動します。

組織の設定に移動します。「シークレットと変数」セクションで [GitHub Actions] タブを選択してダッシュボードにアクセスすると、全ての Organization レベルのシークレットが表示されます。

2. シークレットを追加します。

[新しい組織シークレット] をクリックします。シークレットには分かりやすい名前を付けます。たとえば、AzureのAPIトークンの場合は、Azure_API_Token のような名前にします。

3. 値を入力します。

シークレットの値を入力します。これは、シークレット名のマッピング先となる重要な暗号化された情報です。機密性を保つようにしてください。

4. スコープを定義します。

このシークレットを全てのリポジトリからアクセス可能にする、プライベートまたは内部リポジトリに制限する、または特定のリポジトリを手動で選択できます。Organization レベルで設定する場合は、スコープについて戦略的に検討します。

5. 確定します。

[シークレットを追加] をクリックして作成を完了します。

変数

変数の役割はシークレットとは少し異なりますが、ワークフローの自動において同様に重要です。変数は通常、機密性は低いがプロセスにとって不可欠な情報に使用されます。変数は、組織内の複数のリポジトリがアクセスする必要がある可能性のあるパブリック ユーザー名または設定のようなものと考えてください。同じ方法でスコープを定義し、全てのリポジトリにアクセス可能か、特定のリポジトリのみにアクセス可能かを決定します。

リポジトリレベルと環境レベルの設定

組織の構成によってステージが設定されますが、リポジトリと環境のレベルできめ細かい制御が行われます。ここで、さまざまなプロジェクトやプロジェクトのステージごとに特定の要件を指定できます。 

リポジトリ レベルの設定を定義する

1. リポジトリに移動します。

シークレットと変数を設定または変更する必要があるリポジトリに移動します。リポジトリ内で、[設定] タブに移動し、「シークレットと変数」セクションを見つけます。

2. 追加または編集します。

Organization レベルと同様に、ここで新しいシークレットや変数を追加できます。操作は同じです。シークレットまたは変数に名前を付け、その値を指定し、そのスコープを定義します。[GitHub Actions] タブをクリックしてから、MY_GITHUB_SECRET の名前のシークレットを追加し、非表示にする値を任意の値に割り当てます (これについては後ほど説明します)。

シークレット vs 変数のデモ 

リポジトリ レベルのシークレットを追加したら、簡単なデモを実行して、GitHub Actions がシークレットと環境変数を処理する方法にどのような違いがあるか確認しましょう。

1. ワークフロー ファイルを作成します。

新しいワークフロー ファイルを作成する方法を再確認する場合は、自動化の基本のラーニング パスを参照してください。

以下の YAML 構成をデモ ワークフローの新しいワークフロー ファイルに貼り付けます。コメントで各セクションの機能について説明します。

name: Echo Secrets and Variables
on:
  push:
    branches:
      - main  # Trigger this action when changes are pushed to the main branch


jobs:
  build:
    runs-on: ubuntu-latest



    env:
      MY_VARIABLE: "This is not a secret"  # This is a public environment variable



    steps:
    - name: Checkout code
      uses: actions/checkout@v2



    - name: Echo environment variable
      run: echo "My environment variable is $MY_VARIABLE" # This is your variable that will not be masked
      
    - name: Echo GitHub secret
      run: echo "My GitHub secret is ${{ secrets.MY_GITHUB_SECRET }}" # This is the secret you added in a previous step

2. ワークフローを実行します。

この YAML ファイルをリポジトリにプッシュした後、次の手順に従ってログを表示します。

  • GitHub リポジトリの [GitHub Actions] タブに移動します

  • 関連するワークフロー実行を選択します

  • ビルド ジョブをクリックします

  • 下にスクロールして、Echo 環境変数と Echo GitHub シークレット ステップの両方のログを表示します。

  • ここでは、GitHub Actions でのシークレットと環境変数の処理方法の違いを確認します。

無事、シークレットは守られました。 

環境レベル:

1. [環境] タブを見つけます。

引き続きリポジトリ設定で、[環境] タブを見つけます。シークレットを保存する環境を選択します。

2. シークレットを追加します。

[新しい環境シークレット] をクリックし、前と同じ手順でシークレットを追加します。環境固有のシークレットは、その特定の環境でのワークフロー中に、同じ名前を持つ組織またはリポジトリのシークレットを上書きします。

Organization レベルから始めてリポジトリと環境の詳細まで掘り下げる階層型アプローチで設定を行うことにより、自動ワークフローのための堅牢で高度にカスタマイズ可能なセキュリティ フレームワークを確立できます。このきめ細かな制御により、最小権限の原則を遵守し、本当に必要な場合にのみシークレットと変数を公開できるようになります。データベース接続文字列を本番環境に制限する場合でも、単一のリポジトリに対してのみシークレットを指定する場合でも、このアプローチであれば機能性を犠牲にすることなく最適なセキュリティが確保されます。

OpenID Connect によるセキュリティの向上

OpenID Connect (OIDC) は、企業のセキュリティと効率性にさまざまなメリットをもたらします。認証トークンは選択したクラウド環境で生成および保存されるため、サードパーティのシークレット管理に関連するリスクを効果的に排除できます。これらのトークンは短期間で自動的に期限切れになるため、手動でのシークレットをローテーションするリスクと管理上の負担を最小限に抑えることができます。OIDC は、Microsoft Azure、Amazon Web Services (AWS)、Google Cloud Platform (GCP) などの OIDC 準拠のクラウド プロバイダー向けにマルチクラウド サポートも提供しています。このサポートにより、ワークフローが動作しているかどうかに関係なく、一貫性のある安全な認証プロセスが実現します。本質的に、OIDC はセキュリティ態勢を強化すると同時に、多様なクラウド環境にわたる認証メカニズムを簡素化します。

GitHub App の認証情報には、リポジトリとコードを大規模に管理するための Organization レベルの権限が必要でした。HashiCorp Vault と OpenID Connect を使用することで、高いセキュリティレベルを維持しています。これらの認証情報は terraform apply を実行するワークフローからのみアクセスでき、自動化リポジトリのデフォルト ブランチでのみアクセスできるようにシステムを設定しました。このようにアクセスの範囲を狭めることによって、内部的にも、これらの高い権限を持つトークンが特定の厳重に管理されたシナリオで確実に保護されます。

Sanjito Kurniawan
Sanjito Kurniawan // Senior Platform Engineer // HelloFresh

次の内容: GitHub Actions での高度なワークフローの構成

シークレットと変数を使用して CI/CD パイプラインを保護できるようになったところで、さらに掘り下げていきましょう。次のガイドでは、本格的にワークフローを最適化するために必要なツールを紹介します。このガイドは、ワークフローのコンカレンシーの管理や条件文の活用から、社内スクリプトによるワークフローの拡張まで、開発パイプラインを加速することを目的としています