GitHub Actions の支払いを管理する
GitHubは、macOSランナーのホストにMacStadiumを使用しています。
暗号化されたシークレットについて
Secrets are encrypted environment variables that you create in an organization or repository. The secrets that you create are available to use in GitHub Actions workflows. GitHub uses a libsodium sealed box to help ensure that secrets are encrypted before they reach GitHub and remain encrypted until you use them in a workflow.
Organizationレベルで保存されたシークレットについては、アクセスポリシーを使ってどのリポジトリがOrganizationのシークレットを利用できる化を制御できます。 Organizationレベルのシークレットを利用すると、複数のリポジトリ間でシークレットを共有できるので、重複してシークレットを作成する必要が軽減されます。 一カ所でOrganizationシークレットを更新すれば、そのシークレットを使うすべてのリポジトリワークフローにその変更が有効になることを保証できます。
シークレットに名前を付ける
シークレットの名前には次のルールが適用されます。
-
シークレット名には、英数字(
[a-z]
、[A-Z]
、[0-9]
)または下線(_
)のみを含めることができます。 スペースは使用できません。 -
シークレット名の最初を
GITHUB_
プレフィックスにすることはできません。 -
シークレット名の最初を数字にすることはできません。
-
Secret names are not case-sensitive.
-
シークレット名は、作成されたレベルで一意である必要があります。 For example, a secret created at the repository level must have a unique name in that repository, and a secret created at the organization level must have a unique name at that level.
If a secret with the same name exists at multiple levels, the secret at the lower level takes precedence. For example, if an organization-level secret has the same name as a repository-level secret, then the repository-level secret takes precedence.
GitHub がログのシークレットを確実に削除するよう、シークレットの値として構造化データを使用しないでください。 たとえば、JSONやエンコードされたGit blobを含むシークレットは作成しないでください。
シークレットにアクセスする
シークレットをアクションが使用できるようにするには、ワークフローファイルでシークレットを入力または環境変数に設定する必要があります。 アクションに必要な入力および環境変数については、アクションのREADMEファイルを確認します。 詳しい情報については、「GitHub Actionsのワークフロー構文」を参照してください。
ファイルを編集するアクセス権を持っていれば、ワークフローファイル中の暗号化されたシークレットを使い、読み取ることができます。 詳細は「GitHub 上のアクセス権限」を参照してください。
警告: GitHubは、ログに出力されたシークレットを自動的に削除しますが、シークレットをログに出力することは意識的に避けなくてはなりません。
REST API を使用してシークレットを管理することもできます。 詳しい情報については、「シークレット」を参照してください。
認証情報のアクセス許可を制限する
クレデンシャルを生成する際には、可能な限り最小限の権限だけを許可することをおすすめします。 たとえば、個人のクレデンシャルを使う代わりに、デプロイキーあるいはサービスアカウントを使ってください。 必要なのが読み取りだけであれば、読み取りのみの権限を許可すること、そしてアクセスをできるかぎり限定することを考慮してください。 個人アクセストークン(PAT)を生成する際には、必要最小限のスコープを選択してください。
リポジトリの暗号化されたシークレットの作成
ユーザアカウントのリポジトリにシークレットを作成するには、そのリポジトリのオーナーでなければなりません。 Organizationのリポジトリにシークレットを作成するには、管理
アクセス権を持っていなければなりません。
- GitHub Enterprise Serverで、リポジトリのメインページにアクセスしてください。
- リポジトリ名の下で Settings(設定)をクリックしてください。
- 左サイドバーで [Secrets] をクリックします。
- Click New repository secret.
- [名前] 入力ボックスにシークレットの名前 入力します。 1 シークレットの値を入力します。 1 [Add secret**] をクリックします。
If your repository can access secrets from the parent organization, then those secrets are also listed on this page.
組織の暗号化されたシークレットの作成
組織でシークレットを作成する場合、ポリシーを使用して、そのシークレットにアクセスできるリポジトリを制限できます。 たとえば、すべてのリポジトリにアクセスを許可したり、プライベート リポジトリまたは指定したリポジトリ のリストのみにアクセスを制限したりできます。
Organizationのレベルでシークレットを作成するには、管理
アクセス権を持っていなければなりません。
- GitHub Enterprise Serverで、Organizationのメインページにアクセスしてください。
- Organization名の下で、Settings(設定)をクリックしてください。
- 左サイドバーで [Secrets] をクリックします。
- Click New organization secret.
- [名前] 入力ボックスにシークレットの名前 入力します。 1 シークレットの 値 を入力します。 1 [ リポジトリアクセス ドロップダウン リストから、アクセス ポリシーを選択します。 1 [Add secret**] をクリックします。
組織レベルのシークレットへのアクセスの確認
組織内のシークレットに適用されているアクセス ポリシーを確認できます。
- GitHub Enterprise Serverで、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%"
シークレットの制限
You can store up to 1,000 secrets per organization and 100 secrets per repository. A workflow may use up to 100 organization secrets and 100 repository secrets.
シークレットの容量は最大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