🛡️

actions/checkoutの後続のstepで認証情報を扱えないようにする

に公開

株式会社MIXIでサロンスタッフ予約サービス「minimo」のバックエンドエンジニアをしている鈴木です。
GitHub Actionsの actions/checkout で後続のstepで認証情報を扱えないようにする方法についてまとめます。

なぜ行う必要があるか

actions/checkoutpersist-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に対して一括で変更を適用できます。
https://github.com/suzuki-shunsuke/disable-checkout-persist-credentials

後続の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

参考文献

宣伝

minimoでは一緒に働く仲間を募集中です!
リモート勤務も可能ですので、詳しくは下記採用ページをご確認ください。
https://mixigroup-recruit.mixi.co.jp/recruitment-category/career/12757/
https://mixigroup-recruit.mixi.co.jp/recruitment-category/career/12979/

MIXI DEVELOPERS Tech Blog

Discussion