GitHub Actions の支払いを管理する GitHubは、macOSランナーのホストにMacStadiumを使用しています。
暗号化されたシークレットについて
シークレットは、リポジトリまたは Organization で作成する暗号化された環境変数です。 作成したシークレットは、GitHub Actions ワークフローで使用できます。 GitHubは、 libsodium sealed boxを使って、シークレットがGitHubに到達する前に暗号化され、ワークフローで使われるまで暗号化されたままになっていることを保証する手助けをします。
Organizationレベルで保存されたシークレットについては、アクセスポリシーを使ってどのリポジトリがOrganizationのシークレットを利用できる化を制御できます。 Organizationレベルのシークレットを利用すると、複数のリポジトリ間でシークレットを共有できるので、重複してシークレットを作成する必要が軽減されます。 一カ所でOrganizationシークレットを更新すれば、そのシークレットを使うすべてのリポジトリワークフローにその変更が有効になることを保証できます。
シークレットに名前を付ける
シークレットの名前には次のルールが適用されます。
- シークレット名には、英数字(
[a-z]、[A-Z]、[0-9])または下線(_)のみを含めることができます。 スペースは使用できません。 - シークレット名の最初を
GITHUB_プレフィックスにすることはできません。 - シークレット名の最初を数字にすることはできません。
- シークレット名は、作成されたレベルで一意である必要があります。 たとえば、Organization レベルで作成されたシークレット名はそのレベルで一意である必要があり、リポジトリレベルで作成されたシークレット名はそのリポジトリ内で一意である必要があります。 Organization レベルのシークレット名がリポジトリレベルのシークレット名と同じ場合、リポジトリレベルのシークレット名が優先されます。
GitHub がログのシークレットを確実に削除するよう、シークレットの値として構造化データを使用しないでください。 たとえば、JSONやエンコードされたGit blobを含むシークレットは作成しないでください。
シークレットにアクセスする
シークレットをアクションが使用できるようにするには、ワークフローファイルでシークレットを入力または環境変数に設定する必要があります。 アクションに必要な入力および環境変数については、アクションのREADMEファイルを確認します。 詳しい情報については、「GitHub Actionsのワークフロー構文」を参照してください。
ファイルを編集するアクセス権を持っていれば、ワークフローファイル中の暗号化されたシークレットを使い、読み取ることができます。 詳細は「GitHub 上のアクセス権限」を参照してください。
警告: GitHubは、ログに出力されたシークレットを自動的に削除しますが、シークレットをログに出力することは意識的に避けなくてはなりません。
REST API を使用してシークレットを管理することもできます。 詳しい情報については、「シークレット」を参照してください。
認証情報のアクセス許可を制限する
クレデンシャルを生成する際には、可能な限り最小限の権限だけを許可することをおすすめします。 たとえば、個人のクレデンシャルを使う代わりに、デプロイキーあるいはサービスアカウントを使ってください。 必要なのが読み取りだけであれば、読み取りのみの権限を許可すること、そしてアクセスをできるかぎり限定することを考慮してください。 個人アクセストークン(PAT)を生成する際には、必要最小限のスコープを選択してください。
リポジトリの暗号化されたシークレットの作成
ユーザアカウントのリポジトリにシークレットを作成するには、そのリポジトリのオーナーでなければなりません。 Organizationのリポジトリにシークレットを作成するには、管理アクセス権を持っていなければなりません。
- GitHubで、リポジトリのメインページにアクセスしてください。
- リポジトリ名の下で Settings(設定)をクリックしてください。

- 左サイドバーで [Secrets] をクリックします。
- [Add a new secret] をクリックします。
- [名前] 入力ボックスにシークレットの名前 入力します。 1 シークレットの値を入力します。 1 [Add secret**] をクリックします。
リポジトリが親組織のシークレットにアクセスできる場合、そのシークレットもこのページに表示されます。
組織の暗号化されたシークレットの作成
組織でシークレットを作成する場合、ポリシーを使用して、そのシークレットにアクセスできるリポジトリを制限できます。 たとえば、すべてのリポジトリにアクセスを許可したり、プライベート リポジトリまたは指定したリポジトリ のリストのみにアクセスを制限したりできます。
Organizationのレベルでシークレットを作成するには、管理アクセス権を持っていなければなりません。
- GitHubで、Organizationのメインページにアクセスしてください。
- Organization名の下で、Settings(設定)をクリックしてください。

- 左サイドバーで [Secrets] をクリックします。
- [新しいシークレット ****] をクリックします。
- [名前] 入力ボックスにシークレットの名前 入力します。 1 シークレットの 値 を入力します。 1 [ リポジトリアクセス ドロップダウン リストから、アクセス ポリシーを選択します。 1 [Add secret**] をクリックします。
組織レベルのシークレットへのアクセスの確認
組織内のシークレットに適用されているアクセス ポリシーを確認できます。
- GitHubで、Organizationのメインページにアクセスしてください。
- Organization名の下で、Settings(設定)をクリックしてください。

- 左サイドバーで [Secrets] をクリックします。
- シークレットのリストには、構成済みのアクセス許可とポリシーが含まれます。 例:

- 各シークレットに構成されているアクセス許可の詳細については、[更新**] をクリックしてください。
暗号化されたシークレットのワークフロー内での利用
GITHUB_TOKENを除き、フォークしたリポジトリからワークフローがトリガーされた場合、シークレットは runner に渡されません。
アクションに入力あるいは環境変数としてシークレットを提供するには、リポジトリ内に作成したシークレットにアクセスするsecretsコンテキストを使うことができます。 詳しい情報については「GitHub Actionsのコンテキストと式構文」及び「GitHub Actionsのワークフロー構文」を参照してください。
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 }}
可能であれば、コマンドラインからプロセス間でシークレットを渡すのは避けてください。 コマンドラインプロセスは他のユーザから見えるかもしれず(psコマンドを使って)、あるいはセキュリティ監査イベントでキャプチャされるかもしれません。 シークレットの保護のために、環境変数、STDIN、あるいはターゲットのプロセスがサポートしている他の仕組みの利用を考慮してください。
コマンドラインからシークレットを渡さなければならない場合は、それらを適切なルールでクオート内に収めてください。 シークレットは、意図せずシェルに影響するかもしれない特殊なキャラクターをしばしば含みます。 それらの特殊なキャラクターをエスケープするには、環境変数をクオートで囲ってください。 例:
Bashの利用例
steps:
- shell: bash
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"
PowerShellの利用例
steps:
- shell: pwsh
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$env:SUPER_SECRET"
Cmd.exeの利用例
steps:
- shell: cmd
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "%SUPER_SECRET%"
シークレットの制限
ワークフローは、最大で100のシークレットを持てます。 シークレット環境変数の名前は、リポジトリ内でユニークでなければなりません。
シークレットの容量は最大64 KBです。 64 KBより大きなシークレットを使うには、暗号化されたシークレットをリポジトリ内に保存して、復号化パスフレーズをGitHubに保存します。 たとえば、GitHubのリポジトリにファイルをチェックインする前に、gpgを使って認証情報をローカルで暗号化します。 詳しい情報については、「gpg manpage」を参照してください。
警告: アクションを実行する際、シークレットは出力されないので注意してください。 この回避策を用いる場合、GitHubはログに出力されたシークレットを削除しません。
-
ターミナルから以下のコマンドを実行して、
gpgおよびAES256暗号アルゴリズムを使用してmy_secret.jsonファイルを暗号化します。$ gpg --symmetric --cipher-algo AES256 my_secret.json -
パスフレーズを入力するよう求められます。 このパスフレーズを覚えておいてください。GitHubで、このパスフレーズを値として用いる新しいシークレットを作成するために必要になります。
-
パスフレーズを含む新しいシークレットを作成します。 たとえば、
LARGE_SECRET_PASSPHRASEという名前で新しいシークレットを作成し、シークレットの値を上記のステップで選択したパスフレーズに設定します。 -
暗号化したファイルをリポジトリ内にコピーしてコミットします。 この例では、暗号化したファイルは
my_secret.json.gpgです。 -
パスワードを復号化するシェルスクリプトを作成します。 このファイルを
decrypt_secret.shとして保存します。#!/bin/sh # mkdir $HOME/secrets # --batch ファイルを復号化して、インタラクティブなコマンド # --yes を防ぎ、質問に対して "はい" を -- yes --はい --パスフレーズを解読する ="$LARGE_SECRET_PASSPHRASE" \ -- $HOME/secrets/my_secret.json my_secret.json.gpg -
リポジトリにチェックインする前に、シェルスクリプトが実行可能であることを確かめてください。
$ chmod +x decrypt_secret.sh $ git add decrypt_secret.sh $ git commit -m "Add new decryption script" $ git push -
ワークフローから、
stepを使用してシェルスクリプトを呼び出し、シークレットを復号化します。 ワークフローを実行している環境にリポジトリのコピーを作成するには、actions/checkoutアクションを使用する必要があります。 リポジトリのルートを基準として、runコマンドを使用することで、シェルスクリプトを参照します。名前: 大きな 秘密を持つワークフロー: プッシュ ジョブ : プッシュジョブ: 名:のジョブ 実行: ubuntu 最新 ステップ: - 使用: アクション/checkout@v2 - 名前: 大規模な秘密 を復号化 実行: ./.github/scripts/decrypt_secret.sh env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} # このコマンドは、あなたの秘密が印刷されていることを示す例 # あなたの印刷シークレットを削除します。 GitHub does # not hide secrets that use this workaround. - name: Test printing your secret (Remove this step in production) run: cat $HOME/secrets/my_secret.json