Ontwikkel Pulumi Infrastructure met Geavanceerde Secrets Rotatie en Beheer
description
Met deze prompt kan de gebruiker een Pulumi infrastructuur ontwerpen die geavanceerd secrets beheer bevat, waardoor risico's op datalekken en beveiligingsinbreuken afnemen. Het helpt bij het automatiseren van rotatieprocessen en het integreren met externe secrets managers, wat veiliger en efficiënter is dan handmatig beheer.
prompt
Help me bij het ontwerpen van een Pulumi infrastructuur die geavanceerde secrets rotatie en beheer ondersteunt om de beveiliging te verbeteren. Mijn huidige Pulumi configuratie is: <voer je huidige Pulumi configuratie in>. Beschrijf ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een uitgebreide gids voor het implementeren van geavanceerde secrets rotatie en beheer in je Pulumi infrastructuur, inclusief voorbeelden en best practices.
---
### 1. Overzicht en kernprincipes
- **Secrets rotatie**: Automatisch wijzigen van geheime gegevens zoals API-sleutels of database wachtwoorden.
- **Secrets management**: Gebruik van een veilige externe secrets manager (bijv. AWS Secrets Manager, HashiCorp Vault).
- **Beveiligde opslag**: Gevoelige gegevens worden versleuteld opgeslagen en alleen toegankelijk via geauthenticeerde en geautoriseerde processen.
---
### 2. Integratie met externe secrets managers
#### a. AWS Secrets Manager gebruiken
AWS Secrets Manager biedt automatische rotatie, versiebeheer en integratie met andere AWS-services.
**Voorbeeld: secret creëren en rotatie instellen**
```typescript
import * as aws from "@pulumi/aws";
// Maak een nieuwe secret aan
const mySecret = new aws.secretsmanager.Secret("mySecret");
// Voeg een secret value toe
const secretVersion = new aws.secretsmanager.SecretVersion("mySecretVersion", {
secretId: mySecret.id,
secretString: JSON.stringify({ username: "admin", password: "initieelWachtwoord" }),
});
// Activeer rotatie
const rotationLambda = new aws.lambda.Function("rotationLambda", {
runtime: "nodejs14.x",
role: /* rol met juiste permissies */,
handler: "index.handler",
code: new aws.s3.BucketObject("lambda.zip", {
bucket: bucket.id,
source: new pulumi.asset.FileAsset("rotationLambda.zip"),
}).bucket.apply(bucketName => `s3://${bucketName}/rotationLambda.zip`),
});
// Configuratie voor automatische rotatie
const secretRotation = new aws.secretsmanager.SecretRotation("secretRotation", {
secretId: mySecret.id,
rotationLambdaArn: rotationLambda.arn,
rotationRules: {
automaticallyAfterDays: 30, // rotatie elke 30 dagen
},
});
```
#### b. Rotatie Lambda functie
De Lambda moet de secret vernieuwen en deze terugplaatsen in Secrets Manager. Zorg dat deze code veilig is, bijvoorbeeld door gebruik te maken van environment variables en het vermijden van harde wachtwoorden.
---
### 3. Beveiliging en best practices
- **Versleuteling**: Gebruik AWS KMS voor encryptie van secrets.
- **Toegangscontrole**: Beperk toegang tot secrets via IAM policies.
- **Audit en logging**: Log rotatie-activiteiten met CloudTrail.
- **Secrets scheiden**: Beheer verschillende secrets apart en minimaliseer de toegang.
- **Automatisering**: Automatiseer rotatie en toegang via CI/CD pipelines.
---
### 4. Gevoelige gegevens veilig opslaan
Gebruik AWS Systems Manager Parameter Store of Secrets Manager voor opslag. Versleutel altijd bij opslag en tijdens overdracht.
Voorbeeld: geheim in Parameter Store
```typescript
const secureParameter = new aws.simplesystemsmanagement.Parameter("secureParam", {
type: "SecureString",
value: "SuperVeiligWachtwoord",
});
```
---
### 5. Continual security en compliance
- **Automatische rotatie**: Vermindert risico bij geheime blootstelling.
- **Least privilege**: Geef alleen noodzakelijke permissies.
- **Auditing**: Houd rotatie- en toegangslogs bij.
- **Regelmatige audits**: Controleer of secrets up-to-date en veilig zijn.
---
### 6. Samenvatting
- Gebruik AWS Secrets Manager met rotatie Lambda voor automatische rotatie.
- Versleutel secrets en beperk toegangsrechten.
- Automatiseer rotatie en audit logs.
- Implementeer CI/CD pipelines om secrets veilig te beheren.
- Documenteer en controleer periodiek de beveiligingspraktijken.
---
Wil je dat ik een compleet voorbeeld met alle benodigde Lambda code en IAM policies voor je opstel?
provider: deepseek
model: deepseek-chat
Zeker, ik help je bij het ontwerpen van een geavanceerd secrets management systeem met Pulumi. Hier is een complete implementatie met AWS Secrets Manager voor automatische rotatie:
## Basis Secrets Management Infrastructuur
```typescript
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
// S3 Bucket voor algemene data (jouw bestaande configuratie)
const bucket = new aws.s3.Bucket("my-bucket", {
bucket: "my-app-bucket",
serverSideEncryptionConfiguration: {
rule: {
applyServerSideEncryptionByDefault: {
sseAlgorithm: "AES256"
}
}
}
});
// AWS Secrets Manager voor geheime sleutels
const databaseSecret = new aws.secretsmanager.Secret("database-credentials", {
name: "prod/database/credentials",
description: "Database credentials voor productie omgeving",
recoveryWindowInDays: 30
});
// Geheime waarden toevoegen
const secretVersion = new aws.secretsmanager.SecretVersion("database-secret-version", {
secretId: databaseSecret.id,
secretString: JSON.stringify({
username: "db-user",
password: "initial-password-123"
})
});
```
## Automatische Secrets Rotatie
```typescript
// IAM Role voor Lambda rotatiefunctie
const rotationLambdaRole = new aws.iam.Role("secrets-rotation-lambda-role", {
assumeRolePolicy: JSON.stringify({
Version: "2012-10-17",
Statement: [{
Action: "sts:AssumeRole",
Effect: "Allow",
Principal: {
Service: "lambda.amazonaws.com"
}
}]
})
});
// IAM Policy voor secrets rotatie
const rotationPolicy = new aws.iam.RolePolicy("secrets-rotation-policy", {
role: rotationLambdaRole.id,
policy: pulumi.all([databaseSecret.arn]).apply(([secretArn]) =>
JSON.stringify({
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Action: [
"secretsmanager:DescribeSecret",
"secretsmanager:GetSecretValue",
"secretsmanager:PutSecretValue",
"secretsmanager:UpdateSecretVersionStage"
],
Resource: secretArn
},
{
Effect: "Allow",
Action: [
"secretsmanager:GetRandomPassword"
],
Resource: "*"
}
]
})
)
});
// Lambda functie voor rotatie (voorbeeld voor RDS)
const rotationLambda = new aws.lambda.Function("secrets-rotation-lambda", {
code: new pulumi.asset.AssetArchive({
"index.py": new pulumi.asset.StringAsset(`
import boto3
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
secret_arn = event['SecretId']
client = boto3.client('secretsmanager')
# Stap 1: Haal huidige secret op
current_secret = client.get_secret_value(SecretId=secret_arn)
secret_dict = json.loads(current_secret['SecretString'])
# Stap 2: Genereer nieuw wachtwoord
new_password = client.get_random_password(
PasswordLength=32,
ExcludeCharacters='"@/\\'
)['RandomPassword']
# Stap 3: Update database (voorbeeld voor RDS MySQL)
rds_client = boto3.client('rds')
rds_client.modify_db_instance(
DBInstanceIdentifier='your-db-instance',
MasterUserPassword=new_password
)
# Stap 4: Update secret in Secrets Manager
secret_dict['password'] = new_password
client.put_secret_value(
SecretId=secret_arn,
SecretString=json.dumps(secret_dict),
VersionStages=['AWSCURRENT']
)
return {'status': 'success'}
`)
}),
role: rotationLambdaRole.arn,
handler: "index.lambda_handler",
runtime: "python3.9",
timeout: 300
});
// Rotatie configuratie voor secret
const rotationSchedule = new aws.secretsmanager.SecretRotation("database-secret-rotation", {
secretId: databaseSecret.id,
rotationLambdaArn: rotationLambda.arn,
rotationRules: {
automaticallyAfterDays: 30, // Rotatie elke 30 dagen
duration: "2h", // Timeout voor rotatie
scheduleExpression: "rate(30 days)"
}
});
```
## Externe Secrets Managers Integratie
```typescript
// HashiCorp Vault integratie (via AWS Secrets Manager)
const vaultSecret = new aws.secretsmanager.Secret("vault-token", {
name: "external/vault/token",
description: "Vault token voor externe secrets management"
});
// Parameter Store voor configuratiegegevens
const appConfigParams = [
{ name: "/app/database/host", value: "db.production.internal", type: "String" },
{ name: "/app/database/port", value: "3306", type: "String" },
{ name: "/app/encryption/key", value: "enc-key-123", type: "SecureString" }
];
appConfigParams.forEach((param, index) => {
new aws.ssm.Parameter(`app-config-param-${index}`, {
name: param.name,
value: param.value,
type: param.type,
tier: "Standard"
});
});
```
## Beveiligde Opslag en Encryptie
```typescript
// KMS Key voor encryptie van secrets
const secretsKmsKey = new aws.kms.Key("secrets-encryption-key", {
description: "KMS key voor encryptie van secrets",
deletionWindowInDays: 7,
enableKeyRotation: true,
policy: JSON.stringify({
Version: "2012-10-17",
Statement: [
{
Sid: "Enable IAM User Permissions",
Effect: "Allow",
Principal: {
AWS: "arn:aws:iam::${aws.getCallerIdentity().then(id => id.accountId)}:root"
},
Action: "kms:*",
Resource: "*"
}
]
})
});
// S3 Bucket voor gevoelige configuratiebestanden
const configBucket = new aws.s3.Bucket("app-config-bucket", {
bucket: "my-app-sensitive-config",
serverSideEncryptionConfiguration: {
rule: {
applyServerSideEncryptionByDefault: {
sseAlgorithm: "aws:kms",
kmsMasterKeyId: secretsKmsKey.id
}
}
},
versioning: {
enabled: true
},
logging: {
targetBucket: bucket.id,
targetPrefix: "config-bucket-logs/"
}
});
// Bucket Policy voor beperkte toegang
const configBucketPolicy = new aws.s3.BucketPolicy("config-bucket-policy", {
bucket: configBucket.id,
policy: configBucket.bucket.apply(bucketName =>
JSON.stringify({
Version: "2012-10-17",
Statement: [
{
Effect: "Deny",
Principal: "*",
Action: "s3:*",
Resource: [
`arn:aws:s3:::${bucketName}`,
`arn:aws:s3:::${bucketName}/*`
],
Condition: {
Bool: {
"aws:SecureTransport": false
}
}
}
]
})
)
});
```
## Monitoring en Compliance
```typescript
// CloudWatch Alarms voor secrets management
const secretRotationAlarm = new aws.cloudwatch.MetricAlarm("secret-rotation-failure", {
alarmDescription: "Alarm bij falende secrets rotatie",
metricName: "Errors",
namespace: "AWS/Lambda",
statistic: "Sum",
period: 300,
threshold: 1,
comparisonOperator: "GreaterThanThreshold",
evaluationPeriods: 1,
alarmActions: [], // Voeg SNS topic toe voor notificaties
dimensions: {
FunctionName: rotationLambda.name
}
});
// Config Rules voor compliance
const secretsManagerRule = new aws.cfg.Rule("secrets-manager-rotation-check", {
description: "Controleert of secrets rotatie zijn ingeschakeld",
source: {
owner: "AWS",
sourceIdentifier: "SECRETS_MANAGER_ROTATION_ENABLED_CHECK"
},
inputParameters: JSON.stringify({
"maxDaysSinceRotation": 90
})
});
```
## Best Practices en Aanbevelingen
### 1. **Principle of Least Privilege**
```typescript
// Minimalistische IAM policies voor services
const appRole = new aws.iam.Role("app-service-role", {
assumeRolePolicy: JSON.stringify({
Version: "2012-10-17",
Statement: [{
Action: "sts:AssumeRole",
Effect: "Allow",
Principal: {
Service: "ecs-tasks.amazonaws.com"
}
}]
})
});
// Alleen benodigde permissies
const appPolicy = new aws.iam.RolePolicy("app-secrets-access", {
role: appRole.id,
policy: pulumi.all([databaseSecret.arn]).apply(([secretArn]) =>
JSON.stringify({
Version: "2012-10-17",
Statement: [{
Effect: "Allow",
Action: [
"secretsmanager:GetSecretValue"
],
Resource: secretArn
}]
})
)
});
```
### 2. **Multi-Region Backup**
```typescript
// Secrets replicatie voor disaster recovery
const replicaRegions = ["eu-west-1", "eu-central-1"];
replicaRegions.forEach(region => {
new aws.secretsmanager.Secret(`database-secret-replica-${region}`, {
name: "prod/database/credentials",
replica: [{
region: region
}]
});
});
```
### 3. **Audit Logging**
```typescript
// CloudTrail voor audit logging
const trail = new aws.cloudtrail.Trail("secrets-audit-trail", {
name: "secrets-management-audit",
s3BucketName: bucket.id,
enableLogging: true,
includeGlobalServiceEvents: true,
isMultiRegionTrail: true,
eventSelectors: [{
readWriteType: "All",
includeManagementEvents: true,
dataResources: [{
type: "AWS::SecretsManager::Secret",
values: ["arn:aws:secretsmanager:*:*:secret:*"]
}]
}]
});
```
## Implementatie Stappen
1. **Start met kritieke secrets**: Begin met database credentials en API keys
2. **Implementeer gefaseerd**: Rol eerst rotatie uit voor niet-kritieke systemen
3. **Monitor intensief**: Houd rotatie success/failure rates bij
4. **Test recovery procedures**: Zorg dat je secrets kunt herstellen bij falen
5. **Documenteer processen**: Houd rotatieschema's en procedures bij
Deze architectuur biedt een robuuste basis voor secrets management met automatische rotatie, encryptie in rust en transit, en uitgebreide monitoring voor compliance.