VOOR ELKE CLOUD · SECRETS EN KMS

Migratie van secrets, encryptie en KMS naar STACKIT

Sleutels en secrets verhuizen niet naar STACKIT, ze worden opnieuw aangemaakt. Sleutelmateriaal dat in een cloud-KMS is gegenereerd, kan niet worden geëxporteerd. Daarom wordt elke dataset die door de sleutel wordt beschermd, opnieuw versleuteld met een nieuwe STACKIT KMS-sleutel en worden secretwaarden opnieuw in STACKIT Secrets Manager geschreven. Rotatiejobs, aliassen en SSE-KMS op buckets hebben geen één-op-één-tegenhanger. Deze gids volgt een AWS-omgeving door een StackToIT-run en laat zien wat het concept overneemt, wat het aan u overlaat en in welke volgorde u werkt.

De migratie, in volgorde

  1. 1. Sleutels, secrets en hun consumers inventariseren

    Som elke sleutel op met de resources die hem gebruiken (databases, buckets, secrets), en elk secret met de applicaties die het lezen. De run leest de verbanden uit de Terraform, dus de consumers van een sleutel zijn zichtbaar voordat er iets is gebouwd.

  2. 2. De keyring en de sleutel aanmaken

    STACKIT KMS groepeert sleutels in keyrings. Een symmetrische sleutel gebruikt AES-256-GCM; er bestaan ook asymmetrische sleutels en sleutels voor ondertekenen en MAC. Op dit moment is alleen softwarebescherming beschikbaar, en het beschermingsniveau is een variabele die het concept aan u overlaat.

  3. 3. Bepalen wie bij de sleutel kan

    Het toegangsbereik van de sleutel is PUBLIC of SNA. De bronsleutel noemt geen netwerk, dus de run laat de variabele zonder standaardwaarde; als u niets instelt, maakt de STACKIT API de sleutel openbaar.

  4. 4. De data opnieuw versleutelen

    Data die met de oude sleutel is beschermd, wordt in de nieuwe dienst geladen en daar versleuteld. Voor PostgreSQL Flex koppelt het concept de instance aan de nieuwe sleutel; de dienst accepteert die instelling alleen voor geactiveerde accounts, dus vraag toegang aan vóór de apply.

  5. 5. De secrets opnieuw aanmaken

    Het concept maakt één Secrets Manager-instance en een gebruiker met schrijfrechten; de waarden zelf worden door een API-stap geschreven uit een document dat u aanlevert. Verwijder daarna de schrijvergebruiker.

  6. 6. De instance zo nodig met een sleutel versleutelen

    Secrets Manager kan de waarden van een instance met een KMS-sleutel versleutelen, ingesteld via de API (de portal kan dat nog niet configureren), met een serviceaccount dat minstens de rol Secrets Manager Reader heeft (docs). De run legt vast dat het één sleutel is voor alle secretwaarden van de instance, niet één per secret.

  7. 7. Rotatie vervangen

    Geen van beide diensten roteert voor u: KMS maakt een nieuwe sleutelversie aan wanneer u Rotate key activeert, wat de documentatie beschrijft als een bestelling tegen betaling, en Secrets Manager kent geen automatische rotatie. De taak die de rotatiefunctie van de bron deed, wordt uw taak, en de run meldt dat.

  8. 8. De applicaties omschakelen

    Applicaties stappen over van de cloud-SDK naar een Vault-compatibele client of ontvangen secrets via het platform, bijvoorbeeld External Secrets Operator op SKE. Zoek secrets op via hun nieuwe pad.

Een sleutel en een secret, omgezet

Een omgeving voor deze pagina, op 4 november 2026 beoordeeld door StackToIT. Links: een KMS-sleutel met een alias, een secret met een waarde en een rotatieregel, en een parameter. Rechts: de STACKIT-blokken van security.tf (reviewopmerkingen weggelaten). De alias, de rotatieregel en de secretwaarde hebben geen blok; het concept noemt de reden in de reviewopmerkingen.

Voorbeeldinvoermain.tf
resource "aws_kms_key" "data" {
  description             = "data encryption key"
  enable_key_rotation     = true
  deletion_window_in_days = 30
}

resource "aws_kms_alias" "data" {
  name          = "alias/data"
  target_key_id = aws_kms_key.data.key_id
}

resource "aws_secretsmanager_secret" "db" {
  name       = "prod/orders/db"
  kms_key_id = aws_kms_key.data.arn
}

resource "aws_secretsmanager_secret_version" "db" {
  secret_id     = aws_secretsmanager_secret.db.id
  secret_string = jsonencode({ username = "orders", password = var.db_password })
}

resource "aws_secretsmanager_secret_rotation" "db" {
  secret_id           = aws_secretsmanager_secret.db.id
  rotation_lambda_arn = "arn:aws:lambda:eu-central-1:111122223333:function:rotate-db"

  rotation_rules {
    automatically_after_days = 30
  }
}

resource "aws_ssm_parameter" "feature_flags" {
  name  = "/prod/orders/feature-flags"
  type  = "SecureString"
  value = "checkout_v2=on"
}
STACKIT-Terraform van StackToITterraform/security.tf
resource "stackit_kms_keyring" "migrated" {
  project_id   = var.project_id
  display_name = "migrated-keys"
}

resource "stackit_kms_key" "data" {
  project_id   = var.project_id
  keyring_id   = stackit_kms_keyring.migrated.keyring_id
  display_name = "data-encryption-key"
  algorithm    = "aes_256_gcm"
  purpose      = "symmetric_encrypt_decrypt"
  protection   = var.kms_protection
  access_scope = var.kms_access_scope == "SNA" ? "SNA" : null
}

resource "stackit_secretsmanager_instance" "migrated_secrets" {
  project_id = var.project_id
  name       = "migrated-secrets"
}

resource "stackit_secretsmanager_user" "migration" {
  project_id    = var.project_id
  instance_id   = stackit_secretsmanager_instance.migrated_secrets.instance_id
  description   = "StackToIT migration user: writes the migrated secrets; delete it afterwards"
  write_enabled = true
}
  • Een sleutel, geen kopie

    De AWS-sleutel wordt een keyring en een AES-256-GCM-sleutel. Het concept merkt op dat AWS-sleutelmateriaal niet kan worden geëxporteerd, dus data die met de oude sleutel is versleuteld, wordt tijdens de migratie opnieuw versleuteld.

  • Rotatie en alias worden niet overgenomen

    stackit_kms_key heeft in de vastgezette provider geen rotatieattribuut en geen alias. De sleutel roteert nooit uit zichzelf, en clients die de sleutel via een alias benaderden, moeten de nieuwe sleutel-ID gebruiken.

  • Eén instance bevat de secrets

    Het secret en de parameter komen in één Secrets Manager-instance. De customer key van het secret is niet op de instance ingesteld, omdat de parameter in dezelfde instance geen sleutel noemt; u stelt die in zodra de sleutels van de bronnen zijn bepaald.

  • De schrijver is een tijdelijke gebruiker

    De migratiegebruiker heeft schrijftoegang tot de secrets engine van de hele instance. De eigen beschrijving van het concept zegt dat u die moet verwijderen nadat de secrets zijn geschreven.

Wat wordt gekoppeld en wat aan u wordt overgelaten

BronSTACKIT-doelKlasse en wat niet wordt overgenomen
KMS-sleutel met rotatie aanKMS-keyring en -sleutelRECONFIGURE: sleutelmateriaal kan niet worden geëxporteerd; rotatie wordt niet overgenomen, een rotatie wordt een operationeel proces (de sleutelversie wordt in elke decrypt-aanroep genoemd).
KMS-aliasGeen alias op de sleutelNiet overgenomen: clients moeten de nieuwe sleutel-ID gebruiken.
Secret met waarde en rotatiefunctieSecrets Manager-instance, waarde geschreven door een API-stapRECONFIGURE: de waarde komt uit een document dat u aanlevert; de rotatiefunctie wordt niet overgenomen en Secrets Manager roteert zelf niets.
SecureString-parameterSecrets ManagerRECONFIGURE: een naam met een slash vooraan wordt een pad zonder slash, dus opzoeken op naam is een beslissing.
Database versleuteld met een customer keyPostgreSQL Flex met een encryptieblokREPLATFORM: geladen in de nieuwe instance en versleuteld met de nieuwe sleutel; alleen beschikbaar voor geactiveerde accounts.
Bucket met SSE-KMSObject StorageREDESIGN, zekerheidsniveau LOW: geen versleuteling op basis van KMS; accepteer platformversleuteling of lever per aanvraag uw eigen sleutels.

Klassen zoals de run ze heeft bepaald. De sleutelversie maakt deel uit van een STACKIT decrypt-aanroep, waar de bronservice er geen nodig heeft.

De bucket die geen KMS-modus heeft

Uit dezelfde run. Een bucket die met een customer key is versleuteld, is de enige eenheid die de run naar redesign stuurt. Links: hoe assessment.json hem vastlegt, samen met de sleuteleenheid (id, klasse, zekerheidsniveau en doel; de bevinding staat hieronder samengevat). Rechts: het bucketblok dat het concept schrijft, zonder enige sleutel.

StackToIT-assessmentassessment.json
{
  "id": "aws_s3_bucket.exports",
  "class": "REDESIGN",
  "confidence": "LOW",
  "target": {
    "service": "STACKIT Object Storage"
  }
}
{
  "id": "aws_kms_key.data",
  "class": "RECONFIGURE",
  "confidence": "MEDIUM",
  "target": {
    "service": "STACKIT KMS"
  }
}
STACKIT-Terraform van StackToITterraform/storage.tf
resource "stackit_objectstorage_bucket" "exports" {
  project_id = var.project_id
  name       = "acme-orders-exports"
}
  • Wat de run vond

    De run legt vast dat STACKIT Object Storage maar twee versleutelingsmodi documenteert, AES-256 at rest en SSE-C. Een test op een STACKIT-project in eu01 op 2026-10-16 zag de put-encryption-aanroep met 501 antwoorden voor aws:kms en een object-put met aws:kms met 400, dus dat een bewerking wordt genoemd betekent niet dat de modus wordt ondersteund.

  • Twee opties

    Accepteer platformversleuteling at rest, of laat clients bij elke aanvraag SSE-C-sleutels meegeven. Dat laatste is een redesign van de versleuteling en van elke client die schrijft.

  • De sleutel blijft elders

    Het concept legt geen verband tussen de bucket en de nieuwe sleutel. Bepaal vóór de cutover, niet erna, of de exports gevoelig genoeg zijn om SSE-C te rechtvaardigen.

De database gekoppeld aan de nieuwe sleutel

De PostgreSQL-instance van dezelfde run. Links: de AWS-database met zijn customer key. Rechts: het instanceblok dat het concept schrijft, met een encryptieobject dat naar de nieuwe sleutel, sleutelversie en het serviceaccount wijst.

Voorbeeldinvoermain.tf
resource "aws_s3_bucket_server_side_encryption_configuration" "exports" {
  bucket = aws_s3_bucket.exports.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm     = "aws:kms"
      kms_master_key_id = aws_kms_key.data.arn
    }
  }
}

resource "aws_db_instance" "orders" {
  identifier          = "orders-db"
  engine              = "postgres"
  engine_version      = "15.7"
  instance_class      = "db.m5.large"
  allocated_storage   = 100
  username            = "orders"
  password            = var.db_password
  storage_encrypted   = true
  kms_key_id          = aws_kms_key.data.arn
  skip_final_snapshot = true
}
STACKIT-Terraform van StackToITterraform/data.tf
resource "stackit_postgresflex_instance" "orders" {
  project_id = var.project_id
  name       = "orders-db"
  version    = "15"
  flavor_id  = "2.16"
  storage = {
    class = var.postgresflex_storage_class
    size  = 108
  }
  backup_schedule = "0 2 * * *"
  network = {
    acl          = var.orders_allowed_cidrs
    access_scope = var.orders_access_scope == "SNA" ? "SNA" : null
  }
  encryption = {
    kek_key_id      = stackit_kms_key.data.key_id
    kek_key_version = tostring(var.data_key_version)
    kek_keyring_id  = stackit_kms_keyring.migrated.keyring_id
    service_account = var.data_service_account
  }
  retention_days = 32
}
  • Variabelen voor de identiteit

    De sleutelversie en het serviceaccount dat de KMS-bewerkingen uitvoert, zijn variabelen die u instelt. De run noemt wat het object nodig heeft, niet welk account u gebruikt.

  • Eerst toegang, daarna apply

    De dienst accepteert dit object alleen voor geactiveerde accounts en wijst de aanvraag anders af. De run meldt het als waarschuwing bij de eenheid.

  • Data verhuist via dump of replicatie

    De nieuwe instance is leeg en vanaf het begin versleuteld; het dataplaybook behandelt hoe die wordt gevuld.

Beslissingen van de architect

  • Openbare sleutel of sleutel in een network area

    Het bereik van elke sleutel, per sleutel bepaald. Het concept kent geen standaardwaarde.

  • Eén sleutel of meerdere

    Secrets Manager accepteert één sleutel per instance. Als secrets verschillende sleutels gebruikten, bepaal dan welke een instance delen.

  • Rotatieproces

    Wie sleutels en secrets roteert, hoe vaak en met welke job. KMS-rotatie maakt op verzoek een nieuwe sleutelversie aan; een AppRole-secret-ID roteert u zonder onderbreking door een nieuwe te genereren, de workload daarop te laten wijzen, de login te controleren en de oude te verwijderen (docs).

  • Verwijdering van oude sleutels

    Een STACKIT-sleutel die u verwijdert, wordt na 30 dagen gewist. Bewaar de oude cloudsleutels tot geen back-up of snapshot ze meer nodig heeft; die regel is gangbare praktijk, geen bevinding van de run.

  • Bucketversleuteling

    Platformversleuteling of SSE-C, zoals hierboven.

Vragen over secrets en KMS

Kan ik mijn bestaande sleutel importeren in STACKIT KMS?

STACKIT KMS kan een extern aangemaakte sleutel importeren, gebonden aan een sleutelversie. De run meldt dat sleutelmateriaal dat in AWS KMS is gegenereerd niet kan worden geëxporteerd, dus plant hij een nieuwe sleutel en het opnieuw versleutelen van de data.

Roteert Secrets Manager secrets?

Nee. De run legt vast dat er geen automatische rotatie is, dus de logica van de rotatiefunctie van de bron moet worden herbouwd als job tegen de nieuwe opslag.

Is Secrets Manager compatibel met Vault-clients?

De run beschrijft het als een Vault-compatibele key-valuestore, en de STACKIT-provider documenteert het schrijven van secrets met de HashiCorp Vault-provider. Applicaties stappen over van de cloud-SDK naar een Vault-client.

Welke sleutel versleutelt de secrets?

Het concept stelt geen kms_key-blok in op deze instance, en de gelezen pagina's zeggen niet welke sleutel zonder blok geldt. Een KMS-sleutel stelt u in via de API; de portal kan dat nog niet configureren. Als u later de sleutelversie wijzigt, worden de al opgeslagen secrets automatisch opnieuw versleuteld.

Welke grenzen heeft een Secrets Manager-instance?

De documentatie noemt maximaal 100 gebruikers en 10.000 API-aanroepen per uur per instance, en geen vaste serviceplannen.

Bronnen

Uw volgende stap: STACKIT.

Vertel ons over uw omgeving, dan laten wij zien wat StackToIT daarvoor oplevert: doelarchitectuur, Terraform-artefacten en een gestructureerd migratieplan.

Laat uw gegevens achter, onze specialisten nemen contact met u op.

Liever zelf een e-mail sturen? connect@stacktoit.com

Wij gebruiken uw gegevens alleen om dit verzoek te beantwoorden en een mogelijke pilot te bespreken. Privacyverklaring