OpenVAS, now distributed as Greenbone Community Edition (GCE), is one of the most comprehensive open-source vulnerability scanners available, capable of identifying thousands of known CVEs across network services, web applications, and operating system configurations. Installing it natively on RHEL 9 requires complex dependency management, so the recommended approach is to deploy it via Docker Compose, which bundles all required Greenbone services cleanly. This tutorial walks through deploying Greenbone Community Edition, updating its NVT feed, running an authenticated vulnerability scan, and exporting a report. Regular vulnerability scanning is an essential component of a defence-in-depth security strategy.

Prerequisites

  • RHEL 9 server with root or sudo access
  • Docker and Docker Compose installed (dnf install -y docker docker-compose-plugin)
  • At least 8 GB RAM and 20 GB free disk space for feed data
  • Outbound internet access to download NVT feeds

Step 1 — Install Docker and Docker Compose

Enable the Docker CE repository and install Docker along with the Compose plugin. Then enable and start the Docker service.

dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker

Verify the installation:

docker --version
docker compose version

Step 2 — Create the Greenbone Docker Compose Configuration

Create a directory for Greenbone and write the official docker-compose.yml file. This configuration sets up all required Greenbone services including the vulnerability manager (gvmd), the scanner (openvas), the notus service for local checks, the feed sync containers, and the web interface (gsad).

mkdir -p /opt/greenbone && cd /opt/greenbone
cat > docker-compose.yml << 'EOF'
services:
  vulnerability-tests:
    image: greenbone/vulnerability-tests
    environment:
      STORAGE_PATH: /var/lib/openvas/22.04/vt-data/nasl
    volumes:
      - vt_data_vol:/mnt
  notus-data:
    image: greenbone/notus-data
    volumes:
      - notus_data_vol:/mnt
  scap-data:
    image: greenbone/scap-data
    volumes:
      - scap_data_vol:/mnt
  cert-bund-data:
    image: greenbone/cert-bund-data
    volumes:
      - cert_bund_data_vol:/mnt
  dfn-cert-data:
    image: greenbone/dfn-cert-data
    volumes:
      - dfn_cert_data_vol:/mnt
    depends_on:
      - cert-bund-data
  data-objects:
    image: greenbone/data-objects
    volumes:
      - data_objects_vol:/mnt
  report-formats:
    image: greenbone/report-formats
    volumes:
      - data_objects_vol:/mnt
    depends_on:
      - data-objects
  gpg-data:
    image: greenbone/gpg-data
    volumes:
      - gpg_data_vol:/mnt
  redis-server:
    image: greenbone/redis-server
    restart: on-failure
    volumes:
      - redis_socket_vol:/run/redis/
  pg-gvm:
    image: greenbone/pg-gvm:stable
    restart: on-failure
    volumes:
      - psql_data_vol:/var/lib/postgresql
      - psql_socket_vol:/var/run/postgresql
  gvmd:
    image: greenbone/gvmd:stable
    restart: on-failure
    volumes:
      - gvmd_data_vol:/var/lib/gvm
      - scap_data_vol:/var/lib/gvm/scap-data/
      - cert_bund_data_vol:/var/lib/gvm/cert-data
      - data_objects_vol:/var/lib/gvm/data-objects/gvmd
      - vt_data_vol:/var/lib/openvas/plugins
      - psql_data_vol:/var/lib/postgresql
      - gvmd_socket_vol:/run/gvmd
      - ospd_openvas_socket_vol:/run/ospd
      - notus_data_vol:/var/lib/notus
      - psql_socket_vol:/var/run/postgresql
    depends_on:
      pg-gvm:
        condition: service_started
  ospd-openvas:
    image: greenbone/ospd-openvas:stable
    restart: on-failure
    init: true
    cap_add:
      - NET_ADMIN
      - NET_RAW
    security_opt:
      - seccomp=unconfined
      - apparmor=unconfined
    volumes:
      - gpg_data_vol:/etc/openvas/gnupg
      - vt_data_vol:/var/lib/openvas/plugins
      - notus_data_vol:/var/lib/notus
      - ospd_openvas_socket_vol:/run/ospd
      - redis_socket_vol:/run/redis/
    depends_on:
      redis-server:
        condition: service_started
  notus-scanner:
    image: greenbone/notus-scanner:stable
    restart: on-failure
    volumes:
      - notus_data_vol:/var/lib/notus
      - gpg_data_vol:/etc/openvas/gnupg
    depends_on:
      redis-server:
        condition: service_started
  gvm-tools:
    image: greenbone/gvm-tools
    volumes:
      - gvmd_socket_vol:/run/gvmd
      - ospd_openvas_socket_vol:/run/ospd
    depends_on:
      - gvmd
      - ospd-openvas
  gsad:
    image: greenbone/gsad:stable
    restart: on-failure
    ports:
      - 9392:80
    volumes:
      - gvmd_socket_vol:/run/gvmd
    depends_on:
      - gvmd

volumes:
  gpg_data_vol:
  scap_data_vol:
  cert_bund_data_vol:
  dfn_cert_data_vol:
  data_objects_vol:
  gvmd_data_vol:
  psql_data_vol:
  vt_data_vol:
  notus_data_vol:
  ospd_openvas_socket_vol:
  redis_socket_vol:
  psql_socket_vol:
  gvmd_socket_vol:
EOF

Step 3 — Start Greenbone and Sync the NVT Feed

Pull the images and start all services. The first run also downloads the NVT (Network Vulnerability Tests) feed data. This process can take 15–30 minutes depending on your internet connection and server speed. The feed contains over 50,000 vulnerability check scripts.

cd /opt/greenbone
docker compose up -d

# Watch feed sync progress
docker compose logs -f vulnerability-tests notus-data scap-data

Wait until the feed containers exit (status Exited (0)), then check that gvmd is healthy:

docker compose ps
docker compose exec gvmd gvm-cli --gmp-username admin 
    --gmp-password admin socket --xml ""

Step 4 — Access the Web UI and Create an Admin User

Retrieve the auto-generated admin password and open the Greenbone Security Assistant (GSA) web interface. Open your browser to http://<server-ip>:9392 to access the dashboard.

# Retrieve the generated admin password
docker compose logs gsad 2>&1 | grep -i password

# Or create/reset the admin user manually
docker compose exec gvmd gvmd --user=admin --new-password='YourSecurePassword123!'

Log in with username admin and the password retrieved above. If accessing from a remote machine, open port 9392 in the firewall:

firewall-cmd --permanent --add-port=9392/tcp
firewall-cmd --reload

Step 5 — Create a Scan Target and Run a Vulnerability Scan

In the GSA web interface, navigate to Configuration → Targets and create a new target by entering the IP address or hostname of the system you want to scan. Then go to Scans → Tasks and create a new task, selecting your target and the Full and Fast scan config for a thorough scan. Click the play button to start the scan. You can monitor progress in real time on the Tasks page. For command-line scanning using gvm-cli:

# List available scan configs
docker compose exec gvm-tools gvm-cli --gmp-username admin 
    --gmp-password 'YourSecurePassword123!' socket 
    --xml ""

# Check scan task status
docker compose exec gvm-tools gvm-cli --gmp-username admin 
    --gmp-password 'YourSecurePassword123!' socket 
    --xml ""

Step 6 — Review Results and Export a PDF Report

Once the scan completes, navigate to Scans → Reports in the web UI. Click the report to view detailed findings. Each finding includes a CVSS score (0–10), severity rating (Low/Medium/High/Critical), CVE identifiers, affected host, and remediation guidance. To export a PDF report from the command line using the report ID:

# List reports to get the report ID
docker compose exec gvm-tools gvm-cli --gmp-username admin 
    --gmp-password 'YourSecurePassword123!' socket 
    --xml ""

# Export PDF report (replace REPORT_ID with actual UUID)
docker compose exec gvm-tools gvm-cli --gmp-username admin 
    --gmp-password 'YourSecurePassword123!' socket 
    --xml "" 
    > /opt/greenbone/scan-report.pdf

Focus remediation efforts on Critical and High severity findings first, prioritising those with publicly available exploits (marked with an exploit status in the report).

Conclusion

You have successfully deployed Greenbone Community Edition via Docker Compose on RHEL 9, synced the NVT vulnerability feed, run a vulnerability scan, and exported findings with CVSS severity scores. Regular scheduled scanning — weekly for internet-facing systems and monthly for internal hosts — is recommended to maintain visibility into your attack surface. Integrate scan reports into your patch management workflow to ensure timely remediation.

Next steps: How to Schedule Automated Vulnerability Scans with Greenbone on RHEL 9, How to Integrate OpenVAS Scan Results with SIEM Tools on RHEL 9, and How to Harden Web Servers with Security Headers, CSP, and HSTS on RHEL 9.