Terraform 静的検査ツール比較
対象
- tfsec
- tflint
- KICS
- Checkov
Snyk
tfsec
特徴
CI系
- 公式のdocker imageがある
- GitHub Actionがある
- GitHub Security Alertsと統合できる
検査系
- AWS, GCP, Azure対応
- 警告を無視できる
- https://github.com/aquasecurity/tfsec#ignoring-warnings
- tfファイルにコメントで記載する形式
- 指定した検査を無視できる
- 独自の検査項目を追加できる
- https://aquasecurity.github.io/tfsec/v1.28.1/guides/configuration/custom-checks
- 定義ファイルは
.tfsecディレクトリの*_tfchecks.jsonまたは*_tfchecks.yaml - OPA/Regoでもできる
- 検査結果は各種formatに変更可能(JSON, CSV,,)
- 指摘する最小の重大度(CRITICAL, HIGH, MEDIUM, LOW)を決められる
- 重要度を変更できる
開発系
- VSCodeのプラグインがある
tflint
特徴
CI系
- 公式のdocker imageがある
- GitHub Actionがある
検査系
- AWS, GCP, Azure対応
- deep check
- クラウドへの接続情報を渡すことで実体と照らし合わせて検査できる
- 独自の検査項目を追加できる
- プラグインの機構があってGo言語で書ける
- AWS, GCP, Azureも公式のプラグインとして切り出されている
- 有効無効の設定可能
- 検査結果は各種formatに変更可能(JSON,,)
開発系
- 期待した動作ができなかったときなどに詳細なログを出力してデバッグできる
KICS
特徴
CI系
- 公式のdocker imageがある
- GitHub Actionがある
- GitLab の各レポートに対応している
- Static Application Security Testing (SAST)
- https://docs.kics.io/latest/integrations_gitlabci/#using_gitlab_sast_reports
--report-formats glsast
- Code Quality
- https://docs.kics.io/latest/integrations_gitlabci/#code_quality_integration
--report-formats codeclimate
- Static Application Security Testing (SAST)
検査系
- AWS, GCP, Azure, Kubernetesなどに対応
- クエリ(検査項目)を指定して検査を除外できる
- クエリのカテゴリごと指定して検査を除外できる
- severityを指定して結果から除外できる
- IDを指定して直接結果から除外できる
- 0以外の終了コードを返す結果を決められる。default [high,medium,low,info]
- 独自の検査項目を追加できる
- https://docs.kics.io/latest/creating-queries
- OPA/Regoでポリシーを記述できる
- また、ポリシーのテストを簡単にわかりやすく実施できます
- OPA/Rego自体にポリシーをテストする機能があるので、どのツールを選択してもテスト自体を行うことは可能です
- ただ、kicsの場合は、テストコードを用意するのではなく成功と失敗のサンプルファイルとそれに対応する結果をjsonで定義するだけでテストできます
- 汎用的な関数が定義されており、記述がしやすいです
- また、ポリシーのテストを簡単にわかりやすく実施できます
- 検査結果は各種formatに変更可能(JSON, PDF,,)
開発系
- VSCodeの拡張機能で自動でscanできる
Checkov
特徴
CI系
- 公式のdocker imageがある
- GitHub Actionsがある
検査系
- AWS, GCP, Azure, Kubernetesなどに対応
- 警告を無視できる
- tfファイルにコメントで記載する形式
- https://www.checkov.io/2.Basics/Suppressing and Skipping Policies.html
- 指定した検査だけを実施できる
- severityも使える - 指定した検査を無視できる
- severityも使える
- 検査の厳密性を3段階で決められる
- https://www.checkov.io/2.Basics/Hard and soft fail.html
-–soft-fail-–soft-fail-on-–hard-fail
- 独自の検査項目を追加できる
開発系
- VSCodeの拡張機能で自動でscanできる
実際の検査についての比較
各クラウドに対応していますが、今回はAWSの検査の比較をしてみます。
リソースの網羅度
使用率が高いリソースはおそらくどのツールも指摘してくれるので、あまり使わないリソースについて指摘してくれるかを確認してみます。
ベストプラクティスなどの知見が少なく指摘して欲しいため。
| tfsec | tflint | KICS | Checkov | |
|---|---|---|---|---|
| api-gateway | ○ | ○ | ○ | ○ |
| athena | ○ | ○ | ○ | ○ |
| autoscaling | ○ | ○ | ○ | ○ |
| cloudfront | ○ | ○ | ○ | ○ |
| cloudtrail | ○ | - | ○ | ○ |
| cloudwatch | ○ | ○ | ○ | ○ |
| codebuild | ○ | ○ | ○ | ○ |
| config | ○ | ○ | ○ | ○ |
| documentdb | ○ | ○ | ○ | ○ |
| dynamodb | ○ | ○ | ○ | ○ |
| ebs | ○ | ○ | ○ | ○ |
| ec2 | ○ | ○ | ○ | ○ |
| ecr | ○ | ○ | ○ | ○ |
| ecs | ○ | ○ | ○ | ○ |
| efs | ○ | ○ | ○ | ○ |
| eks | ○ | ○ | ○ | ○ |
| elasticsearch | ○ | ○ | ○ | ○ |
| elasticache | ○ | ○ | ○ | ○ |
| elb | ○ | ○ | ○ | ○ |
| emr | ○ | ○ | ○ | ○ |
| iam | ○ | ○ | ○ | ○ |
| kinesis | ○ | ○ | ○ | ○ |
| kms | ○ | ○ | ○ | ○ |
| lambda | ○ | ○ | ○ | ○ |
| mq | ○ | ○ | ○ | ○ |
| msk | ○ | ○ | ○ | ○ |
| neptune | ○ | - | ○ | ○ |
| rds | ○ | ○ | ○ | ○ |
| redshift | ○ | ○ | ○ | ○ |
| s3 | ○ | ○ | ○ | ○ |
| sns | ○ | - | ○ | ○ |
| sqs | ○ | - | ○ | ○ |
| ssm | ○ | ○ | ○ | ○ |
| vpc | ○ | ○ | ○ | ○ |
| workspaces | ○ | ○ | ○ | ○ |
| acm | - | ○ | - | ○ |
| accessanalyzer_analyzer | - | ○ | - | ○ |
| amplify | - | ○ | - | - |
| appconfig | - | ○ | - | - |
| appmesh | - | ○ | - | ○ |
| apprunner | - | ○ | - | - |
| appstream | - | ○ | - | - |
| appsync | - | ○ | - | ○ |
| backup | - | ○ | - | ○ |
| batch | - | ○ | ○ | ○ |
| budgets | - | ○ | - | ○ |
| chime | - | ○ | - | - |
| cloud9 | - | ○ | - | ○ |
| cloudformation | - | ○ | ○ | ○ |
| cloudfront | - | ○ | - | - |
| cloudhsm | - | ○ | - | ○ |
| codeartifact | - | ○ | - | ○ |
| codecommit | - | ○ | - | ○ |
| codedeploy | - | ○ | - | ○ |
| codepipeline | - | ○ | - | ○ |
| codestarconnections | - | ○ | - | - |
| cognito | - | ○ | ○ | ○ |
| connect | - | ○ | - | ○ |
| cur | - | ○ | - | ○ |
| customer_gateway | - | ○ | - | ○ |
| datasync | - | ○ | - | ○ |
| db_proxy | - | ○ | - | - |
| devicefarm | - | ○ | - | ○ |
| directory_service | - | ○ | - | ○ |
| dlm | - | ○ | - | ○ |
| dms | - | ○ | - | ○ |
| dx | - | ○ | - | ○ |
| elastic_beanstalk | - | ○ | - | ○ |
| elastictranscoder | - | ○ | - | ○ |
| flow_log | - | ○ | - | ○ |
| fms | - | ○ | - | ○ |
| fsx | - | ○ | - | ○ |
| gamelift | - | ○ | - | ○ |
| globalaccelerator | - | ○ | ○ | ○ |
| glue | - | ○ | ○ | ○ |
| guardduty | - | ○ | ○ | ○ |
| imagebuilder | - | ○ | - | ○ |
| inspector | - | ○ | - | ○ |
| iot | - | ○ | - | ○ |
| lakeformation | - | ○ | - | - |
| licensemanager | - | ○ | - | ○ |
| lightsail | - | ○ | - | ○ |
| macie | - | ○ | - | ○ |
| media_store | - | ○ | - | ○ |
| memorydb | - | ○ | - | ○ |
| opsworks | - | ○ | - | ○ |
| organizations | - | ○ | ○ | ○ |
| placement_group | - | ○ | - | ○ |
| prometheus | - | ○ | - | - |
| quicksight | - | ○ | - | ○ |
| resourcegroups | - | ○ | - | ○ |
| route53 | - | ○ | ○ | ○ |
| sagemaker | - | ○ | ○ | ○ |
| schemas | - | ○ | - | - |
| securityhub | - | ○ | - | ○ |
| service_discovery | - | ○ | - | ○ |
| servicecatalog | - | ○ | - | ○ |
| servicequotas | - | ○ | - | ○ |
| ses | - | ○ | - | ○ |
| sfn | - | ○ | - | ○ |
| shield | - | ○ | - | ○ |
| signer | - | ○ | - | - |
| spot | - | ○ | - | ○ |
| ssoadmin | - | ○ | ○ | ○ |
| storagegateway | - | ○ | - | ○ |
| swf | - | ○ | - | ○ |
| timestreamwrite | - | ○ | - | ○ |
| transfer | - | ○ | - | ○ |
| worklink | - | ○ | - | ○ |
| identitystore | - | - | ○ | ○ |
| dax | - | - | ○ | ○ |
| waf | ○ | ○ | ○ | ○ |
| xray | ○ | ○ | ○ | ○ |
| vpn | - | - | - | ○ |
| secretsmanager | ○ | ○ | ○ | ○ |
| scheduler | - | - | - | ○ |
| security_group | ○ | ○ | ○ | ○ |
| pinpoint | - | - | - | ○ |
| opensearch | - | - | - | ○ |
| appautoscaling | - | ○ | - | ○ |
| appflow | - | - | - | ○ |
| cloudsearch | - | - | - | ○ |
| codestarnotifications | - | - | - | ○ |
| comprehend | - | - | - | ○ |
| datapipeline | - | - | - | ○ |
| kendra | - | - | - | ○ |
| media_convert | - | - | - | ○ |
| media_package | - | - | - | ○ |
| mwaa | - | - | - | ○ |
| qldb | - | - | - | ○ |
| ram | - | - | - | ○ |
| sdb | - | - | - | ○ |
| networkfirewall | - | ○ | ○ | ○ |
リソースベースだとtflintとCheckovが網羅度が高いです。
tflint = Checkov > KICS > tfsec
ただ、KICSもtfsecも主要なリソースは指摘してくれるので一般的な利用だとどれでも良さそうです。
指摘の内容にもよってくるので次は検査項目について比較してみます。
検査項目の比較
次にどんな指摘をしてくれるかを見てみます。
全てを確認すると時間が幾らあっても足りないので抜粋して確認します。
EKS
全体感を確認するために4つとも対応していて使用頻度の高いEKSで比較。
| tfsec | tflint | KICS | Checkov | |
|---|---|---|---|---|
| コントロールプレーンのログを有効化している | ○ | - | ○ | ○ |
| secretsリソースの保護のためにencryption_configブロックを設定している | ○ | - | ○ | ○ |
| パブリックアクセスCIDRを明示的に設定 | ○ | - | ○ | ○ |
| パブリックアクセスを無効 | ○ | - | ○ | ○ |
| アドオンに設定するクラスタ名が有効 | - | ○ | - | - |
| アドオンに設定するresolve_conflictsが有効 | - | ○ | - | - |
| アドオンに設定するservice_account_role_arnが有効 | - | ○ | - | - |
| クラスタ名が有効 | - | ○ | - | - |
| ノードグループに設定するami_typeが有効 | - | ○ | - | - |
| ノードグループに設定するcapacity_typeが有効 | - | ○ | - | - |
| SourceSecurityGroupsを設定していない場合はリモートアクセスをしない | - | - | ○ | - |
| 0.0.0.0/0からの暗黙のSSHアクセスを許可していない | - | - | - | ○ |
| サポートされているKubernetes version | - | - | - | ○ |
tflintだけ毛色が違う指摘でベストプラクティスというよりplan,applyが通るかを見てるようです。
他のtfsec, KICS、Checkovは同じような内容で大事なところは漏れなく指摘してくれています。
Route 53
tflintは求めているものとは違いそうなので、tfsecが対応していないものでkicsとcheckovを比較。
| KICS | Checkov | |
|---|---|---|
| recordsを設定している | ○ | - |
| Aレコードにリソースがアタッチされている | - | ○ |
| パブリックホストゾーンに対してDNSSEC署名を有効化している | - | ○ |
| クエリログを有効化している | - | ○ |
KICSよりもChekovの方が指摘事項が多くより実になる内容になっています。
DynamoDB Accelerator
あんまり使用頻度の高くないもので比較。
| KICS | Checkov | |
|---|---|---|
| 保管時の暗号化が有効 | ○ | ○ |
| エンドポイントでTLSを利用 | - | ○ |
Route 53と同様にCheckovの方が多いです。
ドキュメントの充実度
検査項目の説明が詳しくされているか意図を汲めるか確認してみます。
tfsec
説明、影響、解決法、インセキュアな例、セキュアな例、参考リンクが記載されている。
KICS
説明、インセキュアな例、セキュアな例が記載されている。
Chekcov
説明のみで詳細はPythonかYAMLのファイルを読む。
まとめ
リソースの網羅度が高く検査項目も多いCheckovを導入するのが基本的には良さそうです。ただ、tfsecやKICSと違って詳細を確認するのにコードを読む必要がありますし、OPA/Regoを使うこともできないです。しかし、Checkovの他の追随を許さないカバー力には補って余りある魅力があります。
Discussion