tfsec を使用し Terraform で管理するリソースのセキュリティを強化する手順を記載します。
ローカルに tfsec インストール
以下例では asdf を利用し導入しています。
asdf は多数言語に対応しており、 rubyenv, nodenv, goenv の様な個々の言語のバージョン切り替えよりも同様の手順でバージョン切り替えが可能で有用です。
参考: https://github.com/woneill/asdf-tfsec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| asdf plugin-add tfsec https://github.com/woneill/asdf-tfsec
管理バージョン表示 asdf list all tfsec ... 1.27.4 1.27.5 1.27.6
asdf install tfsec 1.27.6
// ローカルの設定 asdf local tfsec 1.27.6
// 上記処理で .tool-versions に `tfsec 1.27.6` が追記される cat .tool-versions
|
個々のリソースでルールを除外したいとき
各リソースで tfsec:ignore でルールを除外します。
1 2
| resource "aws_lb" "dummy" { internal = false # tfsec:ignore:aws-elb-alb-not-public インターネットからのアクセスをする為、許容する
|
以下の様にリソースの上にコメントして追記しても除外が可能ですが、
複数ある場合に見づらくなる為、個人的には上記の各パラメータに設定する方が見通しが良くなると考えております。
1 2 3
| # tfsec:ignore:aws-elb-alb-not-public インターネットからのアクセスをする為、許容する resource "aws_lb" "dummy" { internal = false
|
プロジェクト全体でルールを除外したいとき
参考: https://aquasecurity.github.io/tfsec/v1.27.6/getting-started/configuration/config/
.tfsec/config.yml を作成し、除外したいルールを追加します。
あくまでも以下はサンプルで、個々の運用によって除外ルールは変更してください。
1 2 3 4 5 6 7
| --- exclude: # NOTE: IAM Policy で * (ワイルドカード) の使用を回避すると工数増となり対応が難しくなることが多い為、除外する - aws-iam-no-policy-wildcards
# ALB を internet-facing で利用したい場合が主なので除外する - aws-elb-alb-not-public
|
1 2
| // tfsec 実行ディレクトリを ./envs/prd としています。 tfsec --config-file .tfsec/config.yml ./envs/prd
|
GitHub Actions で実行する
Pull Request 作成時をトリガーに tfsec が実行される様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| name: tfsec
on: [pull_request]
jobs: tfsec: name: tfsec runs-on: ubuntu-latest timeout-minutes: 3
strategy: fail-fast: false matrix: directory: ['envs/prd', 'envs/stg']
steps: - name: Checkout uses: actions/checkout@v3
- name: Pick tfsec version id: tfsec run: echo ::set-output name=tfsec_version::$(grep tfsec .tool-versions| awk '{print $2}')
- name: install tfsec run: | curl -L https://github.com/tfsec/tfsec/releases/download/v${{ steps.tfsec.outputs.tfsec_version }}/tfsec-linux-amd64 > /tmp/tfsec chmod +x /tmp/tfsec sudo mv /tmp/tfsec /usr/local/bin
- name: Terraform security scan run: tfsec --config-file .tfsec/config.yml ${{ matrix.directory }}
|
まとめ
tfsec を導入することで AWS Config 非準拠ルールへの対応の数多くが実行でき、よりセキュアなアーキテクチャ構築に寄与できます。
Pull Request で tfsec をパスしないとマージできない様にすることで運用ルールとして自動的に適用できるのでよりお勧めです。
そして、 SaaS のサービスは日々進化しており、 tfsec もそれに追従しています。
tfsec の定期的なバージョンアップが必須なのでお気をつけください。
以上
参考になれば幸いです。