Aller au contenu principal

Trivy ne cesse de s'améliorer

· 9 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Lors de ma veille technique, je scrute souvent les change-logs de mes outils préférés sur GitHub. Et lors de l'une d'elle, j'ai remarqué que Trivy avait ajouté pas mal de fonctionnalités dont le scan des comptes AWS mais aussi des images de VM.

Installation de Trivy

Commençons par installer Trivy. Je suis un adepte d'asdf qui permet de gérer la présence de plusieurs versions d'un outil sur son poste de travail.

asdf plugin add trivy
asdf install trivy latest
asdf global trivy latest

Pour ceux qui veulent l'installer avec le gestionnaire de packages de votre Distribution je vous renvoie sur la documentation de trivy.

Test de scan sur les ami AWS

attention

Pour que cela fonctionne, il faut au préalable télécharger et configurer la CLI AWS avec votre compte du même nom. J'ai expliqué comment le faire sur ce billet.

Dans un premier, je crée avec Packer un ami avec comme base la dernière Ubuntu Jammy. Voici la configuration que j'ai utilisée :

{
  "variables": {
    "aws_access_key": "xxxxxxxxx",
    "aws_secret_key": "upqkxxxxxxx"
  },
  "builders": [
    {
      "type": "amazon-ebs",
      "access_key": "{{user `aws_access_key`}}",
      "secret_key": "{{user `aws_secret_key`}}",
      "region": "eu-west-3",
      "source_ami": "ami-0493936afbe820b28",
      "subnet_id": "subnet-0b13a91a5bd16a5bf",
      "skip_region_validation": "true",
      "instance_type": "t2.micro",
      "ssh_username": "ubuntu",
      "ssh_interface": "public_ip",
      "associate_public_ip_address":"true",
      "tags": {
        "OS_Version": "Ubuntu22.04"
      },
      "ami_name": "packer-example-{{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": ["sleep 30", "sudo apt update -y", "sudo apt dist-upgrade -y"]
    }
  ]
}

J'installe les dernières versions de package via le provisionner shell. Allez, on lance le build de l'AMI :

export AWS_PROFILE=perso
export AWS_DEFAULT_REGION=eu-west-3
packer build ami-test.json

Au bout de quelques minutes, je récupère l'id de mon ami perso. Ah oui trivy ne prend pas en charge les AMI publiques.

On peut lancer le scan dessus en limitant sur la seule recherche des vulnérabilités :

trivy vm ami:ami-000bec0fcab9e6fe3 --security-checks vuln
2022-11-30T13:40:19.257+0100    INFO    Need to update DB
2022-11-30T13:40:19.257+0100    INFO    DB Repository: ghcr.io/aquasecurity/trivy-db
2022-11-30T13:40:19.257+0100    INFO    Downloading DB...
35.45 MiB / 35.45 MiB [-------------------------------------------------------------------------------------] 100.00% 5.94 MiB p/s 6.2s
2022-11-30T13:40:26.330+0100    INFO    Vulnerability scanning is enabled
2022-11-30T13:40:26.490+0100    INFO    Snapshot snap-0a30d66c5b43a0bbb found
2022-11-30T13:40:27.251+0100    WARN    No OS package is detected. Make sure you haven't deleted any files that contain information about the installed packages.
2022-11-30T13:40:27.251+0100    WARN    e.g. files under "/lib/apk/db/", "/var/lib/dpkg/" and "/var/lib/rpm"
2022-11-30T13:40:27.251+0100    INFO    Detected OS: ubuntu
2022-11-30T13:40:27.251+0100    INFO    Detecting Ubuntu vulnerabilities...
2022-11-30T13:40:27.251+0100    INFO    Number of language-specific files: 15
2022-11-30T13:40:27.251+0100    INFO    Detecting gobinary vulnerabilities...
2022-11-30T13:40:27.255+0100    INFO    Detecting python-pkg vulnerabilities...
2022-11-30T13:40:27.256+0100    INFO    Detecting jar vulnerabilities...

ami-000bec0fcab9e6fe3 (ubuntu 22.04)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

2022-11-30T13:40:27.257+0100    INFO    Table result includes only package filenames. Use '--format json' option to get the full path to the package file.

Python (python-pkg)

Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0)

┌─────────────────────┬────────────────┬──────────┬───────────────────┬───────────────┬───────────────────────────────────────────────────────────┐
│       Library       │ Vulnerability  │ Severity │ Installed Version │ Fixed Version │                           Title                           │
├─────────────────────┼────────────────┼──────────┼───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
│ Babel (PKG-INFO)    │ CVE-2021-42771 │ HIGH     │ 2.8.0             │ 2.9.1         │ CVE-2021-20095 CVE-2021-42771 python-babel: Relative path │
│                     │                │          │                   │               │ traversal allows attacker to load arbitrary locale...     │
│                     │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2021-42771                │
├─────────────────────┼────────────────┼──────────┼───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
│ oauthlib (PKG-INFO) │ CVE-2022-36087 │ MEDIUM   │ 3.2.0             │ 3.2.1         │ python-oauthlib: DoS when attacker provide malicious IPV6 │
│                     │                │          │                   │               │ URI                                                       │
│                     │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2022-36087                │
└─────────────────────┴────────────────┴──────────┴───────────────────┴───────────────┴───────────────────────────────────────────────────────────┘

Ça donne une faille sur un package python. Bon, je vais certainement intégrer cette fonctionnalité sur mes pipelines de CI/CD. Pour le moment trivy ne prend en charge que les images au format vmdk et donc les AMI AWS.

Test du scan de comptes AWS

Trivy depuis la version 0.31 à ajouter le scan des configurations de comptes AWS, à la recherche de problèmes de sécurité :

trivy aws

Scan Overview for AWS Account 123456789012
┌────────────────┬──────────────────────────────────────────────────┬──────────────┐
│                │                Misconfigurations                 │              │
│                ├──────────┬──────────────┬────────┬─────┬─────────┤              │
│ Service        │ Critical │     High     │ Medium │ Low │ Unknown │ Last Scanned │
├────────────────┼──────────┼──────────────┼────────┼─────┼─────────┼──────────────┤
│ accessanalyzer │        0 │            0 │      0 │   0 │       0 │ just now     │
│ api-gateway    │        0 │            0 │      0 │   0 │       0 │ just now     │
│ athena         │        0 │            2 │      0 │   0 │       0 │ just now     │
│ cloudfront     │        0 │            2 │      1 │   0 │       0 │ just now     │
│ cloudtrail     │        0 │            0 │      0 │   0 │       0 │ just now     │
│ cloudwatch     │        0 │            0 │      0 │   0 │       0 │ just now     │
│ codebuild      │        0 │            0 │      0 │   0 │       0 │ just now     │
│ documentdb     │        0 │            0 │      0 │   0 │       0 │ just now     │
│ dynamodb       │        0 │            0 │      0 │   0 │       0 │ just now     │
│ ec2            │       30 │            2 │      2 │  24 │       0 │ just now     │
│ ecr            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ ecs            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ efs            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ eks            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ elasticache    │        0 │            0 │      0 │   0 │       0 │ just now     │
│ elasticsearch  │        0 │            0 │      0 │   0 │       0 │ just now     │
│ elb            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ emr            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ iam            │        0 │            0 │      3 │   3 │       0 │ just now     │
│ kinesis        │        0 │            0 │      0 │   0 │       0 │ just now     │
│ kms            │        0 │            0 │      3 │   0 │       0 │ just now     │
│ lambda         │        0 │            0 │      0 │   0 │       0 │ just now     │
│ mq             │        0 │            0 │      0 │   0 │       0 │ just now     │
│ msk            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ neptune        │        0 │            0 │      0 │   0 │       0 │ just now     │
│ rds            │        1 │            0 │      0 │   0 │       0 │ just now     │
│ redshift       │        0 │            0 │      0 │   0 │       0 │ just now     │
│ s3             │        0 │           14 │      8 │   1 │       0 │ just now     │
│ sns            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ sqs            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ ssm            │        0 │            0 │      0 │   0 │       0 │ just now     │
│ workspaces     │        0 │            0 │      0 │   0 │       0 │ just now     │
└────────────────┴──────────┴──────────────┴────────┴─────┴─────────┴──────────────┘

Oh la la ! Il y a du boulot.

Analysons les failles de type critiques sur mes configurations EC2 :

trivy aws --service ec2

Resource Summary for Service 'ec2' (AWS Account 123456789012)
┌─────────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────┐
│                                                                         │            Misconfigurations             │
│                                                                         ├──────────┬──────┬────────┬─────┬─────────┤
│ Resource                                                                │ Critical │ High │ Medium │ Low │ Unknown │
├─────────────────────────────────────────────────────────────────────────┼──────────┼──────┼────────┼─────┼─────────┤
│ arn:aws:ec2:eu-west-3:123456789012:launch-template/lt-09a3fd7f17b133916 │        0 │    1 │      0 │   0 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:network-acl/acl-035056e4e1c7f5075    │        5 │    0 │      0 │   0 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:network-acl/acl-111e0e78             │        5 │    0 │      0 │   0 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-05014d62fdf276c71  │        4 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-075c209c0320be0a6  │        4 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-08e162dc510699812  │        4 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-094c7aa7295abd0e7  │        0 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0cce21325c9864cfb  │        4 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0ddae4a3cbac89ae7  │        4 │    0 │      0 │   4 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:vpc/vpc-04288f840663b6529            │        0 │    0 │      1 │   0 │       0 │
│ arn:aws:ec2:eu-west-3:123456789012:vpc/vpc-85818eec                     │        0 │    1 │      1 │   0 │       0 │
└─────────────────────────────────────────────────────────────────────────┴──────────┴──────┴────────┴─────┴─────────┘

trivy aws --service ec2 --arn arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0ddae4a3cbac89ae7
trivy aws --service ec2 --arn arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0ddae4a3cbac89ae7 --severity critical

Results for 'arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0ddae4a3cbac89ae7'


arn:aws:ec2:eu-west-3:123456789012:security-group/sg-0ddae4a3cbac89ae7 (cloud)

Tests: 4 (SUCCESSES: 0, FAILURES: 4, EXCEPTIONS: 0)
Failures: 4 (CRITICAL: 4)

CRITICAL: Security group rule allows egress to multiple public internet
addresses.
═════════════════════════════════════════════════════════════════════════
Opening up ports to connect out to the public internet is generally to be
avoided. You should restrict access to IP addresses or ranges that are
explicitly required where possible.

See https://avd.aquasec.com/misconfig/avd-aws-0104
────────────────────────────────────────────────────────────────────────

CRITICAL: Security group rule allows egress to multiple public internet
addresses.
════════════════════════════════════════════════════════════════════════
Opening up ports to connect out to the public internet is generally to be
avoided. You should restrict access to IP addresses or ranges that are
explicitly required where possible.

See https://avd.aquasec.com/misconfig/avd-aws-0104
───────────────────────────────────────────────────────────────────────

CRITICAL: Security group rule allows ingress from public internet.
═══════════════════════════════════════════════════════════════════════

Opening up ports to the public internet is generally to be avoided. You should
restrict access to IP addresses or ranges that explicitly require it where
possible.

See https://avd.aquasec.com/misconfig/avd-aws-0107

Si on se rend sur le lien indiqué, on retrouve les solutions pour corriger ce trou.

Plus loin

Même si ces fonctionnalités sont marquées comme expérimentales, c'est un bon moyen pour apprendre à construire des infrastructures plus sûres.

On peut aisément les intégrer dans batchs pour les programmer de manière régulière.

Je vais mettre à jour mon billet sur trivy avec toutes les nouveautés que je n'ai pas ajoutées ces derniers temps.

A la prochaine.