GitHub でシークレットを管理する

完了済み

シークレットは、組織、リポジトリ、またはリポジトリ環境で作成する変数です。 シークレットは、GitHub Actions ワークフローで使用できます。 GitHub Actions では、シークレットをワークフローに明示的に含める場合にのみシークレットを読み取ることができます。

組織レベルで格納されているシークレットの場合は、アクセス ポリシーを使用して、組織のシークレットを使用できるリポジトリを制御できます。 組織レベルのシークレットを使用すると、複数のリポジトリ間でシークレットを共有できます。 これにより、重複するシークレットを作成する必要が減ります。 組織のシークレットを 1 つの場所で更新すると、そのシークレットを使用するすべてのリポジトリ ワークフローで変更が有効になります。

環境レベルで格納されているシークレットの場合、必要なレビュー担当者がシークレットへのアクセスを制御できるようにします。 ワークフロー ジョブは、必要な承認者によって承認されない限り、環境シークレットにアクセスできません。

手記

リソースにアクセスするために Azure に直接認証するようにワークフローを構成できます。

シークレットの名前付け

シークレット名には、次の規則が適用されます。

  • 名前には、英数字 ([a-z]、[A-Z]、[0-9]) またはアンダースコア (_) のみを含めることができます。 スペースは使用できません。
  • 名前は、GITHUB_ プレフィックスで始めてはなりません。
  • 名前は数字で始めてはなりません。
  • 名前では大文字と小文字は区別されません。
  • 名前は、作成されるレベルで一意である必要があります。

GitHub でログ内のシークレットが編集されるようにするには、シークレットの値として構造化データを使用しないようにします。 たとえば、JSON またはエンコードされた Git BLOB を含むシークレットを作成しないようにします。

シークレットへのアクセス

ワークフロー ファイルの入力または環境変数としてシークレットを設定して、アクションで使用できるようにします。 ファイルを編集するアクセス権がある場合は、ワークフロー ファイル内のシークレットを使用して読み取ることができます。 詳細については、GitHub アクセス許可に関するセクションを参照してください。

ワークフロー実行がキューに登録されると組織とリポジトリのシークレットが読み取られ、環境を参照するジョブの開始時に環境シークレットが読み取られます。 REST API を使用してシークレットを管理することもできます。

資格情報のアクセス許可を制限する

可能な最小限のアクセス許可を付与することをお勧めします。 たとえば、個人の資格情報を使用する代わりに、デプロイ キーまたはサービス アカウントを使用します。 必要な場合は読み取り専用のアクセス許可を付与することを検討し、可能な限りアクセスを制限します。

個人用アクセス トークン (クラシック) を生成する場合は、必要なスコープを最も少なく選択します。 きめ細かい個人用アクセス トークンを生成する場合は、必要な最小限のアクセス許可とリポジトリ アクセスを選択します。

シークレットの作成

個人用アカウント リポジトリのシークレットまたは変数を GitHub で作成するには、リポジトリの所有者である必要があります。 組織のリポジトリのシークレットまたは変数を GitHub で作成するには、admin アクセス権が必要です。 最後に、REST API を使用して個人用アカウント リポジトリまたは組織リポジトリのシークレットまたは変数を作成するには、コラボレーターアクセス権が必要です。

シークレットは、次の方法で作成できます。

  • リポジトリの上部のナビゲーション バーで [設定] を 選択します。
  • 左側のナビゲーションの [ セキュリティ ] セクションで、[ シークレットと変数 ] ドロップダウンを選択します。
  • [アクション] を選択して、[アクションのシークレットと変数] ページにアクセスします。

ワークフローでのシークレットの使用

入力または環境変数としてシークレットを含むアクションを提供するには、secrets コンテキストを使用して、リポジトリに作成されたシークレットにアクセスできます。 次のコードは、ワークフロー内のシークレットにアクセスする例を示しています。

steps:
  - name: Hello world action
    with: # Set the secret as an input
      super_secret: ${{ secrets.SuperSecret }}
    env: # Or as an environment variable
      super_secret: ${{ secrets.SuperSecret }}

シークレットは、if: 条件では直接参照できません。 ジョブ レベルの環境変数としてシークレットを設定し、環境変数を参照してジョブのステップを条件付きで実行することを検討してください。

シークレットの値が設定されていない場合、シークレットを参照する式の戻り値 (例の ${{ secrets.SuperSecret }} など) は空の文字列です。