HashiCorp Vault (KMIP Secrets Engine) Integration Guide
Purpose
This guide explains how to configure HashiCorp Vault Enterprise’s KMIP Secrets Engine (part of the Advanced Data Protection add-on) as a read-only data source for the CBOM Discover_KMIP sensor. The sensor connects to Vault’s KMIP listener over the KMIP 1.4 protocol (TLS, default port 5696) and discovers cryptographic key metadata managed within a dedicated Vault KMIP scope.
Note: This guide covers the KMIP Secrets Engine only. Certificate issuance through Vault’s PKI engine, and general secret storage through the Transit and KV engines, are covered by the separate Discover_PKI sensor and its own setup guide. Do not confuse the two, they are distinct Vault Enterprise features discovered by different CBOM sensors.
The following cryptographic material is discovered:
- Symmetric and asymmetric key identifiers (KMIP Unique Identifiers)
- Key algorithms (e.g., AES, RSA, EC) and associated key lengths / curve parameters
- Key state (Pre-Active, Active, Deactivated, Destroyed, Compromised)
- Key names and Vault-managed custom attributes
- The Vault scope and role the key belongs to
The sensor operates in a strictly read-only mode. It invokes only the KMIP Locate and Get Attributes operations, it never invokes Get, which would return raw key material.
Prerequisites
Before beginning this setup, ensure the following conditions are met:
- You are running Vault Enterprise with the Advanced Data Protection (ADP) KMIP module licensed and enabled. The KMIP secrets engine is not available in Vault Community Edition.
- You have vault CLI access with a token authorized to enable secrets engines and manage the kmip/ mount (typically an admin or equivalent policy).
- Vault’s KMIP listener is reachable on TCP port 5696 (or your configured port) from the host running the CBOM sensor.
- OpenSSL is available on the CBOM sensor host to verify certificate files after generation.
- The CBOM sensor binary (cbom-sensor) version 1.4.0 or later is installed on the sensor host.
- Outbound TLS connections from the sensor host to the Vault KMIP listener are permitted by any intermediate firewalls or security groups.
- You have noted the Vault server’s hostname or IP address that will be used in the sensor configuration.
Enable the KMIP Secrets Engine and Create a Scope
Vault’s KMIP engine organizes keys into scopes (isolated KMIP tenants) and roles (permission sets within a scope). A dedicated scope keeps the CBOM sensor’s visibility separate from any scopes used by production encryption workflows.
Enable the KMIP Secrets Engine
Enable the engine at its default mount path:
vault secrets enable kmip
Configure the KMIP listener, including the address and port CBOM will connect to:
vault write kmip/config \ listen_addrs="0.0.0.0:5696" \ tls_ca_key_type="ec" \ tls_ca_key_bits=256 \ default_tls_client_key_type="rsa" \ default_tls_client_key_bits=2048
Confirm the engine is active:
vault secrets list | grep kmip
Create a Scope for CBOM Discovery
Create an isolated scope so the CBOM sensor’s role cannot see keys managed under other scopes:
vault write -f kmip/scope/cbom-discovery
Confirm the scope was created:
vault list kmip/scope
Note: Each Vault KMIP scope has its own internal CA. Do not reuse a CA certificate from a different scope when configuring the sensor in Section 6, connections will fail TLS verification if the wrong scope’s CA is used.
Create a Read Only KMIP Role
Vault KMIP roles deny all operations by default; only operations explicitly listed in operation_filters are permitted. This makes it straightforward to build a role that can enumerate key metadata but can never retrieve, create, or destroy key material.
Define the Role
vault write kmip/scope/cbom-discovery/role/cbom-readonly \ operation_filters="locate,get_attributes,get_attribute_list" \ tls_client_key_type="rsa" \ tls_client_key_bits=2048 \ tls_client_ttl="8760h"
Note: Do not include get, create, register, activate, revoke, or destroy in operation_filters. The get operation returns raw key material, and the write/lifecycle operations would let the sensor’s credential mutate the key inventory if compromised.
Verify the Role’s Effective Permissions
vault read kmip/scope/cbom-discovery/role/cbom-readonly
Confirm the operation_filters field lists only locate, get_attributes, and get_attribute_list.
Generate a Read Only Client Certificate
The CBOM sensor authenticates to Vault’s KMIP listener using mutual TLS. Vault issues both the client certificate and the scope’s CA directly through the CLI.
Generate the Client Certificate and Private Key
vault write -format=json \ kmip/scope/cbom-discovery/role/cbom-readonly/credential/generate \ format=pem > /tmp/cbom-kmip-cred.json
Extract the certificate and private key into separate files:
jq -r '.data.certificate' /tmp/cbom-kmip-cred.json > /etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem jq -r '.data.private_key' /tmp/cbom-kmip-cred.json > /etc/cbom/certs/vault-kmip/cbom-sensor-key.pem shred -u /tmp/cbom-kmip-cred.json
Retrieve the Scope’s CA Certificate
vault read -field=ca_chain kmip/scope/cbom-discovery/ca \ > /etc/cbom/certs/vault-kmip/vault-kmip-ca.pem
Set Permissions and Verify the Certificate Files
chmod 600 /etc/cbom/certs/vault-kmip/cbom-sensor-key.pem chmod 644 /etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem chmod 644 /etc/cbom/certs/vault-kmip/vault-kmip-ca.pem chown cbom-agent:cbom-agent /etc/cbom/certs/vault-kmip/
Confirm the client certificate was signed by the scope’s CA:
openssl verify -CAfile /etc/cbom/certs/vault-kmip/vault-kmip-ca.pem \ /etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem
Expected output:
/etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem: OK
Confirm the private key matches the certificate:
openssl x509 -noout -modulus -in /etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem | md5sum openssl rsa -noout -modulus -in /etc/cbom/certs/vault-kmip/cbom-sensor-key.pem | md5sum
Both MD5 values must be identical.
Configure CBOM Sensor
Add the Vault KMIP sensor configuration to the CBOM sensor configuration file.
sensors: - name: Discover_KMIP type: kmip enabled: true schedule: "0 2 * * *" # Run daily at 02:00 sensor-host local time connection: host: vault.example.internal # Vault server hostname or IP port: 5696 protocol: kmip kmip_version: "1.4" vendor_scope: cbom-discovery # Vault KMIP scope this sensor is bound to tls: enabled: true ca_cert: /etc/cbom/certs/vault-kmip/vault-kmip-ca.pem client_cert: /etc/cbom/certs/vault-kmip/cbom-sensor-cert.pem client_key: /etc/cbom/certs/vault-kmip/cbom-sensor-key.pem verify_server_cert: true min_tls_version: "1.2" discovery: operations: - Locate - GetAttributes attribute_list: - Unique Identifier - Name - Cryptographic Algorithm - Cryptographic Length - Cryptographic Usage Mask - State - Initial Date - Activation Date - Deactivation Date - Object Type max_objects_per_request: 500 include_destroyed_objects: false output: tags: source: hashicorp-vault-kmip environment: production sensor: Discover_KMIP forward_to: cbom-collector
Save this configuration to the sensor configuration file, typically located at: /etc/cbom/config/sensors.yaml
Reload the sensor service to apply the new configuration:
systemctl reload cbom-sensor
Validation
After configuring the sensor, confirm that it connects successfully and discovers key metadata.
Trigger a manual sensor run to test the connection immediately without waiting for the scheduled interval:
cbom-sensor run --sensor Discover_KMIP --once
Check the sensor log for a successful KMIP handshake and discovery output:
journalctl -u cbom-sensor -n 100 --no-pager | grep -i "Discover_KMIP"
A successful run produces log lines similar to:
INFO Discover_KMIP: TLS handshake completed with vault.example.internal:5696 INFO Discover_KMIP: Bound to Vault KMIP scope 'cbom-discovery' INFO Discover_KMIP: KMIP Locate returned 96 object identifiers INFO Discover_KMIP: GetAttributes completed for 96 objects INFO Discover_KMIP: Discovery cycle finished. Forwarded 96 records to cbom-collector
- Verify that key metadata records appear in the CBOM inventory by querying the collector API or UI and filtering by source: hashicorp-vault-kmip.
- Confirm that no key material (raw key bytes) appears in the discovered records, only metadata fields listed in the attribute_list should be present.
- Enable Vault audit logging if not already active, and confirm entries for the cbom-readonly role’s client certificate show only locate and get_attributes KMIP operations:
vault audit list vault read sys/audit
Common Errors and Resolution
Error 1: TLS Handshake Failure, Unknown CA
ERROR Discover_KMIP: TLS handshake failed: x509: certificate signed by unknown authority
Cause: The ca_cert configured on the sensor does not belong to the cbom-discovery scope. Each Vault KMIP scope has its own independent CA, a CA certificate exported from a different scope will never validate the client or server certificate for this scope.
Resolution:
- Re-run vault read -field=ca_chain kmip/scope/cbom-discovery/ca and confirm the output matches the file referenced by ca_cert.
- If multiple scopes exist, double check the scope name used in both Section 3.2 and the vendor_scope field in Section 6.
- Redeploy the correct CA file to the sensor host and re-run validation.
Error 2: KMIP Permission Denied on Locate
ERROR Discover_KMIP: KMIP operation Locate returned result status: Operation Failed (ResultReason: Permission Denied)
Cause: The cbom-readonly role’s operation_filters does not include locate and/or get_attributes, or the client certificate presented was generated against a different role.
Resolution:
- Run vault read kmip/scope/cbom-discovery/role/cbom-readonly and confirm operation_filters includes locate, get_attributes, and get_attribute_list.
- If the filters are missing, update the role as shown in Section 4.1, then regenerate the client certificate, Vault does not retroactively apply role changes to certificates already issued.
- Confirm the certificate deployed to the sensor host was generated from kmip/scope/cbom-discovery/role/cbom-readonly/credential/generate and not from an unrelated role.
Error 3: Connection Refused on Port 5696
ERROR Discover_KMIP: dial tcp vault.example.internal:5696: connect: connection refused
Cause: Vault’s KMIP listener is not configured or the KMIP engine’s ADP license is not active, so the listener never starts. This can also occur if a firewall blocks TCP 5696 between the sensor host and the Vault server.
Resolution:
-
Confirm the Advanced Data Protection KMIP module is present in the active Vault Enterprise license:
vault read sys/license/status
-
Confirm the listener configuration is present and the engine is mounted:
vault read kmip/config
-
From the sensor host, test basic TCP connectivity:
nc -zv vault.example.internal 5696
- If the connection times out rather than refusing, inspect firewall rules on both the sensor host and the network path to the Vault server, and confirm any load balancer in front of Vault forwards TCP 5696 (KMIP is not an HTTP-based protocol and cannot be proxied like Vault’s HTTP API).
Security Recommendations
- Keep the CBOM discovery scope isolated: Do not reuse cbom-discovery for any application’s actual encryption workflow. A dedicated scope guarantees the sensor’s role can never enumerate keys belonging to production KMIP clients.
- Never widen operation_filters beyond read operations: locate, get_attributes, and get_attribute_list are sufficient for Discover_KMIP. Adding get, create, activate, revoke, or destroy to the cbom-readonly role would let a compromised sensor credential export or tamper with key material.
- Rotate the client certificate on a schedule: The tls_client_ttl set in Section 4.1 bounds the certificate’s lifetime. Re-run credential/generate before expiry and redeploy the new certificate and key to the sensor host; Vault does not auto-renew KMIP client certificates.
- Store the private key securely: Restrict cbom-sensor-key.pem to the cbom-agent service account with chmod 600, and never commit it to source control or a shared filesystem.
- Enable and monitor Vault’s audit device: Route Vault’s audit log to your SIEM and alert on any KMIP operation from the cbom-readonly role other than locate, get_attributes, or get_attribute_list, such activity would indicate a misconfigured role or a compromised credential.
Conclusion
This guide walked through enabling Vault’s KMIP secrets engine, creating an isolated scope and a read-only role scoped to locate and get_attributes only, and issuing a mutual TLS client certificate for the CBOM Discover_KMIP sensor. Once configured, the sensor maintains a continuously updated inventory of key metadata, algorithm, length, state, and lifecycle dates, from Vault’s KMIP-managed keys, without ever retrieving raw key material. For questions about multi-scope deployments, Vault namespaces, or integrating discovery output with the CBOM aggregator pipeline, refer to the CBOM platform documentation or contact your CBOM administrator.
