Skip to main content

How to Run an OpenSearch Security Assessment

Evaluate AWS OpenSearch domain configuration against 12 controls covering the Darkbeam, Wyze, and Microsoft Elasticsearch breach patterns.

Prerequisites

  • Stave binary built (cd stave && make build)
  • OpenSearch observations in obs.v0.1 format

1) Extract OpenSearch observations

Use an extractor to produce obs.v0.1 JSON from AWS OpenSearch APIs. The extractor must call:

AWS APIWhat it producesControls that need it
opensearch describe-domainDomain config, VPC, encryption, FGAC, HTTPSAll controls
opensearch describe-domain-configFull config detail, access policiesACCESS.POLICY.001
opensearch list-domain-namesDomain inventoryDiscovery

Key field mapping

AWS API fieldobs.v0.1 property
VPCOptions == nullsearch_service.access.publicly_accessible = true
VPCOptions.VPCId presentsearch_service.access.vpc_enabled = true
AdvancedSecurityOptions.Enabledsearch_service.access.fgac_enabled
AdvancedSecurityOptions.InternalUserDatabaseEnabled or FGACsearch_service.access.auth_enabled
Dashboards endpoint + publicsearch_service.access.kibana_public
AccessPolicies contains "Principal":"*"search_service.access.policy_allows_wildcard
EncryptionAtRestOptions.Enabledsearch_service.encryption.at_rest_enabled
NodeToNodeEncryptionOptions.Enabledsearch_service.encryption.node_to_node_enabled
DomainEndpointOptions.EnforceHTTPSsearch_service.transport.https_enforced
LogPublishingOptions.AUDIT_LOGS.Enabledsearch_service.logging.audit_logs_enabled
Snapshot repo S3 bucket encryptedsearch_service.snapshots.encrypted

2) Evaluate

stave apply \
--controls controls/opensearch \
--observations ./opensearch-obs/ \
--max-unsafe 168h \
--now 2026-01-15T00:00:00Z \
--format json > opensearch-findings.json

3) What the OpenSearch pack covers

12 controls across 4 categories:

CategoryControlsWhat they detect
Access controlAUTH.001, PUBLIC.001, VPC.001, FGAC.001, KIBANA.001, ACCESS.POLICY.001No auth (Darkbeam root cause), public endpoint, no VPC, no FGAC, public dashboards, wildcard principal
EncryptionENCRYPT.001, ENCRYPT.002, HTTPS.001Unencrypted at rest, no node-to-node encryption, HTTP allowed
LoggingLOG.001No audit logging
Data protectionSNAPSHOT.001Unencrypted snapshots
CompletenessINCOMPLETE.001Missing observation data

4) Breach patterns this prevents

BreachRecordsRoot causeControls that fire
Darkbeam (2023)3.8BPublic ES, no auth, no VPCAUTH.001, PUBLIC.001, VPC.001, FGAC.001, KIBANA.001, ACCESS.POLICY.001
Wyze (2019)2.4MUnsecured ES clusterAUTH.001, PUBLIC.001
Microsoft (2020)250MMisconfigured ES, no authAUTH.001, FGAC.001

5) Example observation (Darkbeam pattern — unsafe)

{
"id": "opensearch-darkbeam-pattern",
"type": "aws_opensearch_domain",
"vendor": "aws",
"properties": {
"search_service": {
"kind": "domain",
"access": {
"publicly_accessible": true,
"vpc_enabled": false,
"auth_enabled": false,
"fgac_enabled": false,
"kibana_public": true,
"policy_allows_wildcard": true
},
"encryption": {
"at_rest_enabled": false,
"node_to_node_enabled": false
},
"transport": {
"https_enforced": false
},
"logging": {
"audit_logs_enabled": false
},
"snapshots": {
"encrypted": false
}
}
}
}

All 11 non-INCOMPLETE controls fire. This is the maximum-exposure configuration.

Notes

  • OpenSearch controls coexist with S3/IAM controls when evaluated together.
  • The search_service.kind == "domain" discriminator prevents false matches.