Skip to content

Findings

After every sync, 141 audit rules check your assets for what's exposed, unencrypted, unused or misconfigured.

Once a sync has collected an asset source, AssetHermit runs its cloud's audit rules over every asset it found. A finding is one rule matching one asset. It opens on the sync that first matches it and stays open, keeping the time it opened, until a sync no longer matches it, when it resolves. A finding whose asset was deleted resolves the same way.

Each rule is a query in the query language, such as $type:storage.disk -encrypted:true, with a severity (critical, high, medium, low and info) and a category (security, cost, configuration and usage). So a rule's findings are one click from the inventory, where you can narrow them further.

Where findings show

  • Findings shows the counts by severity, each rule with what it found, the rules that found nothing, and what opened and resolved recently. Filter by severity, category, asset source or asset group.
  • A rule's page lists its assets, what resolved, its query and its guide.
  • Each asset's page has a Findings tab, and the dashboard shows the counts and the five worst rules.
  • Notifications tell you when a sync opens findings, from the severity you choose.

Guides

Every rule has a guide: what a finding means, why it matters, when it's fine and how to tell, the steps to fix it with a CLI command for one asset, and links to the cloud's own documentation.

Findings that save money

Cost rules, such as unused volumes and Elastic IPs, show up in Costs as savings, priced from what each asset costs you.

Not yet

Findings can't be muted yet, and you can't add rules of your own.

Amazon Web Services rules (89)

RuleSeverityCategory
Bucket policy allows public access
aws.s3.bucket.public-policy
CriticalSecurity
All traffic and ports are open to 0.0.0.0/0
aws.ec2.securitygroup.all-traffic-open-to-world
HighSecurity
Bucket does not fully block public access
aws.s3.bucket.public-access-block-disabled
HighSecurity
Cluster is publicly accessible
aws.redshift.cluster.publicly-accessible
HighSecurity
DB cluster is publicly accessible
aws.rds.dbcluster.publicly-accessible
HighSecurity
DB instance is publicly accessible
aws.rds.dbinstance.publicly-accessible
HighSecurity
GuardDuty detector is disabled
aws.guardduty.detector.disabled
HighSecurity
KMS key is scheduled for deletion
aws.kms.key.pending-deletion
HighConfiguration
Public API endpoint is open to the whole internet
aws.eks.cluster.public-endpoint-open
HighSecurity
RDP (port 3389) is open to the whole internet
aws.ec2.securitygroup.rdp-open-to-world
HighSecurity
SSH (port 22) is open to the whole internet
aws.ec2.securitygroup.ssh-open-to-world
HighSecurity
Trail logging is stopped
aws.cloudtrail.trail.logging-stopped
HighSecurity
Access key is older than 90 days and unused for 90 days
aws.iam.accesskey.old-unused
MediumSecurity
At-rest encryption is disabled
aws.elasticache.cachecluster.at-rest-encryption-disabled
MediumSecurity
At-rest encryption is disabled
aws.opensearchservice.domain.at-rest-encryption-disabled
MediumSecurity
Automated backups are disabled
aws.rds.dbinstance.backups-disabled
MediumConfiguration
Bucket has no default encryption configured
aws.s3.bucket.no-encryption
MediumSecurity
Certificate expires within 30 days
aws.acm.certificate.expiring-soon
MediumSecurity
Certificate is in expired state
aws.acm.certificate.expired
MediumSecurity
Certificate is in revoked state
aws.acm.certificate.revoked
MediumSecurity
Classic Load Balancer has no requests
aws.elb.loadbalancer.idle
MediumCost
Cluster storage is not encrypted
aws.redshift.cluster.unencrypted
MediumSecurity
Custom NACL allows all inbound traffic from 0.0.0.0/0
aws.ec2.networkacl.all-traffic-allowed
MediumSecurity
DB cluster storage is not encrypted
aws.docdb.dbcluster.unencrypted
MediumSecurity
DB cluster storage is not encrypted
aws.rds.dbcluster.unencrypted
MediumSecurity
DB instance storage is not encrypted
aws.rds.dbinstance.unencrypted
MediumSecurity
Default cache behavior allows plain HTTP
aws.cloudfront.distribution.insecure-viewer-protocol
MediumSecurity
Deliver logs status is FAILED
aws.ec2.flowlog.failed
MediumConfiguration
Distribution has no WAF web ACL attached
aws.cloudfront.distribution.no-waf
MediumSecurity
Domain does not enforce HTTPS
aws.opensearchservice.domain.https-not-enforced
MediumSecurity
EBS volume isn't encrypted
aws.ec2.volume.unencrypted
MediumSecurity
EC2 instance is idle
aws.ec2.instance.idle
MediumCost
Elastic IP address is unused
aws.ec2.eip.unused
MediumCost
ElastiCache cluster has no connections
aws.elasticache.cachecluster.idle
MediumCost
File system is not encrypted
aws.efs.filesystem.unencrypted
MediumSecurity
Image in 'error' state
aws.ec2.image.error-state
MediumConfiguration
Image in 'invalid' state
aws.ec2.image.invalid-state
MediumConfiguration
In-transit encryption is disabled
aws.elasticache.cachecluster.transit-encryption-disabled
MediumSecurity
Instance metadata service allows IMDSv1 (HttpTokens is not required)
aws.ec2.instance.imdsv1-allowed
MediumSecurity
Lambda runtime is deprecated
aws.lambda.function.deprecated
MediumSecurity
Load balancer has no traffic
aws.elbv2.loadbalancer.idle
MediumCost
MFA is not enabled for the user pool
aws.cognito.userpool.mfa-disabled
MediumSecurity
NAT gateway carries almost no traffic
aws.ec2.natgateway.idle
MediumCost
NAT Gateway is in failed state
aws.ec2.natgateway.failed
MediumCost
No WAF web ACL is associated with this stage
aws.apigateway.stage.no-waf
MediumSecurity
Node-to-node encryption is disabled
aws.opensearchservice.domain.node-to-node-encryption-disabled
MediumSecurity
OpenSearch domain is neither searched nor written to
aws.opensearch.domain.idle
MediumCost
Peering connection status is expired
aws.ec2.vpcpeeringconnection.expired
MediumConfiguration
Peering connection status is failed
aws.ec2.vpcpeeringconnection.failed
MediumConfiguration
Peering connection status is rejected
aws.ec2.vpcpeeringconnection.rejected
MediumConfiguration
Queue has no server-side encryption
aws.sqs.queue.unencrypted
MediumSecurity
RDS instance has no connections
aws.rds.dbinstance.idle
MediumCost
Secret rotation is disabled or exceeds 90 days
aws.secretsmanager.secret.rotation-disabled
MediumSecurity
Security group opens a port to the whole internet
aws.ec2.securitygroup.port-open-to-world
MediumSecurity
Snapshot is not encrypted
aws.ec2.snapshot.unencrypted
MediumSecurity
Transfer server failed to start
aws.transfer.server.start-failed
MediumConfiguration
Transfer server failed to stop
aws.transfer.server.stop-failed
MediumConfiguration
Transfer server is offline
aws.transfer.server.offline
MediumConfiguration
Volume is unused
aws.ec2.volume.unused
MediumCost
Access logging is not configured for this stage
aws.apigateway.stage.access-logging-disabled
LowConfiguration
Alarm actions are disabled
aws.cloudwatch.alarm.actions-disabled
LowConfiguration
Alarm has had insufficient data for over a day
aws.cloudwatch.alarm.insufficient-data
LowConfiguration
Application Load Balancer access logging is disabled
aws.elasticloadbalancingv2.loadbalancer.access-logs-disabled
LowConfiguration
Bucket versioning is not enabled
aws.s3.bucket.versioning-disabled
LowConfiguration
Certificate is in failed state
aws.acm.certificate.failed
LowConfiguration
Certificate is in inactive state
aws.acm.certificate.inactive
LowConfiguration
CloudWatch Container Insights is disabled for this cluster
aws.ecs.cluster.container-insights-disabled
LowConfiguration
Deletion protection is disabled
aws.docdb.dbcluster.deletion-protection-disabled
LowConfiguration
Deletion protection is disabled
aws.dynamodb.table.deletion-protection-disabled
LowConfiguration
Deletion protection is disabled
aws.elasticloadbalancingv2.loadbalancer.deletion-protection-disabled
LowConfiguration
Deletion protection is disabled
aws.networkfirewall.firewall.deletion-protection-disabled
LowConfiguration
Deletion protection is disabled
aws.rds.dbcluster.deletion-protection-disabled
LowConfiguration
Deletion protection is disabled
aws.rds.dbinstance.deletion-protection-disabled
LowConfiguration
EBS volume is attached but never read or written
aws.ec2.volume.idle
LowCost
ECS service uses under a third of its CPU and memory
aws.ecs.service.oversized
LowCost
Group uses a launch configuration instead of a launch template
aws.autoscaling.autoscalinggroup.legacy-launch-configuration
LowConfiguration
Image tags are mutable
aws.ecr.repository.mutable-tags
LowSecurity
Instance uses a previous generation type
aws.ec2.instance.previous-generation-type
LowConfiguration
Kinesis stream gets no records
aws.kinesis.stream.idle
LowCost
KMS key is disabled — data encrypted with it is inaccessible until it is re-enabled
aws.kms.key.disabled
LowConfiguration
Lambda function hasn't been invoked in 90 days
aws.lambda.function.unused
LowUsage
Load balancer has a plain-HTTP listener
aws.elasticloadbalancing.loadbalancer.insecure-listener
LowSecurity
Log file integrity validation is disabled
aws.cloudtrail.trail.log-validation-disabled
LowSecurity
Log retention is missing or exceeds 365 days
aws.logs.loggroup.no-retention
LowCost
Point-in-time recovery is disabled
aws.dynamodb.table.pitr-disabled
LowConfiguration
Queue has no dead-letter queue configured
aws.sqs.queue.no-dlq
LowConfiguration
Snapshot is older than 80 days
aws.ec2.snapshot.stale
LowCost
Topic has no subscribers
aws.sns.topic.no-subscribers
LowConfiguration
Trail is not multi-region
aws.cloudtrail.trail.not-multi-region
LowConfiguration

Google Cloud rules (23)

RuleSeverityCategory
BigQuery dataset is public
gcp.bigquery.dataset.public
CriticalSecurity
Cloud SQL instance accepts connections from anywhere
gcp.sqladmin.instance.open-to-world
CriticalSecurity
Firewall rule opens SSH or RDP to the internet
gcp.compute.firewall.admin-ports-open
CriticalSecurity
Firewall rule allows ingress from anywhere
gcp.compute.firewall.open-to-world
HighSecurity
GKE cluster uses legacy ABAC
gcp.container.cluster.legacy-abac
HighSecurity
GKE control plane is reachable from any address
gcp.container.cluster.open-control-plane
HighSecurity
VM runs as the default service account with full API access
gcp.compute.instance.default-service-account-full-access
HighSecurity
Bucket doesn't enforce public access prevention
gcp.storage.bucket.public-access-prevention-off
MediumSecurity
Bucket uses fine-grained ACLs
gcp.storage.bucket.uniform-access-disabled
MediumSecurity
Cloud SQL instance allows unencrypted connections
gcp.sqladmin.instance.unencrypted-connections
MediumSecurity
Cloud SQL instance has a public IP address
gcp.sqladmin.instance.public-ip
MediumSecurity
Cloud SQL instance has automated backups off
gcp.sqladmin.instance.backups-disabled
MediumConfiguration
Cloud SQL instance has no connections
gcp.sqladmin.instance.idle
MediumCost
Compute Engine instance is idle
gcp.compute.instance.idle
MediumCost
KMS key has no automatic rotation
gcp.cloudkms.crypto-key.rotation-disabled
MediumSecurity
Public DNS zone doesn't use DNSSEC
gcp.dns.managed-zone.dnssec-off
MediumSecurity
Service account key is older than 90 days
gcp.iam.service-account-key.user-managed-old
MediumSecurity
VM allows interactive serial console access
gcp.compute.instance.serial-port-enabled
MediumSecurity
VM has an external IP address
gcp.compute.instance.public-ip
MediumSecurity
Bucket versioning is not enabled
gcp.storage.bucket.versioning-disabled
LowConfiguration
Cloud SQL instance uses little of its CPU and memory
gcp.sqladmin.instance.oversized
LowCost
Subnet has no VPC flow logs
gcp.compute.subnetwork.flow-logs-disabled
LowConfiguration
VM doesn't use Shielded VM integrity checks
gcp.compute.instance.shielded-vm-off
LowSecurity

Microsoft Azure rules (29)

RuleSeverityCategory
Network security group opens SSH or RDP to the internet
azure.network.network-security-group.admin-ports-open
CriticalSecurity
AKS API server is reachable from any address
azure.containerservice.managed-cluster.open-api-server
HighSecurity
AKS cluster has Kubernetes RBAC off
azure.containerservice.managed-cluster.rbac-disabled
HighSecurity
Container registry allows anonymous pull
azure.containerregistry.registry.anonymous-pull
HighSecurity
Cosmos DB account accepts traffic from any network
azure.documentdb.database-account.open-network
HighSecurity
Network security group allows inbound traffic from anywhere
azure.network.network-security-group.open-to-internet
HighSecurity
AKS cluster allows local accounts
azure.containerservice.managed-cluster.local-accounts
MediumSecurity
App Service app accepts unencrypted HTTP
azure.web.site.https-only-off
MediumSecurity
Azure SQL server accepts public network access
azure.sql.server.public-network
MediumSecurity
Azure SQL server accepts TLS older than 1.2
azure.sql.server.old-tls
MediumSecurity
Container registry has its admin user on
azure.containerregistry.registry.admin-user
MediumSecurity
Cosmos DB account gets no requests
azure.documentdb.database-account.idle
MediumCost
Key vault accepts traffic from any network
azure.keyvault.vault.open-network
MediumSecurity
Key vault has purge protection off
azure.keyvault.vault.purge-protection-off
MediumSecurity
Linux VM allows password sign-in
azure.compute.virtual-machine.password-authentication
MediumSecurity
MySQL flexible server has no connections
azure.dbformysql.flexible-server.idle
MediumCost
MySQL server accepts public network access
azure.dbformysql.flexible-server.public-network
MediumSecurity
PostgreSQL flexible server has no connections
azure.dbforpostgresql.flexible-server.idle
MediumCost
PostgreSQL server accepts public network access
azure.dbforpostgresql.flexible-server.public-network
MediumSecurity
Redis cache accepts unencrypted connections
azure.cache.redis.non-ssl-port
MediumSecurity
Storage account accepts TLS older than 1.2
azure.storage.storage-account.old-tls
MediumSecurity
Storage account accepts traffic from any network
azure.storage.storage-account.open-network
MediumSecurity
Storage account accepts unencrypted HTTP
azure.storage.storage-account.https-not-required
MediumSecurity
Storage account allows public blob access
azure.storage.storage-account.blob-public-access
MediumSecurity
VM is idle
azure.compute.virtual-machine.idle
MediumCost
Managed disk isn't attached to any VM
azure.compute.disk.unattached
LowCost
MySQL flexible server uses little of its CPU and memory
azure.dbformysql.flexible-server.oversized
LowCost
PostgreSQL flexible server uses little of its CPU and memory
azure.dbforpostgresql.flexible-server.oversized
LowCost
Storage account allows shared key access
azure.storage.storage-account.shared-key-access
LowSecurity