mutao.net

いわゆる雑記。

trivy入門してみる ①

trivy

github.com

Trivy (tri pronounced like trigger, vy pronounced like envy)

とのことなので「トリィヴィー」と発音するのが正しそう?

tfsecに続き、trivyを使ってterraformの静的解析をしてみる。

trivyは内部でtfsecを使って静的解析を実行している。

AquaSecurity社がtfsecを買収してtrivyに統合した結果が今とのこと。

www.aquasec.com

tfsecとの違い

親切なことにtrivyのドキュメントに書かれていた。

aquasecurity.github.io

実運用上で気になる差異はこんな感じ

  • Custom Policies
    • tfsecはyamlJSONで記述することができるが、trivyはRegoというフォーマットで記載する模様。

aquasecurity.github.io

  • 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も追従してもらいたいなと思う。

github.com

avd.aquasec.com

Rego

Regoを用いてカスタムポリシーを記載できるのだが、個人的には分かりにくいと感じる。

学習コストはある程度存在している。

aquasecurity.github.io

そして注意したいのが、「Regoのカスタムポリシーはterraformに対応していない」ということ。

正確にはHCLは対応していてもTerraformHCLには対応していない。

ではどうするのかというと、terraform show -json で plan結果をJSONに起こしてOpen Policy Agentが読み取れる形式に変換してあげる必要がある。

terraformの静的解析ではtfsecに軍配が上がりそう・・・?

ただ、k8s manifest も Dockerfileにも対応しているtrivyに一本化したいという気持ちもあるのは確か。