actions/checkoutの後続のstepで認証情報を扱えないようにする
株式会社MIXIでサロンスタッフ予約サービス「minimo」のバックエンドエンジニアをしている鈴木です。
GitHub Actionsの actions/checkout
で後続のstepで認証情報を扱えないようにする方法についてまとめます。
なぜ行う必要があるか
actions/checkout
の persist-credentials
はデフォルトではtrueになっています。
この場合、 actions/checkout
が設定したGitの認証情報が残るため、後続のstepで悪意のあるコードが実行されると認証情報を悪用できてしまいます。
これを防ぐため、 actions/checkout
の処理を終了する際にGitの認証情報を削除する必要があります。
name: CI
on:
pull_request:
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
# デフォルト設定
# token: ${{ github.token }}
# persist-credentials: true
# actions/checkoutが設定したGitの認証情報が残っているため、後続のstepで使用できる
# ここで悪意あるコードが実行されると......
- name: Pull main
run: |
git config --global pull.rebase false
git pull origin main
設定方法
actions/checkout
のパラメータとして persist-credentials: false
を設定します。
name: CI
on:
pull_request:
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
# デフォルト設定
# token: ${{ github.token }}
# 次のように設定する
persist-credentials: false
# actions/checkoutが設定したGitの認証情報が残っていないため、後続のstepではリモートリポジトリに対する操作ができない
# すなわち次の処理は失敗する
- name: Pull main
run: |
git config --global pull.rebase false
git pull origin main
行う内容自体は簡単ですが、CIの数が多いとやり切れないという問題があるかと思います。
このような問題を解決するために次のコマンドがあります。
これを使えばリポジトリ内のCIに対して一括で変更を適用できます。
後続のstepでリモートリポジトリに対して操作を行いたいときどうする?
前述の方法で設定自体はできますが、このままでは後続のstepでリモートリポジトリに関する操作を行うことができません。
もし、このような操作を行いたい場合は、次のように、その操作を行うstepの前後にGitの認証情報を設定するstepと削除するstepを追加します。
なお、Gitの認証情報を削除するstepは前のstepの成功・失敗を問わず実行するように if: always()
を付けておくと良いでしょう。
name: CI
on:
pull_request:
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
# デフォルト設定
# token: ${{ github.token }}
# 次のように設定する
persist-credentials: false
# Gitの認証情報設定
- name: Set git config
env:
# actions/checkoutで設定したtokenと同じものを指定
GITHUB_TOKEN: ${{ github.token }}
run: |
git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}"
git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com'
git config --global user.name 'github-actions[bot]'
# リモートリポジトリに関する操作 (現状ママ)
- name: Pull main
run: |
git config --global pull.rebase false
git pull origin main
# リモートリポジトリに関する操作が終わったら、すぐGitの認証情報を削除する
- name: Remove git config
# 前のstepの成功・失敗問わず実行する
if: always()
run: |
git remote rm origin
git config unset --global user.email
git config unset --global user.name
参考文献
- https://zenn.dev/shunsuke_suzuki/articles/github-action-checkout-persist-credentials
- https://tech.guitarrapc.com/entry/2025/04/05/235900#actionscheckoutのpersist-credentialsをfalseに変換するdisable-checkout-persist-credentials
宣伝
minimoでは一緒に働く仲間を募集中です!
リモート勤務も可能ですので、詳しくは下記採用ページをご確認ください。
Discussion