コンテンツにスキップ

aqua checksumを試す

GitHub ActionsならSHA Pinning、DockerfileならSHA256 digestでのPinningが可能です。
タグの付け替えやリリースアセットの差し替えなど、同一バージョン番号のまま中身が変わるタイプの侵害への対策として、有効にしている方も多いのではないでしょうか。

aquaproj/aqua/aqua(以下、aqua)でもcommit SHAまたはchecksumを用いてPinningが可能です。 この記事では、aquaのchecksum検証を有効化し、Renovateによる更新時にchecksumも自動更新するところまで試してみます。

commit SHAでのPinning

hashicorp/terraform-config-inspect はGitHub Releasesを使用していないため、commit SHAをversionとして指定しています。

---
registries:
  - type: standard
    ref: v4.520.2 # renovate: depName=aquaproj/aqua-registry
packages:
  - name: hashicorp/terraform-config-inspect
    # renovate: packageName=https://github.com/hashicorp/terraform-config-inspect currentValue=master
    version: "e06743db9cd8a4a96040fafd00503b6a9d357ff1"
{
  "customManagers": [
    {
      "customType": "regex",
      "managerFilePatterns": [
        "(^|/)aqua\\.ya?ml$"
      ],
      "matchStrings": [
        "name: hashicorp/terraform-config-inspect\\n\\s+# renovate: packageName=(?<packageName>\\S+) currentValue=(?<currentValue>\\S+)\\n\\s+version: \"(?<currentDigest>[a-f0-9]{40})\""
      ],
      "datasourceTemplate": "git-refs",
      "depNameTemplate": "hashicorp/terraform-config-inspect"
    }
  ]
}

問題点としては、Renovateでのバージョンアップのために一工夫必要であることす。
上記のようにRenovate用のコメントを追加し、renovate.jsonでcustomManagersを設定する必要があります。
(が、まだ上手く設定できていません...) terraform-config-inspectであれば機能追加がほぼないため、ある程度バージョンアップしなくても問題ありません。

(https://github.com/hashicorp/terraform-config-inspect#contributing には、Furthermore, we consider this package feature-complete; との記載があります)

しかし、全てのツールで同様に実施するのは煩雑ですので、checksumを利用してみます。

aqua checksum

開発者のsuzuki-shunsukeさんのzenn記事 https://aquaproj.github.io/docs/reference/config/checksum/
aqua.yamlにchecksumを設定します。

---
checksum:
  enabled: true # By default, this is false
  require_checksum: true # By default, this is false
  supported_envs: # By default, all envs are supported
    - darwin
    - linux
registries:
  - #...
packages:
  - #...

require_checksumをtrueにすることで、checksumが設定されていないパッケージのインストールを禁止します。 aqua update-checksumすると、aqua-checksums.jsonが出力されます。
以下はaquasecurity/trivyのchecksumです。

{
  "checksums": [
    {
      "id": "github_release/github.com/aquasecurity/trivy/v0.70.0/trivy_0.70.0_Linux-64bit.tar.gz",
      "checksum": "8B4376D5D6BEFE5C24D503F10FF136D9E0C49F9127A4279FD110B727929A5AA9",
      "algorithm": "sha256"
    },
    {
      "id": "github_release/github.com/aquasecurity/trivy/v0.70.0/trivy_0.70.0_Linux-ARM64.tar.gz",
      "checksum": "2F6BB988B553A1BBAC6BDD1CE890F5E412439564E17522B88A4541B4F364FC8D",
      "algorithm": "sha256"
    },
    {
      "id": "github_release/github.com/aquasecurity/trivy/v0.70.0/trivy_0.70.0_macOS-64bit.tar.gz",
      "checksum": "52D531452B19E7593DA29366007D02A810E1E0080D02F9CF6A1AFB46C35AAA93",
      "algorithm": "sha256"
    },
    {
      "id": "github_release/github.com/aquasecurity/trivy/v0.70.0/trivy_0.70.0_macOS-ARM64.tar.gz",
      "checksum": "68E543C51DCC96E1C344053A4FDE9660CF602C25565D9F09DC17DD41E13B838A",
      "algorithm": "sha256"
    }
  ]
} 

このままだと、Renovateからaqua.yamlが更新されるとCIが落ちてしまうので、checksumの更新も自動化します。
https://aquaproj.github.io/docs/guides/checksum 公式ドキュメントではupdate-checksum-actionが利用されていますが、あえて手書きしてみます。
(ドキュメントでもPlease consider autofix.ci or Securefix Actionとの記載があることもあります)
https://github.com/aquaproj/update-checksum-workflow/blob/main/.github/workflows/update-checksum.yaml を参考にしました。

---
name: update-aqua-checksum
on:
  pull_request:
    paths:
      - aqua.yaml
      - aqua-checksums.json
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
jobs:
  update-aqua-checksums:
    runs-on: ubuntu-latest
    # checksum更新のためにpush権限を使うWorkflowなので、同一リポジトリ内のブランチからのPRに限定
    if: github.event.pull_request.head.repo.full_name == github.repository
    permissions:
      contents: write
      pull-requests: write
    steps:
      - name: Checkout
        timeout-minutes: 3
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - uses: aquaproj/aqua-installer@11dd79b4e498d471a9385aa9fb7f62bb5f52a73c # v4.0.4
        timeout-minutes: 3
        with:
          aqua_version: v2.59.1
      - name: Update aqua-checksums.json
        timeout-minutes: 15
        run: aqua update-checksum -prune
      - name: Commit and push
        timeout-minutes: 3
        run: |
          set -eu
          if git diff --quiet aqua-checksums.json; then
            echo "aqua-checksums.json is up to date"
            exit 0
          fi
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add aqua-checksums.json
          git commit -m "chore(aqua): update aqua-checksums.json"
          git push

-prune を付けることで、現在の aqua.yaml で不要になったchecksumエントリも削除できます。 Renovateでバージョンが上がった後に古いchecksumを残したくないため、ここでは -prune を指定しています。

まとめ

必須の対応ではありませんが、安心して利用するための仕組みとして用意されているので、試してみてはいかがでしょうか?