Ejemplo 4: Propietario de bucket que concede permisos entre cuentas para objetos que no le pertenecen - Amazon Simple Storage Service

Ejemplo 4: Propietario de bucket que concede permisos entre cuentas para objetos que no le pertenecen

En este ejemplo de escenario, usted posee un bucket y ha permitido que otras Cuentas de AWS carguen objetos. Si ha aplicado la configuración de propietario del bucket obligatorio de S3 Object Ownership para el bucket, será propietario de todos los objetos del bucket, incluidos los objetos escritos por otra Cuenta de AWS. Este enfoque resuelve el problema de que los objetos no le pertenecen, el propietario del bucket. A continuación, puede delegar permisos a los usuarios de su propia cuenta o a otras Cuentas de AWS. Supongamos que la configuración de propietario del bucket obligatorio de S3 Object Ownership no está habilitada. Es decir, el bucket puede tener objetos que pertenecen a otras Cuentas de AWS.

Suponga que como propietario del bucket debe conceder permiso entre cuentas para ciertos objetos, independientemente de quién sea el propietario, a un usuario en otra cuenta. Por ejemplo, ese usuario podría ser una aplicación de facturación que necesita obtener acceso a los metadatos de los objetos. Hay dos cuestiones clave:

  • El propietario del bucket no tiene permisos sobre aquellos objetos creados por otras Cuentas de AWS. Para que el propietario del bucket conceda permisos para objetos que no le pertenecen, el propietario del objeto primero debe conceder permiso al propietario del bucket. El propietario del objeto es la Cuenta de AWS que creó los objetos. Luego, el propietario del bucket puede delegar esos permisos.

  • La cuenta propietaria del bucket delega permisos a usuarios en su propia cuenta (consulte Ejemplo 3: propietario del bucket que concede a sus usuarios permisos para objetos que no posee). Sin embargo, la cuenta del propietario del bucket no puede delegar permisos en otra Cuentas de AWS porque no se admite la delegación entre cuentas.

En este caso, el propietario del bucket puede crear un rol de AWS Identity and Access Management (IAM) con permiso para acceder a los objetos. A continuación, el propietario del bucket puede conceder permiso a otra Cuenta de AWS para asumir el rol, habilitarlo de manera temporal para acceder a los objetos en el bucket.

nota

S3 Object Ownership es una configuración de bucket de Amazon S3 que puede usar para controlar la propiedad de los objetos que se cargan en el bucket y para activar o desactivar las ACL. De forma predeterminada, la propiedad de objetos se establece en la configuración impuesta por el propietario del bucket. Además, todas las ACL están deshabilitadas. Cuando las ACL están deshabilitadas, el propietario del bucket posee todos los objetos del bucket y administra su acceso de forma exclusiva mediante políticas de administración de acceso.

La mayoría de los casos de uso modernos de Amazon S3 ya no requieren el uso de ACL. Le recomendamos desactivar las ACL, excepto en circunstancias inusuales en las que necesite controlar el acceso a cada objeto de manera individual. Si las ACL están desactivadas, puede usar políticas para controlar el acceso a todos los objetos del bucket, independientemente de quién haya subido los objetos al bucket. Para obtener más información, consulte Control de la propiedad de los objetos y desactivación de las ACL del bucket.

Descripción de permisos entre cuentas y uso de roles de IAM

Las funciones de IAM hacen posible diferentes situaciones en las que se delega acceso a los recursos y el acceso a otras cuentas es una de las situaciones clave. En este ejemplo, el propietario del bucket, la cuenta A, usa un rol de IAM para delegar de forma temporal el acceso a los objetos entre cuentas a usuarios de otra Cuenta de AWS, la cuenta C. Cada rol de IAM que crea trae adjuntas las siguientes dos políticas:

  • Una política de confianza que identifica a otra Cuenta de AWS para que pueda asumir el rol.

  • Una política de acceso que define qué permisos, por ejemplo, s3:GetObject, se conceden cuando alguien asume la función. Para ver una lista de permisos que puede especificar en una política, consulte Acciones de políticas para Amazon S3.

La Cuenta de AWS que se identifica en la política de confianza luego otorga permiso a su usuario para asumir el rol. El usuario puede luego realizar lo siguiente para obtener acceso a los objetos:

  • Asumir la función y, como respuesta, obtener las credenciales de seguridad temporales

  • Con las credenciales de seguridad temporales, obtener acceso a los objetos en el bucket

Para obtener más información acerca de los roles de IAM, consulte Roles de IAM en la guía del usuario de IAM.

A continuación, se muestra un resumen de los pasos del tutorial:

Permisos entre cuentas con roles de IAM.
  1. El usuario administrador de la cuenta A asocia una política de bucket por la cual concede un permiso condicional a la cuenta B para cargar objetos.

  2. El administrador de la cuenta A crea un rol de IAM, con la cual establece una relación de confianza con la cuenta C, de manera que los usuarios de esa cuenta puedan obtener acceso a la cuenta A. La política de acceso asociada con la función limita lo que el usuario de la cuenta C puede hacer cuando el usuario obtiene acceso a la cuenta A.

  3. El administrador de la cuenta B carga un objeto al bucket que pertenece a la cuenta A y concede un permiso de control absoluto al propietario del bucket.

  4. El administrador de la cuenta C crea un usuario y asocia una política de usuario que le permite al usuario asumir la función.

  5. El usuario de la cuenta C primero asume la función, la cual le devuelve al usuario credenciales de seguridad temporales. Con esas credenciales temporales, el usuario obtiene acceso a los objetos en el bucket.

Para este ejemplo, se necesitan tres cuentas. La siguiente tabla muestra cómo denominamos a estas cuentas y a los usuarios administradores en estas cuentas. De acuerdo con las directrices de IAM (consulte Acerca del uso de un usuario administrador para crear recursos y conceder permisos), no utilizamos las credenciales de Usuario raíz de la cuenta de AWS en este tutorial. En lugar de eso, usted crea un usuario administrador en cada cuenta y utiliza esas credenciales cuando se crean recursos y se conceden permisos.

ID de Cuenta de AWS Cuenta denominada Usuario administrador de la cuenta

1111-1111-1111

Cuenta A

AccountAadmin

2222-2222-2222

Cuenta B

AccountBadmin

3333-3333-3333

Cuenta C

AccountCadmin

Paso 0: Prepararse para el tutorial

nota

Puede que quiera abrir un editor de textos y tomar notas a medida que se explican los pasos. Específicamente, necesitará ID de cuentas, ID de usuarios canónicos, URL de inicio de sesión de usuarios de IAM para cada cuenta a fin de conectarse a la consola y Amazon Resource Name (ARN, Nombres de recursos de Amazon) de los usuarios de IAM y roles.

  1. Asegúrese de tener tres Cuentas de AWS y que cada cuenta tenga un usuario administrador, como se muestra en la tabla de la sección anterior.

    1. Regístrese para obtener Cuentas de AWS, según sea necesario. Denominamos estas cuentas cuenta A, cuenta B y cuenta C.

    2. Con las credenciales de la cuenta A, inicie sesión en la consola de IAM y haga lo siguiente para crear un usuario administrador:

      • Cree al usuario AccountAadmin y tenga en cuenta sus credenciales de seguridad. Para obtener más información sobre cómo agregar usuarios, consulte Creación de un usuario de IAM en su Cuenta de AWS en la Guía del usuario de IAM.

      • Conceda privilegios de administrador a AccountAadmin adjuntando una política de usuario que le conceda acceso total. Para obtener instrucciones, consulte Administración de políticas de IAM en la Guía del usuario de IAM.

      • En el panel de la consola de IAM, tenga en cuenta la URL de inicio de sesión de usuario de IAM. Los usuarios de esta cuenta deben usar esta dirección URL para iniciar sesión en la AWS Management Console. Para obtener más información, consulte Inicio de sesión en la AWS Management Console como usuario de IAM en la Guía del usuario de IAM.

    3. Repita el paso anterior para crear usuarios administradores de la cuenta B y de la cuenta C.

  2. Para la cuenta C, tenga en cuenta el ID de usuario canónico.

    Cuando crea un rol de IAM en la cuenta A, la política de confianza le concede a la cuenta C el permiso para asumir la función mediante la especificación del ID de la cuenta. Puede buscar la información de la cuenta de la siguiente manera:

    1. Utilice el ID de la Cuenta de AWS o el alias de la cuenta, el nombre de usuario de IAM y la contraseña para iniciar sesión en la consola de Amazon S3.

    2. Elija el nombre de un bucket de Amazon S3 para ver los detalles de dicho bucket.

    3. Elija la pestaña Permissions (Permisos) y, a continuación, elija Access Control List (Lista de control de acceso).

    4. En la sección Acceso para la Cuenta de AWS, en la columna Cuenta, hay un identificador largo, por ejemplo, c1daexampleaaf850ea79cf0430f33d72579fd1611c97f7ded193374c0b163b6. Este es el ID de usuario canónico.

  3. Cuando cree una política de bucket, necesitará la siguiente información. Tenga en cuenta estos valores:

    • El ID de usuario canónico de la cuenta A: cuando el administrador de la cuenta A concede el permiso condicional para cargar objetos al administrador de la cuenta B, la condición especifica el ID de usuario canónico del usuario de la cuenta A que debe obtener control absoluto de los objetos.

      nota

      El ID de usuario canónico es un concepto exclusivo de Amazon S3. Es la versión ofuscada de 64 caracteres del ID de la cuenta.

    • ARN de usuario para el administrador de la cuenta B: puede encontrar el ARN del usuario en la consola de IAM. Debe seleccionar el usuario y buscar el ARN del usuario en la pestaña Resumen.

      En la política de bucket, se concede permiso al AccountBadmin para cargar objetos y se usa el ARN para especificar el usuario. El siguiente es un ejemplo de valor de ARN:

      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. Configure AWS Command Line Interface (CLI) o AWS Tools for Windows PowerShell. Asegúrese de guardar las credenciales del usuario administrador de la siguiente manera:

    • Si está usando la AWS CLI, cree perfiles, AccountAadmin y AccountBadmin, en el archivo de configuración.

    • Si usa AWS Tools for Windows PowerShell, asegúrese de almacenar las credenciales para la sesión como AccountAadmin y AccountBadmin.

    Para obtener instrucciones, consulte Configuración de las herramientas para los tutoriales.

Paso 1: Realizar las tareas de la cuenta A

En este ejemplo, la cuenta A es la propietaria del bucket. Por lo tanto, el usuario AccountAadmin en la cuenta A hará lo siguiente:

  • Crear un bucket.

  • Asocie una política de bucket que conceda el permiso al administrador de la cuenta B para cargar objetos.

  • Cree un rol de IAM que conceda a la cuenta C el permiso para asumir el rol, de manera que pueda acceder a los objetos en el bucket.

Paso 1.1: Iniciar sesión en la AWS Management Console

Con la URL de inicio de sesión de usuario de IAM para la cuenta A, primero inicie sesión en la AWS Management Console como el usuario AccountAadmin. Este usuario creará un bucket y le asociará una política.

Paso 1.2: Crear un bucket y asociar una política de bucket

En la consola de Amazon S3, haga lo siguiente:

  1. Cree un bucket. Para este ejercicio, se supone que el nombre del bucket es DOC-EXAMPLE-BUCKET1.

    Para obtener instrucciones, consulte Crear un bucket.

  2. Adjunte la siguiente política de bucket. La política concede permiso condicional al permiso de administrador de la cuenta B para cargar objetos.

    Actualice la política proporcionando sus propios valores para DOC-EXAMPLE-BUCKET1, AccountB-ID y CanonicalUserId-of-AWSaccountA-BucketOwner.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner" } } } ] }

Paso 1.3: Creación de un rol de IAM para permitir a la cuenta C el acceso entre cuentas en la cuenta A

En la Consola de IAM, cree un rol de IAM (examplerole) que conceda permiso a la cuenta C para asumir el rol. Asegúrese de que sigue registrado como administrador de la cuenta A, ya que el rol se debe crear en la cuenta A.

  1. Antes de crear el rol, prepare la política administrada que define los permisos que requiere el rol. Más tarde, en otro paso, la asociará al rol.

    1. En el panel de navegación de la izquierda, elija Políticas y, a continuación, elija Crear política.

    2. Junto a Create Your Own Policy, seleccione Select.

    3. Escriba access-accountA-bucket en el campo Nombre de la política.

    4. Copie la siguiente política de acceso y péguela en el campo Documento de la política. La política de acceso le concede al rol el permiso de s3:GetObject, de manera que cuando el usuario de la cuenta C asuma el rol, solo pueda realizar la operación s3:GetObject.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" } ] }
    5. Seleccione Crear política.

      La nueva política aparece en la lista de políticas administradas.

  2. En el panel de navegación de la izquierda, elija Roles y, a continuación, elija Creación de rol nuevo.

  3. En Seleccionar tipo de rol, seleccione Rol para acceso entre cuentas y, luego, elija el botón Seleccionar ubicado al lado de Proporcionar acceso entre Cuentas de AWS de su propiedad.

  4. Escriba el ID de la cuenta C.

    Para este tutorial, no es obligatorio que los usuarios tengan la autenticación multifactor (MFA) para asumir el rol, por lo que deje esa opción desmarcada.

  5. Seleccione Next Step para establecer los permisos que se asociarán al rol.

  6. Seleccione la casilla de verificación situada junto a la política access-accountA-bucket que creó y, a continuación, elija Siguiente paso.

    Aparece la página Review para que confirme las configuraciones de la función antes de crearla. Un elemento muy importante para tener en cuenta en esta página es el enlace que puede enviar a los usuarios que necesitan usar esta función. Los usuarios que hacen clic en el enlace se dirigen directamente a la página Cambio de rol con los campos ID de cuenta y Nombre de rol ya completados. También puede ver este enlace más tarde, en la página Role Summary de cualquier rol con permisos entre cuentas.

  7. Escriba examplerole para el nombre del rol y, luego, elija Siguiente paso.

  8. Después de revisar el rol, elija Crear rol.

    La función examplerole se muestra en la lista de funciones.

  9. Elija el nombre del rol examplerole.

  10. Seleccione la pestaña Relaciones de confianza.

  11. Elija Mostrar el documento de política y verifique que la política de confianza que se muestra coincide con la siguiente política.

    La siguiente política de confianza establece una relación de confianza con la cuenta C mediante la concesión del permiso para realizar la acción sts:AssumeRole. Para obtener más información, consulte AssumeRole en la Referencia de la API de AWS Security Token Service.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. Tenga en cuenta el nombre de recurso de Amazon (ARN) del rol examplerole que creó.

    Más adelante en los pasos siguientes, se asocia una política de usuario para permitirle a un usuario de IAM que asuma esta función y la función se identifica con el valor de ARN.

Paso 2: Realizar las tareas de la cuenta B

El bucket de ejemplo que pertenece a la cuenta A necesita objetos que pertenezcan a otras cuentas. En este paso, el administrador de la cuenta B carga un objeto con las herramientas de línea de comandos.

  • Mediante el uso del comando put-object de la AWS CLI, cargue un objeto en DOC-EXAMPLE-BUCKET1.

    aws s3api put-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --body HappyFace.jpg --grant-full-control id="canonicalUserId-ofTheBucketOwner" --profile AccountBadmin

    Tenga en cuenta lo siguiente:

    • El parámetro --Profile especifica el perfil AccountBadmin, por lo que el objeto pertenece a la cuenta B.

    • El parámetro grant-full-control le concede al propietario del bucket permiso de control absoluto sobre el objeto según lo requiere la política de bucket.

    • El parámetro --body identifica el archivo de origen para cargar. Por ejemplo, si el archivo está en la unidad C: de un equipo con Windows, se especifica c:\HappyFace.jpg.

Paso 3: Realización de las tareas de la cuenta C

En los pasos anteriores, la cuenta A ya ha creado un rol, examplerole, mediante el cual se establece una relación de confianza con la cuenta C. Este rol permite a los usuarios de la cuenta C acceder a la cuenta A. En este paso, el administrador de la cuenta C crea un usuario (Dave) y le delega el permiso sts:AssumeRole que recibió de la cuenta A. Este enfoque le permite a Dave asumir examplerole y obtener acceso temporal a la cuenta A. La política de acceso que la cuenta A asoció al rol limita lo que Dave puede hacer cuando accede a la cuenta A, específicamente, obtener objetos en DOC-EXAMPLE-BUCKET1.

Paso 3.1: Creación de un usuario en la cuenta C y delegación de un permiso para asumir examplerole

  1. Con la URL de inicio de sesión de usuario de IAM para la cuenta C, primero inicie sesión en la AWS Management Console como el usuario AccountCadmin.

  2. En la consola de IAM, cree el usuario Dave.

    Para obtener instrucciones paso a paso, consulte Creación de usuarios de IAM (AWS Management Console) en la Guía del usuario de IAM.

  3. Tenga en cuenta las credenciales de Dave. Dave necesitará estas credenciales para asumir la función examplerole.

  4. Cree una política integrada para el usuario de IAM Dave a fin de delegar el permiso sts:AssumeRole a Dave en el rol examplerole en la cuenta A.

    1. En el panel de navegación de la izquierda, elija Usuarios.

    2. Elija el nombre de usuario Dave.

    3. En la página de detalles del usuario, seleccione la pestaña Permisos y, luego, expanda la sección Políticas insertadas.

    4. Seleccione hacer clic aquí (o Crear política de usuario).

    5. Elija Custom Policy y después Select.

    6. Escriba un nombre para la política en el campo Nombre de la política.

    7. Copie la siguiente política en el campo Documento de la política.

      Debe actualizar la política proporcionando el AccountA-ID.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::AccountA-ID:role/examplerole" } ] }
    8. Seleccione Apply Policy.

  5. Guarde las credenciales de Dave en el archivo de configuración de la AWS CLI mediante la agregación de otro perfil, AccountCDave.

    [profile AccountCDave] aws_access_key_id = UserDaveAccessKeyID aws_secret_access_key = UserDaveSecretAccessKey region = us-west-2

Paso 3.2: Asunción del rol (examplerole) y acceso a los objetos

Ahora Dave puede obtener acceso a los objetos en el bucket que pertenecen a la cuenta A de la siguiente manera:

  • Dave primero asume la función examplerole con sus propias credenciales. Esto devuelve credenciales temporales.

  • Con las credenciales temporales, Dave obtiene acceso a los objetos en el bucket de la cuenta A.

  1. En el símbolo del sistema, ejecute el comando assume-role de la AWS CLI con el perfil AccountCDave.

    Debe actualizar el valor de ARN en el comando proporcionando el AccountA-ID donde se define examplerole.

    aws sts assume-role --role-arn arn:aws:iam::AccountA-ID:role/examplerole --profile AccountCDave --role-session-name test

    Como respuesta, AWS Security Token Service (AWS STS) muestra credenciales de seguridad temporales (ID de clave de acceso, clave de acceso secreta y token de sesión).

  2. Guarde las credenciales de seguridad temporales en el archivo de configuración de la AWS CLI en el perfil TempCred.

    [profile TempCred] aws_access_key_id = temp-access-key-ID aws_secret_access_key = temp-secret-access-key aws_session_token = session-token region = us-west-2
  3. En el símbolo del sistema, ejecute el siguiente comando de la AWS CLI para acceder a los objetos con las credenciales temporales. Por ejemplo, el comando especifica la Application Programming Interface (API, Interfaz de programación de aplicaciones) de head-object para recuperar los metadatos de los objetos para el objeto HappyFace.jpg.

    aws s3api get-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

    Como la política de acceso asociada con la función examplerole permite las acciones, Amazon S3 procesa la solicitud. Puede probar cualquier otra acción en cualquier otro objeto del bucket.

    Si prueba cualquier otra acción, por ejemplo, get-object-acl, se le negará el permiso porque no se le permite esa acción al rol.

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --profile TempCred

    Usamos el usuario Dave para asumir la función y obtener acceso al objeto con credenciales temporales. También podría ser una aplicación en la cuenta C que obtuviera acceso a los objetos en el bucket DOC-EXAMPLE-BUCKET1. La aplicación puede obtener las credenciales de seguridad temporales y la cuenta C puede delegar el permiso de la aplicación para asumir la función examplerole.

Paso 4: Limpiar

  1. Después de que haya terminado de probar, puede realizar lo siguiente para limpiar:

    1. Inicie sesión en la AWS Management Console con las credenciales de la cuenta A y haga lo siguiente:

      • En la consola de Amazon S3, elimine la política de bucket asociada a DOC-EXAMPLE-BUCKET1. En Propiedades del bucket, elimine la política en la sección Permisos.

      • Si se creó el bucket para este ejercicio, en la consola de Amazon S3, elimine los objetos y luego elimine el bucket.

      • En la consola de IAM, elimine el examplerole que ha creado en la cuenta A. Para obtener instrucciones paso a paso, consulte Eliminación de un usuario de IAM en la Guía del usuario de IAM.

      • En la consola de IAM, quite el usuario AccountAadmin.

  2. Inicie sesión en la consola de IAM con las credenciales de la cuenta B. Elimine el usuario AccountBadmin.

  3. Inicie sesión en la consola de IAM con las credenciales de la cuenta C. Elimine AccountCadmin y el usuario Dave.

Recursos relacionados

Para obtener más información relacionada con este tutorial, consulte los siguientes recursos en la Guía del usuario de IAM: