Note: Environments, environment protection rules, and environment secrets are currently in beta and subject to change.
暗号化されたシークレットについて
Secrets are encrypted environment variables that you create in an organization, repository, or repository environment. 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シークレットを更新すれば、そのシークレットを使うすべてのリポジトリワークフローにその変更が有効になることを保証できます。
For secrets stored at the environment level, you can enable required reviewers to control access to the secrets. A workflow job cannot access environment secrets until approval is granted by required approvers.
シークレットに名前を付ける
シークレットの名前には次のルールが適用されます。
-
シークレット名には、英数字(
[a-z]
、[A-Z]
、[0-9]
)または下線(_
)のみを含めることができます。 スペースは使用できません。 -
シークレット名の最初を
GITHUB_
プレフィックスにすることはできません。 -
シークレット名の最初を数字にすることはできません。
-
Secret names are not case-sensitive.
-
シークレット名は、作成されたレベルで一意である必要があります。 For example, a secret created at the environment level must have a unique name in that environment, 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. Similarly, if an organization, repository, and environment all have a secret with the same name, the environment-level secret takes precedence.
GitHub がログのシークレットを確実に削除するよう、シークレットの値として構造化データを使用しないでください。 たとえば、JSONやエンコードされたGit blobを含むシークレットは作成しないでください。
シークレットにアクセスする
シークレットをアクションが使用できるようにするには、ワークフローファイルでシークレットを入力または環境変数に設定する必要があります。 アクションに必要な入力および環境変数については、アクションのREADMEファイルを確認します。 詳しい情報については、「GitHub Actionsのワークフロー構文」を参照してください。
ファイルを編集するアクセス権を持っていれば、ワークフローファイル中の暗号化されたシークレットを使い、読み取ることができます。 詳細は「GitHub 上のアクセス権限」を参照してください。
警告: GitHubは、ログに出力されたシークレットを自動的に削除しますが、シークレットをログに出力することは意識的に避けなくてはなりません。
Organization and repository secrets are read when a workflow run is queued, and environment secrets are read when a job referencing the environment starts.
REST API を使用してシークレットを管理することもできます。 詳しい情報については、「シークレット」を参照してください。
認証情報のアクセス許可を制限する
クレデンシャルを生成する際には、可能な限り最小限の権限だけを許可することをおすすめします。 たとえば、個人のクレデンシャルを使う代わりに、デプロイキーあるいはサービスアカウントを使ってください。 必要なのが読み取りだけであれば、読み取りのみの権限を許可すること、そしてアクセスをできるかぎり限定することを考慮してください。 個人アクセストークン(PAT)を生成する際には、必要最小限のスコープを選択してください。
リポジトリの暗号化されたシークレットの作成
ユーザアカウントのリポジトリにシークレットを作成するには、そのリポジトリのオーナーでなければなりません。 Organizationのリポジトリにシークレットを作成するには、管理
アクセス権を持っていなければなりません。
- GitHubで、リポジトリのメインページにアクセスしてください。
- リポジトリ名の下で Settings(設定)をクリックしてください。
- 左サイドバーで [Secrets] をクリックします。
- Click New repository secret.
- [Name(名前)] 入力ボックスにシークレットの名前を入力します。
- シークレットの値を入力します。
- [Add secret(シークレットの追加)] をクリックします。
If your repository has environment secrets or can access secrets from the parent organization, then those secrets are also listed on this page.
Creating encrypted secrets for an environment
To create secrets for an environment in a user account repository, you must be the repository owner. To create secrets for an environment in an organization repository, you must have admin
access.
- GitHubで、リポジトリのメインページにアクセスしてください。
- リポジトリ名の下で Settings(設定)をクリックしてください。
- In the left sidebar, click Environments.
- Click on the environment that you want to add a secret to.
- Under Environment secrets, click Add secret.
- [Name(名前)] 入力ボックスにシークレットの名前を入力します。
- シークレットの値を入力します。
- [Add secret(シークレットの追加)] をクリックします。
Organizationの暗号化されたシークレットの作成
Organizationでシークレットを作成する場合、ポリシーを使用して、そのシークレットにアクセスできるリポジトリを制限できます。 たとえば、すべてのリポジトリにアクセスを許可したり、プライベート リポジトリまたは指定したリポジトリ のリストのみにアクセスを制限したりできます。
Organizationのレベルでシークレットを作成するには、管理
アクセス権を持っていなければなりません。
- GitHubで、Organizationのメインページにアクセスしてください。
- Organization名の下で、Settings(設定)をクリックしてください。
- 左サイドバーで [Secrets] をクリックします。
- Click New organization secret.
- [Name(名前)] 入力ボックスにシークレットの名前を入力します。
- シークレットの Value(値) を入力します。
- [ Repository access(リポジトリアクセス) ドロップダウン リストから、アクセス ポリシーを選択します。
- [Add secret(シークレットの追加)] をクリックします。
Organizationレベルのシークレットへのアクセスの確認
Organization内のシークレットに適用されているアクセス ポリシーを確認できます。
- GitHubで、Organizationのメインページにアクセスしてください。
- Organization名の下で、Settings(設定)をクリックしてください。
- 左サイドバーで [Secrets] をクリックします。
- シークレットのリストには、設定済みのアクセス許可とポリシーが含まれます。 例:
- 各シークレットに設定されているアクセス許可の詳細については、[Update(更新)] をクリックしてください。
暗号化されたシークレットのワークフロー内での利用
GITHUB_TOKEN
を除き、フォークしたリポジトリからワークフローがトリガーされた場合、シークレットはランナーに渡されません。
アクションに入力あるいは環境変数としてシークレットを提供するには、リポジトリ内に作成したシークレットにアクセスする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, 100 secrets per repository, and 100 secrets per environment. A workflow may use up to 100 organization secrets and 100 repository secrets. Additionally, a job referencing an environment may use up to 100 environment 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 で質問に対して "はい" が返るようにする gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \ --output $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
コマンドを使用し、シェルスクリプトを参照します。name: Workflows with large secrets on: push jobs: my-job: name: My Job runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Decrypt large secret run: ./.github/scripts/decrypt_secret.sh env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} # このコマンドは、あなたの秘密が印刷されていることを示す例 # シークレットを出力する文は必ず削除してください。 GitHubは # この回避先を使うシークレットは隠蔽しません。 - name: Test printing your secret (Remove this step in production) run: cat $HOME/secrets/my_secret.json