Skip to content

Security score

This content is not available in your language yet.

The security score is an optional grade from A to F (and a score from 0 to 100) shown next to the monitors where a few checks say something useful: Linux and Windows hosts with the agent, Proxmox VE and Proxmox Backup Server, Synology, OPNsense, websites and Active Directory. Other monitors show nothing.

The score is off by default. An administrator turns it on in Settings → Account & security → Security score. Once on:

  • each rated monitor gets a small shield badge with its letter in the monitor list, and a Security badge with the score on its page;
  • clicking the badge opens the monitor’s report: what fails, with the evidence and the fix, what passes, the steps to improve the score on this kind of monitor, and a link to the matching section below.

Turning it off hides the badges, stops the periodic computation, and the dumbmonit_security_score series stop being written.

DumbMonit never asks the monitor anything extra to compute the score. The checks read the last values the collectors already recorded (looking back 6 hours), so a score costs nothing to the monitor.

Each check has a category (exposure, patching, authentication, encryption, backup, configuration), a severity that is its weight (critical 10, high 6, medium 3, low 1), a result (pass, fail, or unknown when the data is not collected), the evidence, the fix and a link to the vendor page it is based on.

Score = 100 × (weight of passing checks) ÷ (weight of passing + failing checks). Unknown checks are shown but never counted: a score must not drop because a monitoring account lacks a privilege, nor rise because nothing is known. A monitor whose checks are all unknown is not rated.

GradeScoreWord
A90–100Strong
B75–89Good
C60–74Fair
D40–59Weak
F0–39Poor

A failing critical check caps the grade at C, whatever the score.

While the score is on, the server recomputes it every 15 minutes and stores it as dumbmonit_security_score{target="<id>"} (and the number of failing checks as dumbmonit_security_checks_failed). Two built-in rules use it: Security score dropped (10 points or more below the best value of the last 24 hours) and Security score low (below 40). See Alert rules.

Machines with the agent. SSH and firewall checks need an agent from the same release as the server; with an older agent they are unknown.

CheckSeverityData
Security updates installedhighpending security updates (where the package manager tells them apart)
No pending updateslowpending updates
No reboot pendingmediumreboot required
SSH root login with a password refusedhighPermitRootLogin from sshd -T (prohibit-password passes)
SSH accepts keys onlymediumPasswordAuthentication, and KbdInteractiveAuthentication with UsePAM
Host firewall filters inbound traffichighan nftables or iptables input chain that drops or rejects
SELinux enforcingmediumSELinux mode (unknown where SELinux is absent)
Container images up to datemediumnewer image in the registry (only with containers)
No container image older than 180 dayslowimage age (only with containers)

To improve it:

  1. Install pending security updates, then turn on automatic security updates: unattended-upgrades on Debian and Ubuntu, dnf-automatic on Fedora and RHEL.
  2. Reboot after kernel or library updates.
  3. Check that your SSH key works, then set PermitRootLogin no, PasswordAuthentication no and KbdInteractiveAuthentication no in /etc/ssh/sshd_config and reload sshd.
  4. Turn on a host firewall that drops unsolicited inbound traffic: ufw enable on Ubuntu, firewalld on Fedora and RHEL, an nftables ruleset elsewhere.
  5. Keep SELinux enforcing where the distribution ships it; pull newer container images regularly.

Sources: CIS Controls, sshd_config(5), Red Hat — Using SELinux.

Machines with the Windows agent, from the same release as the server (read from the registry; an older agent reports none of these).

CheckSeverityData
Windows Firewall on for every profilehighdomain, private and public profiles (group policy first)
No reboot pendingmediumWindows Update or component servicing waiting for a restart
Remote Desktop requires Network Level Authenticationhighpasses when Remote Desktop is off
SMBv1 disabledhighSMBv1 server setting

To improve it:

  1. Install Windows updates (Settings → Windows Update) and restart when asked.
  2. Keep Windows Defender Firewall on for the domain, private and public profiles.
  3. If Remote Desktop is on, require Network Level Authentication and reach it through a VPN, never straight from the internet.
  4. Remove SMBv1: Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol.

Sources: Windows Firewall, SMBv1.

CheckSeverityData
Security updates installedhighpending security updates per node (needs Sys.Modify on the token, otherwise unknown)
Proxmox VE packages up to datemediumupgradable Proxmox packages per node
Running the installed kernelmediumnewer kernel installed than running
No test repository in usemediumenabled standard repositories
Package repositories correctly configuredmediumerrors and warnings Proxmox VE raises on the repositories
Enterprise repository subscriptionlowsubscription status per node
Web interface certificate valid for 14+ daysmediumnode certificate expiry
Every guest is in a backup jobhighguests not selected by any backup job
Backup jobs succeedhighlast result of each backup job

To improve it:

  1. Use a repository you are entitled to: enterprise with a subscription, otherwise pve-no-subscription; never pvetest on a node that matters.
  2. Install updates from the node’s Updates panel, then reboot into the new kernel.
  3. Put every VM and container in a backup job, ideally to a Proxmox Backup Server, and fix any job that fails.
  4. Replace the self-signed web certificate with an ACME one.

Sources: System Software Updates, Package Repositories, Backup and Restore.

CheckSeverityData
System updates installedhighpending updates (needs Sys.Modify on /system)
Running the installed Backup Server versionmediumdaemons still running the pre-upgrade version
Verify job scheduledhighnumber of verify jobs
Prune job scheduledmediumnumber of prune jobs
Backups copied elsewhere (sync or tape)mediumsync and tape backup jobs (3-2-1 rule)
Garbage collection clean, no bad chunkshighlast GC result and bad chunks per datastore
Certificate valid for 14+ daysmediumcertificate expiry

To improve it:

  1. Install updates and reboot when the kernel or proxmox-backup changed.
  2. Schedule a verify job and a prune job on every datastore.
  3. Keep a copy elsewhere: a sync job to a second Backup Server, or tape.
  4. Use an ACME certificate for the web interface.

Sources: Maintenance tasks, Remotes and sync.

CheckSeverityData
DSM 7 or laterhighDSM version
DSM up to datehigha DSM update is available (administrator account only)
Built-in admin account disabledmediumstate of the admin account (administrator account only)
Auto Block enabledmediumAuto Block setting (administrator account only)
DSM firewall enabledmediumfirewall setting (administrator account only)
Hyper Backup task configuredmediumnumber of Hyper Backup tasks
Hyper Backup tasks succeedhighlast result of each task

The four settings are read once an hour and only when DumbMonit signs in with an administrator account; with an ordinary account they stay unknown and do not count. Two-step verification and the HTTPS redirection are not read.

To improve it:

  1. Run the latest DSM 7 release for your model and let DSM install important updates automatically (Control Panel → Update & Restore).
  2. Disable the built-in admin account; sign in with a personal administrator protected by 2-step verification.
  3. Turn on Auto Block and the firewall (Control Panel → Security), and do not forward DSM ports to the internet: use a VPN.
  4. Back up to another device or a cloud destination with Hyper Backup, and fix any task that fails: RAID and snapshots are not backups.

Sources: Product support status, How to add extra security to your Synology NAS.

CheckSeverityData
Firmware updates installedhighpending package updates (unknown until OPNsense has checked for updates)
On the current major release seriesmediumnew major series available
No reboot pending after an updatemediumreboot required
Packet filter enabledcriticalpf status

To improve it:

  1. Check for updates in System → Firmware → Status, install them, reboot when asked.
  2. Move to the new major release once it is out.
  3. Keep the packet filter on.
  4. Allow the web GUI and SSH only from the LAN or a VPN, never from the WAN.

Sources: OPNsense updates, OPNsense firewall.

For HTTP(S) and TLS monitors that negotiate TLS, and for Website health & SEO monitors. A plain-HTTP monitor has no score.

CheckSeverityData
Certificate valid for 14+ dayshighdays to expiry (HTTP(S) and TLS monitors)
Certificate chain trustedhighchain verification (HTTP(S) and TLS monitors)
TLS 1.3 negotiatedlownegotiated protocol version (HTTP(S) and TLS monitors)
Served over HTTPShighfinal address after redirects (Website health)
Strict-Transport-Security headermediumheader with a max-age above 0
X-Content-Type-Options: nosnifflowheader value
Protected against clickjackinglowX-Frame-Options or CSP frame-ancestors
Content-Security-Policy headerlowan enforced policy (report-only does not count)

Headers are read on HTTPS responses only.

To improve it:

  1. Serve the site over HTTPS only, and redirect plain HTTP to HTTPS.
  2. Automate certificate renewal (ACME, e.g. Let’s Encrypt) and serve the full chain.
  3. Add security headers in the web server or reverse proxy: Strict-Transport-Security, X-Content-Type-Options: nosniff, and a Content-Security-Policy with frame-ancestors.
  4. Cross-check with Mozilla HTTP Observatory, which tests far more than this score.

Sources: Mozilla Server Side TLS, MDN — HTTP headers.

Scored from the PingCastle-style findings of the Active Directory collector: Kerberoastable accounts, accounts without Kerberos pre-authentication, unconstrained delegation, krbtgt password age, privileged group size, LAPS coverage, password policy, stale accounts. Each finding is a check that passes when it concerns zero objects.

To improve it:

  1. Fix critical and high findings first: they are the usual paths to Domain Admins.
  2. If the krbtgt password is old, reset it twice, a few hours apart, and remove unconstrained delegation from computers that are not domain controllers.
  3. Move services that run under user accounts with SPNs to group managed service accounts (gMSA).
  4. Run PingCastle for a complete assessment.

Sources: PingCastle health check rules, Windows LAPS.

  • The score only reflects what DumbMonit can see; many best practices are not checked because no collector reads the data: Proxmox firewall and two-factor authentication, OPNsense web GUI exposed on the WAN, Docker containers running privileged or with the Docker socket mounted, TLS 1.0/1.1 still offered (the probe only negotiates TLS 1.2 and 1.3), and many more.
  • A check is only as fresh as its data: some collectors re-read updates every few hours.
  • The weights are a product choice, the same for every installation.
  • Only the kinds above are rated. Others (switches, printers, UniFi, pfSense…) show no badge on purpose: a couple of checks would give a grade that means nothing.