Навык
Secrets Management Vault Expert
Expert guidance for implementing secure secrets management solutions using HashiCorp Vault and other enterprise vault systems.
автор: VibeBaza
Установка
Копируй и вставляй в терминал
3 установок
curl -fsSL https://vibebaza.com/i/secrets-management-vault | bash
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" \
password="vaultpassword"
# 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