Protege recursos mediante las claves de Cloud KMS

De forma predeterminada, Compute Engine encripta el contenido en reposo del cliente. Compute Engine controla y administra esta encriptación sin que debas realizar ninguna acción adicional. Sin embargo, si deseas controlar y administrar esta encriptación, puedes usar las claves de encriptación de claves. Las claves de encriptación de claves no encriptan tus datos de forma directa, sino que se usan para encriptar las claves de encriptación de datos que encriptan tus datos.

Tienes las siguientes dos opciones para las claves de encriptación de claves en Compute Engine:

Después de crear un recurso de Compute Engine que Cloud KMS ayuda a proteger, no necesitas especificar la clave porque Compute Engine sabe qué clave de KMS se usó. Esto difiere de la forma en que Compute Engine accede a los recursos que las claves proporcionadas por el cliente ayudan a proteger. Para ese acceso, debes especificar la clave proporcionada por el cliente.

Obtén más información sobre las opciones de encriptación en Google Cloud.

Antes de comenzar

  1. Obtén información sobre discos, imágenes, instantáneas de discos persistentese instancias de máquina virtual (VM).

  2. Decide si ejecutarás Compute Engine y Cloud KMS en el mismo proyecto de Google Cloud o en proyectos distintos.

    Para obtener información sobre los ID de proyectos de Cloud y los números de proyectos, consulta Identifica proyectos.

  3. En el proyecto de Cloud que ejecuta Compute Engine, configura el acceso a la API para Compute Engine.

  4. En el proyecto de Cloud que ejecuta Cloud KMS, haz lo siguiente:

    1. Habilita la API de Cloud KMS.
    2. Crea un llavero de claves y una clave como se describe en Crea claves simétricas.
  5. Asigna la función de encriptador/desencriptador de CryptoKey de Cloud KMS al agente de servicios de Compute Engine. Esta cuenta tiene el siguiente formato:

    service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
    

    Puedes usar la herramienta de línea de comandos de gcloud para asignar la función:

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
        --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    Reemplaza lo siguiente:

    • KMS_PROJECT_ID: es el ID del proyecto de Cloud que ejecuta Cloud KMS (incluso si es el mismo proyecto que ejecuta Compute Engine).
    • PROJECT_NUMBER: es el número del proyecto de Cloud (que no es el ID del proyecto de Cloud) que ejecuta los recursos de Compute Engine.

Limitaciones

  • Los recursos regionales (discos) se pueden encriptar mediante claves en la misma ubicación o en global. Por ejemplo, un disco en la zona us-west1-a se puede encriptar mediante una clave en us-west1 o global. Los recursos globales (imágenes, instantáneas) se pueden encriptar mediante claves en cualquier ubicación.

  • La encriptación de un disco, una instantánea o una imagen con una clave es permanente. No puedes quitar la encriptación del recurso ni cambiar la clave que se usa. La única forma de quitar la encriptación o cambiar las claves es crear una copia del recurso mientras se especifica una opción de encriptación nueva.

Especificaciones

En esta sección, se describe la especificación de encriptación y las limitaciones de uso de las claves de Cloud KMS.

Encriptación

Las claves de Cloud KMS que se usan para ayudar a proteger tus datos en Compute Engine son claves AES-256. Estas son claves de encriptación de claves y se usan para encriptar las claves de encriptación de datos que encriptan tus datos.

Restricciones

  • Solo puedes encriptar imágenes, instantáneas y discos persistentes nuevos con tu propia clave. No puedes usarla para encriptar los recursos existentes.

  • No puedes usar tus propias claves con SSD locales, dado que los SSD locales no persisten una vez finalizada la vida útil de una máquina virtual. Los SSD locales reciben protección a través de una clave de encriptación efímera que Google no conserva.

Encripta un disco persistente nuevo con CMEK

Puedes proporcionar una clave durante la creación de la VM o el disco para encriptar un disco persistente nuevo.

Console

  1. En Google Cloud Console, ve a la página Discos.

    Ir a Discos

  2. Haz clic en Crear disco y, luego, ingresa las propiedades del disco nuevo.
  3. En Encriptación, selecciona Clave administrada por el cliente.
  4. En el menú desplegable, selecciona la clave de Cloud KMS que deseas usar para encriptar este disco.
  5. Para crear el disco, haz clic en Crear.

gcloud

gcloud compute disks \
create encrypted-disk \
    --kms-key projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY

Reemplaza lo siguiente:

  • REGION: Es la región en la que se encuentra el disco.
  • KEY_RING: es el nombre del llavero de claves que incluye la clave.
  • KEY: es el nombre de la clave que se usa para encriptar el disco.

API

Para encriptar un disco, usa la propiedad diskEncryptionKey con kmsKeyName. Por ejemplo, puedes encriptar un disco nuevo durante la creación de la VM con tu clave de Cloud KMS mediante el siguiente procedimiento:

POST
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
"machineType": "zones/ZONE/machineTypes/e2-standard-2",
"disks": [
 {
  "type": "PERSISTENT",
  "diskEncryptionKey": {
    "kmsKeyName": "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY"
  },
  "initializeParams": {
   "sourceImage": "projects/debian-cloud/global/images/debian-8-jessie-v20160301"
  },
  "boot": true
 }
],
...
}

Reemplaza lo siguiente:

  • PROJECT_ID: es el ID del proyecto de Cloud que ejecuta Compute Engine.
  • ZONE: Es la zona en la que se creará la VM.
  • REGION: Es la región en la que se encuentra el disco.
  • KEY_RING: es el nombre del llavero de claves que incluye la clave.
  • KEY: es el nombre de la clave que se usa para encriptar el disco.

Del mismo modo, también puedes usar la API para crear un nuevo disco persistente independiente y encriptarlo con tu clave de Cloud KMS:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2Fprojects%2Fdebian-cloud%2Fglobal%2Fimages%2Fdebian-8-jessie-v20160301

{
 "name": "new-encrypted-disk-key",
 "diskEncryptionKey": {
   "kmsKeyName": "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY"
  },
 "type": "zones/ZONE/diskTypes/pd-standard"
}

Crea una instantánea desde un disco encriptado con CMEK

Para ayudar a proteger una instantánea que creas desde un disco encriptado con CMEK, debes usar la misma clave de encriptación que usaste para encriptar el disco.

Las instantáneas de los discos encriptados con CMEK son incrementales.

Console

  1. En Google Cloud Console, ve a la página Instantáneas.

    Ir a Instantáneas

  2. Haz clic en Crear instantánea.
  3. En Disco de origen, elige el disco de origen para la instantánea. La instantánea se encripta de forma automática con la misma clave que usa el disco de origen.

gcloud

gcloud compute \
disks snapshot encrypted-disk \
    --zone ZONE

Reemplaza ZONE por la zona en la que se creará la instantánea.

API

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/example-disk/createSnapshot

{
 "snapshotEncryptionKey":  {
   "kmsKeyName": "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/SNAPSHOT_KEY"
 },
 "name": "snapshot-encrypted-disk"
}

Reemplaza SNAPSHOT_KEY por el nombre de la clave que se usa para encriptar el disco de origen.

No se puede crear una instantánea que use CMEK, a menos que el disco de origen también use CMEK. Además, no se pueden convertir discos ni instantáneas encriptados para usar la encriptación predeterminada de Compute Engine, a menos que crees una imagen de disco completamente nueva y un disco persistente nuevo.

Encripta una imagen importada con CMEK

Puedes encriptar una imagen nueva si importas una imagen personalizada a Compute Engine. Antes de importar una imagen, debes crear y comprimir un archivo de imagen de disco y subir ese archivo comprimido a Cloud Storage.

Console

  1. En Google Cloud Console, ve a la página Imágenes.

    Ir a Imágenes

  2. Haga clic en Crear imagen.
  3. En Disco de origen, selecciona el disco del que deseas crear una imagen.
  4. En Encriptación, selecciona Clave administrada por el cliente.
  5. En el menú desplegable, selecciona la clave de Cloud KMS que deseas usar para encriptar esta imagen.
  6. Continúa con el proceso de creación de imágenes.

gcloud

gcloud compute \
images create [...] \
    --kms-key projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY

API

Si deseas encriptar una imagen importada, especifica el URI del archivo comprimido, agrega la propiedad imageEncryptionKey a la solicitud de creación de la imagen y especifica la clave a fin de encriptar la imagen en la propiedad kmsKeyName, como se muestra a continuación:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images

{
"rawDisk": {
 "source": "http://storage.googleapis.com/example-image/example-image.tar.gz"
},
"name": "new-encrypted-image",
"sourceType": "RAW",
"imageEncryptionKey": {
  "kmsKeyName": "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/IMAGE_KEY"
  }
}

Reemplaza IMAGE_KEY por el nombre de la clave que deseas usar para encriptar la imagen.

Crea un disco persistente desde un recurso encriptado con CMEK

Crea un disco desde una instantánea encriptada con CMEK

Para crear un nuevo disco persistente independiente con una instantánea encriptada, haz lo siguiente:

Console

  1. En Google Cloud Console, ve a la página Discos.

    Ir a Discos

  2. Haz clic en Crear disco y, luego, ingresa las propiedades del disco nuevo.
  3. En Tipo de fuente, selecciona la instantánea o imagen deseada.
  4. Continua con el proceso de creación del disco persistente.

gcloud

gcloud compute \
disks create [...] \
    --source-snapshot example-snapshot \
    --kms-key projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY

Para usar una imagen en lugar de una instantánea, reemplaza --source-snapshot example-snapshot por --image example-image.

API

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks

{
"name": "disk-from-encrypted-snapshot",
"sourceSnapshot": "global/snapshots/encrypted-snapshot"
}

Conecta un disco de arranque encriptado con CMEK a una VM nueva

Console

  1. En Google Cloud Console, ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. Especifica los detalles de la VM y, en la sección Disco de arranque, haz clic en Cambiar. A continuación, sigue estos pasos:

    1. Haz clic en Discos existentes.
    2. En la lista Disco, selecciona un disco existente para conectar a la VM.
    3. Haga clic en Seleccionar.
  3. Continúa con el proceso de creación de VM.

gcloud

gcloud compute instances \
create example-instance \
    --disk name=encrypted-disk,boot=yes

API

"disks": [
{
  "deviceName": "encrypted-disk",
  "source": "projects/PROJECT_ID/zones/ZONE/disks/encrypted-disk"
  }
 }
]

Quita la clave de encriptación de Cloud KMS de un disco persistente

Puedes desencriptar el contenido de un disco encriptado y crear un disco nuevo que use la encriptación predeterminada de Compute Engine. De forma predeterminada, Compute Engine encripta todos los datos en reposo.

  1. Crea una instantánea del disco de arranque.
  2. Usa la imagen nueva para crear un disco persistente nuevo.

Después de crear el disco persistente nuevo, este usa la encriptación predeterminada de Compute Engine para ayudar a proteger el contenido del disco. Las instantáneas que creas desde ese disco también deben usar la encriptación predeterminada.

Rota la clave de encriptación de Cloud KMS para un disco persistente

Rota la clave que se usa para encriptar el disco mediante la creación de un disco nuevo que use una versión de clave de Cloud KMS nueva. La rotación de las claves es una práctica recomendada para cumplir con las prácticas de seguridad estandarizadas. Para rotar tus claves, haz lo siguiente:

  1. Rota la clave de Cloud KMS.
  2. Crea una instantánea del disco de arranque.
  3. Usa la instantánea nueva para crear un disco persistente nuevo con la clave rotada en el paso anterior.

Cuando creas el disco persistente nuevo, este usa la versión de clave nueva para la encriptación. Las instantáneas que creas desde ese disco también usan la misma versión de clave.

Cuando rotas una clave, los datos que se encriptaron con versiones de claves anteriores no se vuelven a encriptar de forma automática. Para obtener más información, consulta Vuelve a encriptar datos. La rotación de una clave no inhabilita ni destruye de forma automática una versión de clave existente.

Impacto de la inhabilitación o eliminación de CMEK

Inhabilitar o borrar una clave de encriptación tiene los siguientes efectos en los siguientes recursos que la clave ayuda a proteger:

  • Las VM con discos adjuntos no se pueden iniciar. Si habilitaste el cierre de VM en la revocación de claves, se cierran las VM con discos adjuntos que la clave ayuda a proteger.
  • Los discos no se pueden adjuntar a las VM, ni se pueden crear instantáneas para ellos.
  • Las instantáneas no se pueden usar para crear un disco.
  • Las imágenes no se pueden usar para crear un disco.

Si inhabilitas la clave, puedes revertir los efectos anteriores si la habilitas. Si borras la clave, no podrás revertir los efectos anteriores.

Configura el cierre de VM en la revocación de claves de Cloud KMS

Puedes configurar la VM para que se cierre de forma automática cuando revoques la clave de Cloud KMS que ayuda a proteger un disco persistente conectado a la VM. Puedes revocar una clave mediante su inhabilitación o eliminación. Con esta configuración habilitada, la VM se cierra dentro de las 3 horas de revocación de claves.

Si vuelves a habilitar la clave, puedes reiniciar la VM con el disco adjunto que la clave ayuda a proteger. La VM no se reinicia de forma automática después de habilitar la clave.

Puedes configurar una VM para que se cierre en la revocación de claves cuando crees la VM con la herramienta de gcloud o la API de Compute Engine.

gcloud

Usa el comando gcloud beta compute instances create para crear una VM y establece el campo --post-key-revocation-action-type=shutdown.

gcloud beta compute instances create VM_NAME
    --image IMAGE
    --post-key-revocation-action-type=shutdown

API

Usa el método instances.insert para crear una VM y configura el campo "postKeyRevocationActionType": "SHUTDOWN". En el siguiente ejemplo, se crea la VM a partir de una imagen pública.

 POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances

{ "machineType": "zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE", "name": "VM_NAME", "disks": [ { "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot": true } ], "postKeyRevocationActionType": "SHUTDOWN" }

De forma alternativa, puedes configurar una plantilla de instancias para crear VM que se cierren en la revocación de claves mediante la herramienta de gcloud o la API de Compute Engine.

gcloud

Crea una plantilla de instancias con el comando instance-templates create y establece el campo --post-key-revocation-action-type=shutdown.

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --post-key-revocation-action-type=shutdown

API

Para crear una plantilla de instancias, usa el método instanceTemplates().insert . En la API de la plantilla de instancias, debes definir de forma explícita todos los campos de configuración obligatorios. Si deseas que las VM creadas a partir de esta plantilla se cierren en la revocación de claves, especifica "postKeyRevocationActionType": "SHUTDOWN". Por ejemplo, una plantilla de instancias con la cantidad mínima de campos obligatorios para crear VM que se cierran con la revocación de claves se ve de la siguiente manera:

  {
  "name": "example-template",
  "properties": {
    "machineType": "e2-standard-4",
    "networkInterfaces": [
      {
        "network": "global/networks/default",
        "accessConfigs":
        [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ]
      }
    ],
    "disks":
    [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams":
        {
          "sourceImage": "projects/debian-cloud/global/images/family/debian-9"
        }
      }
    ],
    "postKeyRevocationActionType": "SHUTDOWN"
    }
  }
  

Después de crear una VM que esté configurada para cerrarse en la revocación de Cloud KMS, crea y adjunta un disco persistente encriptado con una clave de Cloud KMS.