Cómo encriptar una instancia AWS RDS

Después de instalar y configurar SecurityHub uno de sus controles nos dice lo siguiente:

RDS.3 RDS DB instances should have encryption at-rest enabled

https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#rds-3-remediation

¿Hemos configurado previamente nuestra RDS con encriptación automática? Vamos a ver

Evidentemente, no lo hemos hecho!

Para poder contentar a SecurityHub y mejorar nuestra puntuación no nos queda otra que encriptar la base de datos. Vamos a ello.

PS: esta guía no se está pensada para TODOS los casos, obviamente.

Requisitos previos

  • Crear una llave KMS en la misma región que la instancias RDS
  • Comprobar si el tipo de instancia RDS soporta encriptación

Crear la llave KSM usando Terraform

resource "aws_kms_key" "kms_rds" {
  description             = "kms for rds in ireland"
  deletion_window_in_days = 10

  tags = {
    Terraform       = "${var.general.["tf"]}"
    Environment     = "${var.general.["env"]}"
    Project         = "${var.general.["Project"]}"
  }
}

Paso 1. Crear un snapshot

Lo primero será crear un snapshot. Vamos a la consola de RDS y seleccionamos la opción. Dependiendo del tamaño de nuestra RDS tardará más o menos.

Si vamos a la sección de Snapshots en RDS, veremos el % que queda para completar el mismo.

Paso 2. Crear una copia del snapshot habilitando la encriptación

Una vez el estado del snapshot sea “Complete“, ya podemos crear una copia de nuestro snapshot.

Configuramos el nuevo snapshot para que use la llave KMS previamente creada.

Ahora tenemos que esperar a que la copia del snapshot acabe para poder usar nuestro nuevo snapshot, esta vez ya sí, encriptado.

Paso 3. Crear una nueva instancia usando el snapshot encriptado

Vale ahora, vamos a generar una nueva instancia RDS con Terraform y usando el snapshot encriptado que hemos acabado de crear. La configuración sería algo así.

Ojo, no vamos a reemplazar la vieja, sino que vamos a crear una nueva. Para ello hacemos uso del módulo de RDS y creamos en Terraform una nueva instancia usando el snapshot identifier.

module "rds" {
  source  = "../../modules/rds"


  engine                    = "${var.rds_engine}"
  engine_version            = "${var.rds_engine_version}"
  instance_class            = "${var.rds_instance_class}"
  allocated_storage         = "${var.rds_allocated_storage}"
  snapshot_identifier       = "my-awesome-new-snapshot-after-encryption"
  storage_encrypted         = true
  ...
  ...
  ...
  parameters = [
   ...
  ]

  tags = {
    Terraform       = "${var.general.["tf"]}"
    Environment     = "${var.general.["env"]}"
    Project         = "${var.general.["Project"]}"
  }
}

Esto se puede hacer por consola sin problema. Yo lo hago así para luego no tener que importar el recurso de nuevo a Terraform.

Y cuando cambie el endpoint de conexión en la aplicación, lo siguiente será borrar la vieja RDS.

module.rds-encrypted.module.db_instance.aws_db_instance.this: Creation complete after 12m14s (ID: someid)

Links

Leave a Reply

Your email address will not be published. Required fields are marked *