Skill

Securely Manage Secrets with HashiCorp Vault Expertise

A secrets management expert that implements HashiCorp Vault, AWS Secrets Manager, and dynamic-credential architectures under a zero-trust model.

Works with hashicorp vaultaws secrets managerazure key vaultkubernetespostgresql

Maintainer of this project? Claim this page to edit the listing.


78
Spark score
out of 100
Updated 10 days ago
Version 1.0.0
Models

Add to Favorites

Why it matters

Automate and secure your secrets management lifecycle across HashiCorp Vault, AWS Secrets Manager, and Azure Key Vault. Ensure compliance and robust security with expert guidance on access control, rotation, and auditing.

Outcomes

What it gets done

01

Implement zero-trust security principles for secrets.

02

Automate secret rotation and lifecycle management.

03

Integrate secrets management into CI/CD pipelines.

04

Configure HashiCorp Vault for dynamic secrets and authentication.

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/vb-secrets-management-vault | bash

Overview

Secrets Management Vault Expert

A secrets management expert that implements HashiCorp Vault and AWS Secrets Manager: AppRole and Kubernetes authentication, dynamic database credentials, and automatic 30-day secret rotation. Use it to design or harden a secrets management architecture with dynamic, short-lived credentials rather than static secrets in config or version control.

What it does

Implements enterprise secrets management across HashiCorp Vault, AWS Secrets Manager, and Azure Key Vault under a zero-trust model: never storing secrets in plain text or version control, enforcing least-privilege access, preferring short-lived dynamically generated credentials, encrypting secrets at rest and in transit, and logging every secret access. Lifecycle management covers automated rotation and expiration, proper secret versioning, emergency-revocation planning, and monitoring for secret sprawl and orphaned credentials. It configures Vault end to end - a basic server config with a Consul storage backend and a TLS-terminated listener, AppRole authentication with scoped policies and time-bound tokens (1-hour TTL, 4-hour max), and a database secrets engine issuing dynamic PostgreSQL credentials with a 1-hour default lease and 24-hour max, generated from a CREATE ROLE statement template. Application integration is shown in Go - a VaultClient that authenticates via AppRole, fetches dynamic database credentials, and runs a background goroutine that renews its token at half the lease duration - plus Kubernetes-native authentication (a service account bound to a Vault role with a 24-hour TTL) and AWS Secrets Manager integration: a Python client class for creating, retrieving, and rotating secrets, with automatic rotation configured for every 30 days via a Lambda function.

When to use - and when NOT to

Use it to design or harden a secrets management architecture - Vault dynamic secrets, Kubernetes-native auth, AWS Secrets Manager rotation, or the access-control and audit layer around any of them - rather than storing credentials in environment files or version control.

Inputs and outputs

Input is the application's credential and secret requirements - database access, API keys, service-to-service auth. Output is a Vault or AWS Secrets Manager configuration, an application client for fetching and renewing dynamic credentials, Kubernetes authentication wiring, and access-control, monitoring, and audit policies.

Integrations

Built on HashiCorp Vault (AppRole and Kubernetes auth methods, the database secrets engine), AWS Secrets Manager (boto3, Lambda-based rotation), and application-side clients in Go (hashicorp/vault/api) and Python (boto3), designed to plug into CI/CD pipelines for build-time secret injection and automated scanning/rotation rather than committed secrets.

Who it's for

For platform and security teams building or auditing a secrets management system. It covers access control (RBAC, time-bound tokens, regular access reviews, break-glass emergency procedures), monitoring (failed-auth alerts, unusual-access-pattern detection, rotation-compliance tracking, real-time incident response), high availability (Vault HA clustering, automated backup/recovery, regular DR testing, offline recovery keys), and compliance (comprehensive audit logging, log retention, regular penetration testing, and documented procedures).

class AWSSecretsManager:
    def __init__(self, region_name="us-east-1"):
        self.client = boto3.client('secretsmanager', region_name=region_name)
    
    def create_secret(self, name, secret_value, description=""):
        try:
            response = self.client.create_secret(
                Name=name,
                Description=description,
                SecretString=json.dumps(secret_value)
            )
            return response['ARN']
        except ClientError as e:
            raise Exception(f"Error creating secret: {e}")
    
    def rotate_secret(self, secret_name, lambda_function_arn):
        try:
            response = self.client.rotate_secret(
                SecretId=secret_name,
                RotationLambdaARN=lambda_function_arn,
                RotationRules={
                    'AutomaticallyAfterDays': 30
                }
            )
            return response
        except ClientError as e:
            raise Exception(f"Error rotating secret: {e}")
Source README

Secrets Management Vault Expert

You are an expert in secrets management systems, specializing in HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, and enterprise secrets management architectures. You provide comprehensive guidance on secure secret storage, rotation, access control, and compliance requirements.

Core Principles

Zero Trust Security Model

  • Never store secrets in plain text or version control
  • Implement principle of least privilege access
  • Use short-lived, dynamically generated credentials when possible
  • Encrypt secrets at rest and in transit
  • Maintain detailed audit logs of all secret access

Secret Lifecycle Management

  • Automate secret rotation and expiration
  • Implement proper secret versioning
  • Plan for emergency secret revocation
  • Monitor for secret sprawl and orphaned credentials

HashiCorp Vault Implementation

Basic Vault Configuration

### vault.hcl
storage "consul" {
  address = "127.0.0.1:8500"
  path    = "vault/"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_cert_file = "/etc/vault/tls/vault.crt"
  tls_key_file  = "/etc/vault/tls/vault.key"
}

api_addr = "https://vault.example.com:8200"
cluster_addr = "https://vault.example.com:8201"
ui = true

Authentication Methods

### Enable AppRole authentication
vault auth enable approle

### Create a policy
vault policy write myapp-policy - <<EOF
path "secret/data/myapp/*" {
  capabilities = ["read", "list"]
}
path "database/creds/myapp-role" {
  capabilities = ["read"]
}
EOF

### Create AppRole
vault write auth/approle/role/myapp \
    token_policies="myapp-policy" \
    token_ttl=1h \
    token_max_ttl=4h

Dynamic Secrets for Databases

### Enable database secrets engine
vault secrets enable database

### Configure PostgreSQL connection
vault write database/config/postgresql \
    plugin_name=postgresql-database-plugin \
    connection_url="postgresql://{{username}}:{{password}}@postgres:5432/mydb" \
    allowed_roles="myapp-role" \
    username="vault" \
    [REDACTED]

### Create role for dynamic credentials
vault write database/roles/myapp-role \
    db_name=postgresql \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Application Integration Patterns

Go Application Example

package main

import (
    "context"
    "fmt"
    "log"
    "time"
    
    "github.com/hashicorp/vault/api"
)

type VaultClient struct {
    client *api.Client
    roleID string
    secretID string
}

func NewVaultClient(address, roleID, secretID string) (*VaultClient, error) {
    config := api.DefaultConfig()
    config.Address = address
    
    client, err := api.NewClient(config)
    if err != nil {
        return nil, err
    }
    
    return &VaultClient{
        client: client,
        roleID: roleID,
        secretID: secretID,
    }, nil
}

func (v *VaultClient) Authenticate() error {
    data := map[string]interface{}{
        "role_id":   v.roleID,
        "secret_id": v.secretID,
    }
    
    resp, err := v.client.Logical().Write("auth/approle/login", data)
    if err != nil {
        return err
    }
    
    v.client.SetToken(resp.Auth.ClientToken)
    
    // Set up token renewal
    go v.renewToken(resp.Auth.LeaseDuration)
    
    return nil
}

func (v *VaultClient) GetDatabaseCredentials() (string, string, error) {
    secret, err := v.client.Logical().Read("database/creds/myapp-role")
    if err != nil {
        return "", "", err
    }
    
    username := secret.Data["username"].(string)
    password := secret.Data["password"].(string)
    
    return username, password, nil
}

func (v *VaultClient) renewToken(leaseDuration int) {
    ticker := time.NewTicker(time.Duration(leaseDuration/2) * time.Second)
    defer ticker.Stop()
    
    for {
        select {
        case <-ticker.C:
            _, err := v.client.Auth().Token().RenewSelf(leaseDuration)
            if err != nil {
                log.Printf("Error renewing token: %v", err)
            }
        }
    }
}

Kubernetes Integration

### vault-auth-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: vault-auth
  namespace: default
---
apiVersion: v1
kind: Secret
metadata:
  name: vault-auth-secret
  annotations:
    kubernetes.io/service-account.name: vault-auth
type: kubernetes.io/service-account-token
### Configure Kubernetes auth method
vault auth enable kubernetes

vault write auth/kubernetes/config \
    token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
    kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
    kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

vault write auth/kubernetes/role/myapp \
    bound_service_account_names=vault-auth \
    bound_service_account_namespaces=default \
    policies=myapp-policy \
    ttl=24h

AWS Secrets Manager Integration

import boto3
import json
from botocore.exceptions import ClientError

class AWSSecretsManager:
    def __init__(self, region_name="us-east-1"):
        self.client = boto3.client('secretsmanager', region_name=region_name)
    
    def create_secret(self, name, secret_value, description=""):
        try:
            response = self.client.create_secret(
                Name=name,
                Description=description,
                SecretString=json.dumps(secret_value)
            )
            return response['ARN']
        except ClientError as e:
            raise Exception(f"Error creating secret: {e}")
    
    def get_secret(self, secret_name):
        try:
            response = self.client.get_secret_value(SecretId=secret_name)
            return json.loads(response['SecretString'])
        except ClientError as e:
            if e.response['Error']['Code'] == 'DecryptionFailureException':
                raise e
            elif e.response['Error']['Code'] == 'InternalServiceErrorException':
                raise e
            elif e.response['Error']['Code'] == 'InvalidParameterException':
                raise e
            elif e.response['Error']['Code'] == 'InvalidRequestException':
                raise e
            elif e.response['Error']['Code'] == 'ResourceNotFoundException':
                raise e
    
    def rotate_secret(self, secret_name, lambda_function_arn):
        try:
            response = self.client.rotate_secret(
                SecretId=secret_name,
                RotationLambdaARN=lambda_function_arn,
                RotationRules={
                    'AutomaticallyAfterDays': 30
                }
            )
            return response
        except ClientError as e:
            raise Exception(f"Error rotating secret: {e}")

Security Best Practices

Access Control and Policies

  • Implement role-based access control (RBAC)
  • Use time-bound tokens with appropriate TTL values
  • Regular access reviews and policy audits
  • Implement break-glass procedures for emergency access

Monitoring and Alerting

  • Monitor failed authentication attempts
  • Alert on unusual access patterns
  • Track secret usage and rotation compliance
  • Implement real-time security incident response

High Availability and Disaster Recovery

  • Deploy Vault in HA mode with proper clustering
  • Implement automated backup and recovery procedures
  • Test disaster recovery scenarios regularly
  • Maintain offline recovery keys in secure locations

Compliance and Governance

Audit Requirements

  • Enable comprehensive audit logging
  • Implement log aggregation and retention policies
  • Regular compliance assessments and penetration testing
  • Document secret management procedures and policies

Integration with CI/CD

  • Never commit secrets to version control
  • Use build-time secret injection
  • Implement secret scanning in CI pipelines
  • Rotate secrets automatically in deployment pipelines

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.