trivy入門してみる ①
trivy
Trivy (tri pronounced like trigger, vy pronounced like envy)
とのことなので「トリィヴィー」と発音するのが正しそう?
tfsecに続き、trivyを使ってterraformの静的解析をしてみる。
trivyは内部でtfsecを使って静的解析を実行している。
AquaSecurity社がtfsecを買収してtrivyに統合した結果が今とのこと。
tfsecとの違い
親切なことにtrivyのドキュメントに書かれていた。
実運用上で気になる差異はこんな感じ
Show Issue Lines
- GHAで走らせたりするとissueを作成してくれるのだが、対象箇所をissueに記載してくれない模様
Filtering by Severity
- うれしい機能。trivyはオプションとしてSeverityを指定してフィルタリングできる
さっそく使ってみる
- scan対象のterraformコード
resource "aws_instance" "nginx" { ami = "ami-0218d08a1f9dac831" vpc_security_group_ids = [aws_security_group.default.id] instance_type = "t3.micro" tags = { Name = "nginx_server" } user_data = <<EOF #!/bin/bash amazon-linux-extras install -y nginx1 systemctl restart nginx.service EOF } resource "aws_security_group" "default" { name = "ec2" ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
# CRITICALとHIGHのみをフィルタリング $ trivy config --severity CRITICAL,HIGH .
検出結果はtfsecと大差ない感じ。
tfsecのignoreがそのまま使える
内部的にtfsecを使っているのでそのままtfsecのignoreが使える。
ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] #tfsec:ignore:AVD-AWS-0107 }
ただ振られているIDはtfsecとは異なる。
tfsecはv1.0.0からルールが変更されて「AWS000」等のlegacyな一見して分かりにくいIDから変更になっている。
ここはtrivyも追従してもらいたいなと思う。
Rego
Regoを用いてカスタムポリシーを記載できるのだが、個人的には分かりにくいと感じる。
学習コストはある程度存在している。
そして注意したいのが、「Regoのカスタムポリシーはterraformに対応していない」ということ。
正確にはHCLは対応していてもTerraformHCLには対応していない。
ではどうするのかというと、terraform show -json で plan結果をJSONに起こしてOpen Policy Agentが読み取れる形式に変換してあげる必要がある。
terraformの静的解析ではtfsecに軍配が上がりそう・・・?
ただ、k8s manifest も Dockerfileにも対応しているtrivyに一本化したいという気持ちもあるのは確か。