ぼくの tfsec-pr-commenter-action の使い方
本記事は GitHub Actions Advent Calendar 2023 の10日目のエントリです。[1]
tfsec で AWS resource の check をしてます
このときの予告通りの話を書きます。
最近は以下のような GitHub Actions の設定で、Pull Request 時に tfsec を検証するようにしています。
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 を入れることもある
---
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。
ということで、せっかく
を使ってるのに、いい感じに PR Comment を取れてないのでちょっとコレどうすればいいかどなたかわかります?という記事でした。
・・・書いていて、もしかすると dorny/paths-filter 使って変更箇所だけ tfsec する、という方式にしてる影響かな、と思った。。
ということで、その部分も実装(yml)置いときます。
「dorny/paths-filter 使って変更箇所だけ」の設定例
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 はこんな感じです
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
に直すまでは・・・
気が付いた時の呟きがこちら
まだ裏取れてなくて、今日に至ってます。。issue 上げようかな・・・(そこまでやりきるパワーが今はない)
やや中途半端な終わり方で恐縮ですが、最後までご覧いただきありがとうございました。
明日11日目の予定は以下になっています。お楽しみに。
GitHub Actions × Google Cloud Workload Identityを使ってCloud RunへデプロイしてSlackへ通知する by @NagaokaKenichi さん(挟まれてたww)
-
9日目は @NagaokaKenichi さんの GitHubでIssueが作成されたらGitHub ActionsでSlackへ通知する でした。 ↩︎
Discussion