GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Cómo compartir una AMI entre 2 cuentas de AWS

No hay comentarios

Si tenemos una AMI que no está encriptada podremos compartirla con otra cuenta de forma directa sin hacer nada especial. Pero si la AMI está cifrada, la cosa se complica, ya que la cuenta de destino no dispondrá de la clave de cifrado para poder descifrar sus snapshots y no podremos compartirla.

Por ello, si necesitamos compartir una AMI cifrada de una instancia EC2 de una cuenta a otra en AWS llevaremos a cabo el siguiente procedimiento:

1.- Crear una nueva clave gestionada por el cliente (Customer managed key) en el servicio AWS KMS siguiendo los siguientes pasos:

KMS-Customer-managed-key-creation-step-1

Paso 1

KMS-Customer-managed-key-creation-step-2

Paso 2

KMS-Customer-managed-key-creation-step-3

Paso 3

KMS-Customer-managed-key-creation-step-4

Paso 4

KMS-Customer-managed-key-creation-step-5

Paso 5

Si necesitamos añadir permisos especiales a la clave KMS, podremos editar directamente su código JSON. Por ejemplo, en el siguiente ejemplo añadimos permisos para usar la clave para encriptar y desencriptar con ella a un role IAM específico. En el ejemplo la cuenta aaaaaaaaaaaa es la origen y la bbbbbbbbbbbbb es la de destino:

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::aaaaaaaaaaaa:root",
                    "arn:aws:iam::bbbbbbbbbbbbb:role/bbbbbbbbbbbbb-admin"                    
                ]
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::aaaaaaaaaaaa:user/username_with_admin_privileges_from_aaaaaaaaaaaa_account"
                ]
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion",
                "kms:ReplicateKey",
                "kms:UpdatePrimaryRegion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::aaaaaaaaaaaa:root",
                    "arn:aws:iam::aaaaaaaaaaaa:role/aaaaaaaaaaaa-admin",
                    "arn:aws:iam::aaaaaaaaaaaa:user/username_with_admin_privileges_from_aaaaaaaaaaaa_account",
                    "arn:aws:iam::bbbbbbbbbbbb:root",
                    "arn:aws:iam::bbbbbbbbbbbb:role/bbbbbbbbbbbb-admin"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::aaaaaaaaaaaa:root",
                    "arn:aws:iam::aaaaaaaaaaaa:role/aaaaaaaaaaaa-admin",
                    "arn:aws:iam::aaaaaaaaaaaa:user/username_with_admin_privileges_from_aaaaaaaaaaaa_account",
                    "arn:aws:iam::bbbbbbbbbbbb:root",
                    "arn:aws:iam::bbbbbbbbbbbb:role/bbbbbbbbbbbb-admin"
                ]
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

2.- Hacer una copia de la AMI que queramos compartir con la otra cuenta de AWS, pero usando la nueva clave de cifrado creada en el punto anterior. Para ello iremos a la sección AMI’s del servicio EC2 de Amazon, seleccionaremos la AMI que queramos y con el botón derecho seleccionaremos la opción «Copiar AMI». Como se puede ver en la captura siguiente, seleccionaremos la clave KMS multi-account-shared-aws-key que acabamos de crear:
Copy-AMI-using-customer-managed-key-for-encryption

3.- Una vez copiada, modificaremos los permisos de la nueva AMI para añadir el identificador de la cuenta con la que queremos compartirla (botón Add account ID):

Edit-AMI-permissions-to-add-shared-account

4.- Tras esto, si accedemos a la consola de la cuenta de destino, ya podremos ver la AMI compartida en el listado de AMI’s. Pero es importante seleccionar las imágenes privadas, ya que si no no se mostrará al sólo mostrarse por defecto las imágenes de las cuales somos propietarios. Pero en este caso el propietario es la cuenta origen.

Shared-AMI-from-destination-account

 

5.- Por último, si queremos conservar una copia de la AMI en la cuenta de destino cifrada con sus propias claves y que en el propietario aparezca el ID de dicha cuenta de destino, realizaremos una copia de la misma igual que hicimos en el punto 2, pero esta vez seleccionando la clave de cifrado por defecto de la cuenta de destino o alguna otra que hayamos creado.

 

Sobre el autor

Daniel López Azaña
Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

DanielCómo compartir una AMI entre 2 cuentas de AWS

Deja una respuesta

Tu dirección de correo electrónico no será publicada.