シークレットについて
シークレットは、組織、リポジトリ、またはリポジトリ環境内に作成する変数です。 作成したシークレットは、GitHub Actionsワークフローで利用できます。 GitHub Actions でシークレットを読み取ることができるのは、シークレットをワークフローに明示的に含める場合のみです。
Organizationレベルで保存されたシークレットについては、アクセスポリシーを使ってどのリポジトリがOrganizationのシークレットを利用できる化を制御できます。 Organizationレベルのシークレットを利用すると、複数のリポジトリ間でシークレットを共有できるので、重複してシークレットを作成する必要が軽減されます。 一カ所でOrganizationシークレットを更新すれば、そのシークレットを使うすべてのリポジトリワークフローにその変更が有効になることを保証できます。
環境レベルで保存されたシークレットについては、それらへのアクセスを制御するために必須のレビュー担当者を有効化することができます。 必須の承認者によって許可されるまで、ワークフローのジョブは環境のシークレットにアクセスできません。
Note
GitHub Actions ワークフローが OpenID Connect (OIDC) をサポートするクラウド プロバイダーのリソースにアクセスする必要がある場合、そのクラウド プロバイダーで直接認証されるようにワークフローを構成できます。 これにより、有効期間の長いシークレットとしてこれらの資格情報の格納を停止し、その他のセキュリティ上の利点を提供できます。 詳しくは、「OpenID Connect を使ったセキュリティ強化について」をご覧ください
シークレットに名前を付ける
シークレットの名前には次のルールが適用されます。
-
名前には英数字 (
[a-z]
、[A-Z]
、[0-9]
) またはアンダースコア (_
) のみを含めることができます。 スペースは使用できません。 -
名前の最初を
GITHUB_
プレフィックスにすることはできません。 -
名前の最初を数字にすることはできません。
-
名前では大文字と小文字は区別されません。
-
名前は、作成されたレベルで一意である必要があります。
たとえば、環境のレベルで作成されたシークレットはその環境内でユニークな名前になっていなければならず、リポジトリのレベルで作成されたシークレットはそのリポジトリ内でユニークな名前になっていなければならず、組織のレベルで作成されたシークレットはそのレベルでユニークな名前になっていなければなりません。
複数のレベルで同じ名前のシークレットが存在する場合、最も低いレベルのシークレットが優先されます。 たとえば、Organization レベルのシークレット名がリポジトリレベルのシークレット名と同じ場合、リポジトリレベルのシークレット名が優先されます。 同様に、組織、リポジトリ、環境がすべて同じ名前のシークレットを持つ場合、環境レベルのシークレットが優先されます。
GitHub がログのシークレットを確実に削除するよう、シークレットの値として構造化データを使用しないでください。 たとえば、JSONやエンコードされたGit blobを含むシークレットは作成しないでください。
シークレットにアクセスする
シークレットをアクションが使用できるようにするには、ワークフローファイルでシークレットを入力または環境変数に設定する必要があります。 アクションに必要な入力および環境変数については、アクションのREADMEファイルを確認します。 詳しくは、「GitHub Actions のワークフロー構文」を参照してください。
ワークフローファイルを編集するアクセス権を持っていれば、ワークフローファイル中のシークレットを使い、読み取ることができます。 詳しくは、「GitHub 上のアクセス権限」を参照してください。
Warning
ジョブでシークレットが使われた場合、GitHub はログに出力されるシークレットを自動的に削除します。 シークレットを意図的にログに出力しないようにする必要があります。
Organization及びリポジトリのシークレットはワークフローの実行がキューイングされた時点で読まれ、環境のシークレットは環境を参照しているジョブが開始された時点で読まれます。
REST API を使用してシークレットを管理することもできます。 詳しくは、「GitHub Actions シークレットの REST API エンドポイント」を参照してください。
認証情報のアクセス許可を制限する
認証情報を生成する際には、可能な限り最小限の権限だけを許可することをおすすめします。 たとえば、個人の資格情報を使用する代わりに、デプロイ キーまたはサービス アカウントを使用します。 必要なのが読み取りだけであれば、読み取りのみの権限を許可すること、そしてアクセスをできるかぎり限定することを考慮してください。
personal access token (classic) を生成する場合は、必要最小限のスコープを選択します。 fine-grained personal access token を生成するときに、必要な最小限のアクセス許可とリポジトリ アクセスを選択します。
personal access tokenを使う代わりに、GitHub App を使うことを検討してください。これは、fine-grained personal access token と同様に、詳細に設定されたアクセス許可と有効期間の短いトークンを使います。 personal access tokenとは異なり、GitHub App はユーザーに関連付けられていないため、アプリをインストールしたユーザーが組織を離れた場合でもワークフローは引き続き機能します。 詳しくは、「GitHub Actions ワークフローで GitHub App を使用して認証済み API 要求を作成する」を参照してください。
Note
リポジトリへのコラボレーター アクセス権を持つユーザーは、REST API を使ってそのリポジトリのシークレットを管理できます。organization への管理者アクセス権を持つユーザーは、REST API を使ってその organization のシークレットを管理できます。 詳しくは、「GitHub Actions シークレットの REST API エンドポイント」を参照してください。
リポジトリのシークレットの作成
GitHub 上で個人用アカウント リポジトリのシークレットまたは変数を作成するユーザーは、リポジトリのオーナーである必要があります。 GitHub 上で組織用リポジトリのシークレットまたは変数を作成するユーザーは、admin
アクセス権を持っている必要があります。 最後に、個人用アカウント リポジトリまたは組織用リポジトリのシークレットまたは変数を REST API 経由で作成するユーザーには、コラボレーター アクセス権が必要です。
-
GitHub で、リポジトリのメイン ページに移動します。
-
リポジトリ名の下にある [設定] をクリックします。 [設定] タブが表示されない場合は、 [] ドロップダウン メニューを選び、 [設定] をクリックします。
-
サイドバーの [セキュリティ] セクションで、 [ シークレットと変数] を選択し、次に [アクション] をクリックします。
-
[シークレット] タブをクリックします。 「アクションのシークレットと変数」ページの
-
[新しいリポジトリ シークレット] をクリックします。
-
"名前" フィールドで、コンテナーの名前を入力します。
-
"シークレット" フィールドで、シークレットの値を入力します。
-
[シークレットの追加] をクリックします。
リポジトリに環境シークレットがある場合、またはリポジトリが親組織のシークレットにアクセスできる場合、そのシークレットもこのページに表示されます。
GitHub CLI の詳細については、「GitHub CLI について」を参照してください。
リポジトリ シークレットを追加するには、gh secret set
サブコマンドを使用します。 secret-name
をシークレットの名前に置き換えます。
gh secret set SECRET_NAME
CLI によって、シークレット値の入力が求められます。 別の方法として、ファイルからシークレットの値を読み取ることもできます。
gh secret set SECRET_NAME < secret.txt
リポジトリのすべてのシークレットを一覧表示するには、gh secret list
サブコマンドを使用します。
環境のシークレットの生成
個人用アカウントのリポジトリ内の環境でシークレットか変数を作成するユーザーは、そのリポジトリのオーナーである必要があります。 組織用リポジトリ内の環境用にシークレットか変数を作成するユーザーには、admin
のアクセス権が必要です。 環境について詳しくは、「デプロイに環境の使用」を参照してください。
-
GitHub で、リポジトリのメイン ページに移動します。
-
リポジトリ名の下にある [設定] をクリックします。 [設定] タブが表示されない場合は、 [] ドロップダウン メニューを選び、 [設定] をクリックします。
-
左側のサイドバーで、 [環境] をクリックします。
-
シークレットを追加したい環境をクリックしてください。
-
[環境シークレット] で、 [シークレットの追加] をクリックします。
-
[名前] 入力ボックスにシークレットの名前を入力します。
-
シークレットの値を入力します。
-
[シークレットの追加] をクリックします。
環境のシークレットを追加するには、環境名が後に続く --env
または -e
フラグと共に gh secret set
サブコマンドを使用します。
gh secret set --env ENV_NAME SECRET_NAME
環境のすべてのシークレットを一覧表示するには、環境名が後に続く --env
または -e
フラグと共に gh secret list
サブコマンドを使用します。
gh secret list --env ENV_NAME
Organization にシークレットを作成する
Note
organization レベルのシークレットと変数には、GitHub Free のプライベート リポジトリからはアクセスできません。 GitHub サブスクリプションのアップグレードの詳細については、「アカウントのプランをアップグレードする」をご覧ください。
Organization でシークレットまたは変数を作成する場合、ポリシーを使用して、リポジトリによるアクセスを制限できます。 たとえば、すべてのリポジトリにアクセスを許可したり、プライベート リポジトリまたは指定したリポジトリ のリストのみにアクセスを制限したりできます。
Organization のオーナーは、Organization レベルでシークレットまたは変数を作成できます。
-
GitHub で、organization のメイン ページに移動します。
-
組織名の下で、 [設定] をクリックします。 [設定] タブが表示されない場合は、 [] ドロップダウン メニューを選び、 [設定] をクリックします。
-
サイドバーの [セキュリティ] セクションで、 [ シークレットと変数] を選択し、次に [アクション] をクリックします。
-
[シークレット] タブをクリックします。
-
[新しい組織シークレット] をクリックします。
-
[名前] 入力ボックスにシークレットの名前を入力します。
-
シークレットの [値] を入力します。
-
[リポジトリアクセス] ドロップダウンリストから、アクセスポリシーを選びます。
-
[シークレットの追加] をクリックします。
Note
既定では、GitHub CLI は、repo
と read:org
スコープで認証されます。 組織のシークレットを管理するには、さらに admin:org
スコープを承認する必要があります。
gh auth login --scopes "admin:org"
組織のシークレットを追加するには、組織名が後に続く --org
または -o
フラグと共に gh secret set
サブコマンドを使用します。
gh secret set --org ORG_NAME SECRET_NAME
既定では、シークレットはプライベート リポジトリでのみ使用できます。 組織内のすべてのリポジトリでシークレットを使用できるようにするには、--visibility
または -v
フラグを使用します。
gh secret set --org ORG_NAME SECRET_NAME --visibility all
組織内の選択したリポジトリでシークレットを使用できるようにするには、--repos
または -r
フラグを使用します。
gh secret set --org ORG_NAME SECRET_NAME --repos REPO-NAME-1, REPO-NAME-2
組織のすべてのシークレットを一覧表示するには、組織名が後に続く --org
または -o
フラグと共に gh secret list
サブコマンドを使用します。
gh secret list --org ORG_NAME
Organizationレベルのシークレットへのアクセスの確認
Organization内のシークレットに適用されているアクセス ポリシーを確認できます。
-
GitHub で、organization のメイン ページに移動します。
-
組織名の下で、 [設定] をクリックします。 [設定] タブが表示されない場合は、 [] ドロップダウン メニューを選び、 [設定] をクリックします。
-
サイドバーの [セキュリティ] セクションで、 [ シークレットと変数] を選択し、次に [アクション] をクリックします。
-
シークレットのリストには、設定済みのアクセス許可とポリシーが含まれます。 各シークレットに構成されているアクセス許可について詳しくは、 [更新] をクリックします。
シークレットのワークフロー内での利用
Note
GITHUB_TOKEN
の例外を除き、ワークフローがフォークされたリポジトリからトリガーされた場合、シークレットはランナーに渡されません。- シークレットが再利用可能なワークフローに自動的に渡されることはありません。 詳しくは、「ワークフローの再利用」を参照してください。
アクションに入力あるいは環境変数としてシークレットを提供するには、リポジトリ内に作成したシークレットにアクセスする secrets
コンテキストを使うことができます。 詳細については、「ワークフロー実行に関するコンテキスト情報へのアクセス」および「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 }}
if:
条件でシークレットを直接参照することはできません。 代わりに、シークレットをジョブ レベルの環境変数として設定し、ジョブのステップを条件付きで実行するために環境変数を参照することを検討してください。 詳しくは、「ワークフロー実行に関するコンテキスト情報へのアクセス」と jobs.<job_id>.steps[*].if
をご覧ください。
シークレットが設定されていない場合、シークレットを参照する式の戻り値 (例では ${{ 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%"
シークレットの制限
最大 1,000 個の組織シークレット、100 個のリポジトリ シークレット、100 個の環境シークレットを格納できます。
リポジトリに作成されたワークフローは、次の数のシークレットにアクセスできます。
- 100 個のリポジトリ シークレットすべて。
- 100 を超える組織シークレットへのアクセスがリポジトリに割り当てられている場合、ワークフローでは最初の 100 個の組織シークレットのみを使用できます (シークレット名のアルファベット順に並べ替えられます)。
- 100 個の環境シークレットすべて。
シークレットのサイズは最大 48 KB です。 より大きなシークレットを格納するには、以下の「大きなシークレットを格納する」の回避策を参照してください。
大きなシークレットを格納する
48 KB より大きなシークレットを使うには、シークレットをリポジトリ内に保存して、暗号化解除パスフレーズを GitHub のシークレットとして保存するという回避策を使用できます。 たとえば、GitHub のリポジトリに暗号化されたファイルをチェックインする前に、gpg
を使ってシークレットを含むファイルをローカルで暗号化できます。 詳細については、「gpg manpage」を参照してください。
Warning
ワークフローを実行する際、シークレットは出力されないので注意してください。 この回避策を用いる場合、GitHubはログに出力されたシークレットを削除しません。
-
ターミナルから次のコマンドを実行し、
gpg
と AES256 暗号アルゴリズムを使用してシークレットを含むファイルを暗号化します。 この例では、my_secret.json
はシークレットを含むファイルです。gpg --symmetric --cipher-algo AES256 my_secret.json
-
パスフレーズを入力するよう求められます。 このパスフレーズを覚えておいてください。GitHubで、このパスフレーズを値として用いる新しいシークレットを作成するために必要になります。
-
パスフレーズを含む新しいシークレットを作成します。 たとえば、
LARGE_SECRET_PASSPHRASE
という名前で新しいシークレットを作成し、シークレットの値を上記のステップで使用したパスフレーズに設定します。 -
暗号化したファイルをリポジトリ内のパスにコピーして、コミットします。 この例では、暗号化したファイルは
my_secret.json.gpg
です。Warning
暗号化されていない
my_secret.json
ファイルではなく、.gpg
ファイル拡張子で終わる暗号化されたmy_secret.json.gpg
ファイルを必ずコピーしてください。git add my_secret.json.gpg git commit -m "Add new secret JSON file"
-
リポジトリ内にシェル スクリプトを作成して、シークレット ファイルの暗号化を解除します。 この例では、スクリプトの名前は
decrypt_secret.sh
です。Shell #!/bin/sh # Decrypt the file mkdir $HOME/secrets # --batch to prevent interactive command # --yes to assume "yes" for questions gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \ --output $HOME/secrets/my_secret.json my_secret.json.gpg
#!/bin/sh # Decrypt the file mkdir $HOME/secrets # --batch to prevent interactive command # --yes to assume "yes" for questions 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
-
GitHub Actions ワークフローで、
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@v4 - name: Decrypt large secret run: ./decrypt_secret.sh env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} # This command is just an example to show your secret being printed # Ensure you remove any print statements of your secrets. 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
Base64 バイナリ BLOB をシークレットとして格納する
Base64 エンコードを使用して、小さなバイナリ BLOB をシークレットとして格納できます。 その後、ワークフロー内のシークレットを参照し、ランナーで使用するためにデコードできます。 サイズの制限については、「GitHub Actions でのシークレットの使用」をご覧ください。
Note
Base64 は、バイナリからテキストへの変換だけを実行するもので、実際の暗号化に代わるものではありません。
-
ファイルを Base64 文字列にエンコードするために
base64
を使用します。 次に例を示します。MacOS では、次のコマンドを実行できます。
base64 -i cert.der -o cert.base64
Linux では、次のコマンドを実行できます。
base64 -w 0 cert.der > cert.base64
-
Base64 文字列を含むシークレットを作成します。 次に例を示します。
$ gh secret set CERTIFICATE_BASE64 < cert.base64 ✓ Set secret CERTIFICATE_BASE64 for octocat/octorepo
-
ランナーから Base64 文字列にアクセスするには、シークレットを
base64 --decode
にパイプします。 次に例を示します。name: Retrieve Base64 secret on: push: branches: [ octo-branch ] jobs: decode-secret: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Retrieve the secret and decode it to a file env: CERTIFICATE_BASE64: ${{ secrets.CERTIFICATE_BASE64 }} run: | echo $CERTIFICATE_BASE64 | base64 --decode > cert.der - name: Show certificate information run: | openssl x509 -in cert.der -inform DER -text -noout
Note
別のシェルを使用するには、シークレットをファイルにデコードするために異なるコマンドが必要になる場合があります。 Windows ランナーでは、上記の run
ステップでコマンドを使用するために、shell: bash
により bash シェルを使用することをお勧めします。
ワークフロー実行ログからのシークレットの編集
GitHub Actions は、ワークフロー ログに出力されるすべての GitHub シークレットの内容を自動的に編集します。
GitHub Actions は、機密性の高い情報として認識されますが、シークレットとして格納されていない情報も編集します。 現在、GitHub をサポートしています。
- 32 バイトおよび 64 バイトの Azure キー
- Azure AD クライアント アプリのパスワード
- Azure Redis Cache キー
- Azure Container Registry キー
- Azure 関数ホストキー
- Azure Search キー
- データベース接続文字列
- HTTP ベアラー トークン ヘッダー
- JWT
- NPM 作成者トークン
- NuGet API キー
- v1 GitHub インストール トークン
- v2 GitHub インストール トークン (
ghp
、gho
、ghu
、ghs
、ghr
) - v2 GitHub の PAT
Note
他の種類の機密情報を自動的に編集する場合は、に関するディスカッションで Microsoft にお問い合わせください。
ベスト プラクティスの習慣として、::add-mask::VALUE
を使用して、GitHub シークレットではないすべての機密情報をマスクする必要があります。 これにより、値がシークレットとして扱われ、ログから編集されます。 データのマスキングについて詳しくは、「GitHub Actions のワークフロー コマンド」をご覧ください。
シークレットの編集は、ワークフロー ランナーによって実行されます。 つまり、シークレットはジョブ内で使用され、実行者によりアクセス可能である場合のみ編集されます。 未変換のシークレットがワークフロー実行ログに送信される場合は、ログを削除してシークレットをローテーションする必要があります。 ログの削除について詳しくは、「ワークフロー実行ログの使用」を参照してください。