Ejemplo 4: propietarios de buckets que conceden permisos entre cuentas para objetos que no les pertenecen - Amazon Simple Storage Service

Ejemplo 4: propietarios de buckets que conceden permisos entre cuentas para objetos que no les 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. Esto resolverá el problema de que los objetos no le pertenecen a usted, 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. Por lo tanto, para que el propietario del bucket conceda permisos para aquellos objetos que no le pertenecen, el propietario del objeto, la Cuenta de AWS que creó los objetos, primero debe conceder permiso al propietario del bucket. Luego, el propietario del bucket puede delegar esos permisos.

  • La cuenta del propietario del bucket puede delegar permisos a usuarios en su propia cuenta (consulte Ejemplo 3: propietario del bucket que concede a sus usuarios permisos para objetos que no posee), pero no puede delegarlos a otras Cuentas de AWS, ya que 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 obtener acceso a los objetos y conceder otro permiso de la Cuenta de AWS para asumir el rol de manera temporal, con el cual se podría obtener acceso 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.

Introducción: permisos a otras 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 se crea trae adjuntas 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 de 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.

El siguiente es un resumen de los pasos del tutorial:

  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 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

Se recomienda abrir el 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 el usuario AccountAadmin y anote las credenciales de seguridad. Para obtener más información sobre cómo agregar usuarios, consulte Creación de un usuario de IAM en la 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 Uso de políticas en la guía del usuario de IAM.

      • En Panel de la consola de IAM, anote 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 Cómo inician sesión los usuarios en la cuenta 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, anote 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 su 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. Anote 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.

    • El ARN del usuario para el administrador de la cuenta B: el ARN del usuario se puede buscar 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 usuario 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 los perfiles, AccountAadmin y AccountBadmin, en el archivo de configuración.

    • Si está usando 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 de ejemplo.

Paso 1: Realizar las tareas de la cuenta A

En este ejemplo, la cuenta A es la propietaria del bucket. El usuario AccountAadmin de la cuenta A creará un bucket, asociará una política de bucket para conceder al administrador de la cuenta B el permiso para cargar objetos y creará un rol de IAM para conceder a la cuenta C el permiso para asumir la función, de manera que pueda obtener acceso a los objetos en el bucket.

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

Con la dirección 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. Asocie la siguiente política de bucket para conceder un permiso condicional al administrador de la cuenta B para cargar objetos.

    Debe actualizar 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: Crear un rol de IAM para permitir a la cuenta C el acceso entre cuentas a la cuenta A

En la consola de IAM, cree un rol de IAM (“examplerole”) para conceder el permiso a la cuenta C para asumir el rol. Asegúrese de seguir registrado como administrador de la cuenta A, ya que la función 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, haga clic en Políticas y, luego, haga clic en Crear política.

    2. Junto a Cree su propia política, haga clic en Seleccionar.

    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 a la función el permiso de s3:GetObject, de manera que cuando el usuario de la cuenta C asuma la función, 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. Haga clic en 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, haga clic en Roles y, luego, haga clic en Crear nuevo rol.

  3. En Seleccionar tipo de rol, elija Rol para acceso entre cuentas y, luego, haga clic en 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 Multi-Factor Authentication (MFA) para asumir la función, por lo que deje esa opción desmarcada.

  5. Haga clic en Siguiente paso para establecer los permisos que se asociarán con el rol.

  6. Seleccione la casilla al lado de la política access-accountA-bucket que creó y, luego, haga clic en 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 Switch Role con los campos Account ID y Role Name ya completados. También puede ver este enlace después en la página Role Summary para conocer las funciones con permisos entre cuentas.

  7. Escriba examplerole para el nombre del rol y, luego, haga clic en Siguiente paso.

  8. Después de revisar el rol, haga clic en Crear rol.

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

  9. Haga clic en el nombre de la función examplerole.

  10. Seleccione la pestaña Relaciones de confianza.

  11. Haga clic en Mostrar documento de la política y verifique que la política de confianza que se muestra sea la misma que 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. Anote el nombre de recurso de Amazon (ARN) de la función 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: Realizar las tareas de la cuenta C

En los pasos anteriores, la cuenta A ya ha creado una función, examplerole, mediante la cual se establece una relación de confianza con la cuenta C. Esta les permite a los usuarios de la cuenta C obtener acceso 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. Esto le permite a Dave asumir la función examplerole y obtener acceso temporal a la cuenta A. La política de acceso que la cuenta A asoció a la función limitará lo que Dave puede hacer cuando obtiene acceso a la cuenta A, específicamente, obtener los objetos del bucket DOC-EXAMPLE-BUCKET1.

Paso 3.1: Crear un usuario en la cuenta C y delegar un permiso para asumir la función examplerole

  1. Con la dirección 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. Anote las credenciales de Dave. Dave necesitará estas credenciales para asumir la función examplerole.

  4. Cree una política en línea para el usuario Dave de IAM a fin de delegar el permiso sts:AssumeRole a Dave en la función examplerole en la cuenta A.

    1. En el panel de navegación de la izquierda, haga clic en Usuarios.

    2. Haga clic en 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. Haga clic en Política personalizada y, luego, haga clic en Seleccionar.

    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.

      Tendrá que actualizar la política proporcionando el ID de la cuenta A.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::AccountA-ID:role/examplerole" } ] }
    8. Haga clic en Aplicar política.

  5. Agregue otro perfil, AccountCDave, para guardar las credenciales de Dave en el archivo de configuración de la AWS CLI.

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

Paso 3.2: Asumir el rol (rol de ejemplo) y acceder 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.

    Tendrá que actualizar el valor de ARN en el comando proporcionando el ID de la cuenta A donde se define la función 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 (STS) devuelve 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 a la función.

    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 (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 https://console.aws.amazon.com/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 https://console.aws.amazon.com/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