🎄

ぼくの tfsec-pr-commenter-action の使い方

2023/12/10に公開

本記事は GitHub Actions Advent Calendar 2023 の10日目のエントリです。[1]

tfsec で AWS resource の check をしてます

https://twitter.com/sogaoh/status/1727006459509325893?s=20

このときの予告通りの話を書きます。

最近は以下のような GitHub Actions の設定で、Pull Request 時に tfsec を検証するようにしています。

tfsec-*.yml (抜粋)
tfsec-*.yml (抜粋)

  # tfsec scan
  tfsec:
    #needs: determine-workdir
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: write
      pull-requests: write
    #if: needs.determine-workdir.outputs.workdirs != '[]'
    #strategy:
    #  matrix:
    #    workdir: ${{ fromJSON(needs.determine-workdir.outputs.workdirs) }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Terraform security scan
        uses: aquasecurity/tfsec-pr-commenter-action@main
        with:
          tfsec_args: --config-file /github/workspace/.tfsec/config.yml
          github_token: ${{ secrets.GITHUB_TOKEN }}
          working_directory: '${{ github.workspace }}/${{ env.ENVIRONMENTS_DIR }}/${{ matrix.workdir }}'
          tfsec_formats: html

      - name: Replace '/' with '_'
        id: replace
        run: echo "REPORT_IDENTIFIER=$(echo '${{ matrix.workdir }}' | tr '/' '_')" >> $GITHUB_ENV
  
      - name: Save terraform security scan report
        if: ${{ !env.ACT }}
        uses: actions/upload-artifact@v3
        with:
          name: tfsec-report-${{ env.REPORT_IDENTIFIER }}
          path: results.*

${{ env.ENVIRONMENTS_DIR }} は 'infrastructures/aws/environments' のような感じで environments の path を定義、
${{ matrix.workdir }} は変更のあった箇所、という感じです

(24日の terraform Advent Calendar 2023 で記事を書く予定です)

だがしかし、PROBLEM にちゃんと気付けてなかった

比較的最近に気がついたのですが、ローカルで以下のように tfesc をかけるといくつか PROBLEM が出るのに、GitHub Actions では Fail にもならず、コンソール出力を確認しても PROBLEM 出てなくて、ヨシ大丈夫、と勘違いしてました。

❯ tfsec --config-file ~/ghq/github.com/${org/repoはナイショ}/.tfsec/config.yml
tfsec の全体的 exclude 設定例。個別に tfsec:ignore:XXX を入れることもある
.tfsec/config.yml

---
exclude:
  # enable_flow_log = true にしてるのに MEDIUM が出るので ignore する
  # https://github.com/aquasecurity/tfsec/issues/1941
  - aws-ec2-require-vpc-flow-logs-for-all-vpcs

  # 外向きの通信は許可するので ignore する
  - aws-ec2-no-public-egress-sgr

  # パブリックサブネットでは内向きで全許可する通信があるので ignore する
  - aws-ec2-no-public-ingress-sgr

  # ALB をパブリックな階層に置く(Cloudfrontを挟まない)ので ignore する
  - aws-elb-alb-not-public

  # EC2 を public subnet に置かないので ignore する
  - aws-ec2-no-public-ip-subnet

  # デプロイ利便性の理由で ECR Image tag の上書きがあり得るため ignore する
  - aws-ecr-enforce-immutable-repository

  # ECR の暗号化タイプは AES256 とするため ignore する 
  - aws-ecr-repository-customer-key

  # ecs-oidc で '*' resource への GET 系 action を許容している
  - aws-iam-no-policy-wildcards

  # 中継用EC2はディスクを暗号化しないで良い(大事なデータは入れないので)
  - aws-ec2-enable-at-rest-encryption

  # production 以外は Container Insights を有効化しない
  - aws-ecs-enable-container-insight

  # production 以外は RDS Performance Insights を有効化しない
  - aws-rds-enable-performance-insights

  # production 以外は RDS 削除保護を有効にしない場合がある
  - aws-rds-enable-deletion-protection

  # DBアクセスユーザーをIAMで管理しないので ignore
  - aws-rds-enable-iam-auth

うーむ、これじゃ PROBLEM に気付けないではないか・・・と試行錯誤の末に思い突っ込んだのが、artifact として report HTML を採取することでした。

そうすると、↓のような結果が得られて、662 Bytes ではないところが PROBLEM がある、と気が付くことができるようになりました。苦しい w。


PROBLEM あるところが抽出できるシーン・・・

ということで、せっかく
https://github.com/aquasecurity/tfsec-pr-commenter-action

を使ってるのに、いい感じに PR Comment を取れてないのでちょっとコレどうすればいいかどなたかわかります?という記事でした。

・・・書いていて、もしかすると dorny/paths-filter 使って変更箇所だけ tfsec する、という方式にしてる影響かな、と思った。。

ということで、その部分も実装(yml)置いときます。

「dorny/paths-filter 使って変更箇所だけ」の設定例

tfsec-*.yml (抜粋:前半)
tfsec-*.yml (抜粋

name: tfsec (development)

on:
  pull_request:
    paths:
      - 'infrastructures/.terraform-version'
      - 'infrastructures/aws/environments/development/**'
      - 'infrastructures/modules/**'

env:
  ENVIRONMENTS_DIR: 'infrastructures/aws/environments'

jobs:
  determine-workdir:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
      contents: read
    outputs:
      workdirs: ${{ steps.filter.outputs.workdirs }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - uses: dorny/paths-filter@v2
        id: changes
        with:
          filters: .github/path-filter-development.yml

      - name: filter
        id: filter
        run: |
          WORKDIRS=$(echo '${{ toJSON(steps.changes.outputs) }}' | jq '. | to_entries[] | select(.value == "true") | .key')
          echo "workdirs=$(echo $WORKDIRS | jq -sc '.')" >> $GITHUB_OUTPUT

.github/path-filter-development.yml はこんな感じです

path-filter-*.yml example

development/iam/role/switch:
  - 'infrastructures/.terraform-version'
  - 'infrastructures/aws/environments/development/variables.tf'
  - 'infrastructures/aws/environments/development/iam/role/switch/**'

development/iam/role/oidc:
  - 'infrastructures/.terraform-version'
  - 'infrastructures/aws/environments/development/variables.tf'
  - 'infrastructures/aws/environments/development/iam/role/oidc/**'
  - 'infrastructures/modules/tfp-oidc/**'
  - 'infrastructures/modules/ecs-oidc/**'

#・・・

「おかしいな?」を追って手直ししてみた箇所の紹介

なお、少し以前はどこのパートの report も 662 Bytes でした。
つまり、PROBLEM に全く気付けてなかった。。

          tfsec_args: --config-file ${{ github.workspace }}/.tfsec/config.yml

のところを

          tfsec_args: --config-file /github/workspace/.tfsec/config.yml

に直すまでは・・・

気が付いた時の呟きがこちら

https://twitter.com/sogaoh/status/1720764529305591938?s=20

まだ裏取れてなくて、今日に至ってます。。issue 上げようかな・・・(そこまでやりきるパワーが今はない)

やや中途半端な終わり方で恐縮ですが、最後までご覧いただきありがとうございました。

明日11日目の予定は以下になっています。お楽しみに。
GitHub Actions × Google Cloud Workload Identityを使ってCloud RunへデプロイしてSlackへ通知する by @NagaokaKenichi さん(挟まれてたww)

脚注
  1. 9日目は @NagaokaKenichi さんの GitHubでIssueが作成されたらGitHub ActionsでSlackへ通知する でした。 ↩︎

Discussion