[Terraform] Trivyでセキュリティスキャンをしよう！

## はじめに
今回は[Trivy](https://github.com/aquasecurity/trivy)をterraformのCIツールとして導入します。[Trivy](https://github.com/aquasecurity/trivy)はセキュリティスキャンツールです。
[前回の記事](https://qiita.com/bkend_2/items/95b3082f7216788f3d20)で[tfsec](https://github.com/aquasecurity/tfsec)を紹介させていただきましたが、そのリポジトリ内ではこのような表記があります。

> Going forward we want to encourage the tfsec community to transition over to Trivy. Moving to Trivy gives you the same excellent Terraform scanning engine, with some extra benefits:

[docs/index.md](https://github.com/aquasecurity/tfsec/blob/master/docs/index.md)

`翻訳`
> tfsecはTrivyへの移行を推奨しています。
Trivyを使用するとtfsecと同じエンジンを使用できる他、追加機能が備わっています。

tfsecがtrivyを推しているなら...
今回はそのTrivyをGithubActionsに導入しましょう。

#### 想定読者
- Terraformにセキュリティツールを導入したい方
- セキュリティツールに興味がある方
- TerraformにCIツールを何を入れれば良いか検討している方

#### 前回の記事
- [tfcmtとtfsecを導入して、terraformのCIツールを充実させよう](https://qiita.com/bkend_2/items/95b3082f7216788f3d20)

## ツールの説明

### Trivyの読み方
- 読み方は「トリビー」です。

### Trivyとは？
- 静的解析ツールでセキュリティ上の脆弱性を検出するOSS
- IaCの誤設定や機密情報の流出を防ぐ

## Terraformのコード

### Trivyを導入方法
「[aquasecurity/trivy-action@master](https://github.com/aquasecurity/trivy-action)」というアクションを使用します。


#### .github/workflows/trivy.yml
今回セキュリティスキャンするファイルは`./envs/dev/main.tf`です。
`scan-ref`を使って設定できます。
```yml:.github/workflows/trivy.yml
name: Terraform Trivy Scan

on:
  push:
    branches:
      - feature/*
      - hotfix/*
  pull_request:
    branches:
      - feature/*
      - hotfix/*

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Run Trivy
      uses: aquasecurity/trivy-action@master
      with:
        scan-type: 'config'
        scan-ref: ./envs/dev/main.tf # セキュリティスキャンする設定ファイル
        trivyignores: ./envs/dev/.trivyignore # ignoreする設定ファイル
        exit-code: '1'
```

Trivyで設定できる項目(一部抜粋)
| 設定値 | 値 | 説明 |
| ---- | ---- | ---- |
| scan-type | string | スキャンのタイプ |
| input | string　 | tarを入力 |
| image-ref | string | イメージを指定 |
| scan-ref | string | 実行するディレクトリ |
| format | string | 出力フォーマット |
| template | string | 出力テンプレート |
| output | string | 結果をファイルに出力するディレクトリ先 |
| exit-code | string | 脆弱性を検知したときのエラーコード |
| ignore-unfixed | boolean | パッチが適用されていない脆弱性を無視 |
| vuln-type | string | スキャン対象の脆弱性のタイプ |
| severity | string | 危険度の対象レベル |
| cache-dir | string | キャッシュディレクトリ |
| timeout | string | タイムアウト時間 |
| hide-progress | string | プログレスバーを非表示 |
| list-all-pkgs | string | 全ての危険レベルを出力 |
| scanners | string | 検出するセキュリティ問題のカンマ区切りのリスト |
| trivyignores | string | .trivyignoreの相対パス |
| trivy-config | string | trivy.yml設定のパス |

`trivyignores`では、Trivyで無視する設定を追加できます。
```yml:envs/dev/.trivyignore
# セキュリティグループでIPアドレスを全て許可している
AVD-AWS-0107
#　IPv4を自動割り当てに設定している
AVD-AWS-0164
# VPCフローログを有効にしていない
AVD-AWS-0178
```
## 動作確認
- Trivyを動かしてセキュリティスキャンをしてみます。画像のようにたくさん脆弱性が発見できます。
![スクリーンショット 2023-09-24 17.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2148800/b338fe87-6411-97ec-ada1-956e885ce82a.png)

開発途中で脆弱性を無視したい場合は白枠の部分を、`.trivyignore`に追加しましょう。
![スクリーンショット 2023-09-24 17.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2148800/0c0161c2-f883-eb96-b4a6-a909db8c55b2.png)

`.trivyignore`にコードを追加するとエラーをとして吐き出されなくなります。
![スクリーンショット 2023-09-24 17.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2148800/5bc87f71-4b79-3fb4-120e-2094c7f7409c.png)



## おわりに
今回はセキュリティスキャンツールの[Trivy](https://github.com/aquasecurity/trivy)を導入しました。
記事を書く前まではTrivyのことを`コンテナイメージの脆弱性ツール`という認識だったのですが、
セキュリティスキャンもできることを知らなかったです。
Trivyを導入して開発進めていく際に不具合など発見しましたら、
記事にて共有させていただきます。
最後まで読んでいただきましてありがとうございました。

今回作成したgithubのリポジトリ : https://github.com/hikobend/terraform-qiita


## 参考文献
- [Trivyとは？読み方、使い方、インストール、Aqua Security](https://urashita.com/archives/32031#:~:text=Trivy%E3%81%AE%E8%AA%AD%E3%81%BF%E6%96%B9%E3%81%AF%E3%80%81%E3%83%88%E3%83%AA%E3%83%93%E3%83%BC%E3%81%AE%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82) Trivyの読み方
- [aquasecurity/trivy](https://github.com/aquasecurity/trivy) TrivyのGithubリポジトリ
- [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) TrivyをGithubActionで動かすGithubリポジトリ
- [Trivy の Misconfiguration Scanning で Terraform の設定ミスを検出しよう](https://kakakakakku.hatenablog.com/entry/2023/08/30/084331) TrivyをGithubでの作動方法