

# S3 Access Grants e identidades de directorios corporativos
<a name="access-grants-directory-ids"></a>

Puede usar Amazon S3 Access Grants para otorgar acceso a las entidades principales de AWS Identity and Access Management (IAM) (usuarios o roles), tanto en la misma Cuenta de AWS como en otras. Sin embargo, en muchos casos, la entidad que accede a los datos es un usuario final de su directorio corporativo. En lugar de otorgar acceso a las entidades principales de IAM, puede utilizar Amazon S3 Access Grants para otorgar acceso directamente a los usuarios y grupos corporativos. Con Amazon S3 Access Grants, ya no es necesario asignar las identidades corporativas a las entidades principales de IAM intermedias para poder acceder a los datos de S3 mediante sus aplicaciones corporativas.

Esta nueva funcionalidad, que permite utilizar las identidades de los usuarios finales para acceder a los datos, se proporciona al asociar su instancia de S3 Access Grants a una instancia. del AWS IAM Identity Center. El Centro de identidades de IAM es compatible con proveedores de identidades basados en estándares y es el centro de AWS para todos los servicios o características, incluido S3 Access Grants, que admiten identidades de usuarios finales. El Centro de identidades de IAM proporciona soporte de autenticación para identidades corporativas mediante su característica de propagación de identidades de confianza. Para obtener más información, consulte [Propagación de identidades de confianza en aplicaciones](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html).

Para empezar a utilizar el soporte de identidades de personal en S3 Access Grants, como requisito previo, comience en el Centro de identidades de IAM configurando el aprovisionamiento de identidades entre su proveedor de identidad corporativa y el Centro de identidades de IAM. El Centro de identidades de IAM es compatible con proveedores de identidad corporativa como Okta, Microsoft Entra ID (anteriormente Azure Active Directory) o cualquier otro proveedor de identidades (IdP) externo que admita el protocolo System for Cross-Domain Identity Management (SCIM). Cuando conecta el Centro de identidades de IAM a su IdP y habilita el aprovisionamiento automático, los usuarios y grupos de su IdP se sincronizan en el almacén de identidades del Centro de identidades de IAM. Tras este paso, el Centro de identidades de IAM tiene su propia vista de sus usuarios y grupos, de modo que puede hacer referencia a ellos mediante otros Servicios de AWS y características, como S3 Access Grants. Para obtener más información sobre la configuración del aprovisionamiento automático de Centro de identidades de IAM, consulte [Aprovisionamiento automático](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-automatically.html) en la *Guía del usuario de AWS IAM Identity Center*.

El Centro de identidades de IAM está integrado con AWS Organizations, para que pueda administrar de forma centralizada los permisos de varias Cuentas de AWS sin tener que configurar cada una de ellas manualmente. En una organización típica, el administrador de identidades configura una instancia del Centro de identidades de IAM para toda la organización, como un único punto de sincronización de identidades. Esta instancia del Centro de identidades de IAM suele ejecutarse en una Cuenta de AWS dedicada de su organización. En esta configuración común, puede hacer referencia a las identidades de usuarios y grupos en S3 Access Grants desde cualquier Cuenta de AWS de la organización. 

Sin embargo, si el administrador de AWS Organizations aún no ha configurado una instancia de IAM Identity Center central, puede crear una local en la misma cuenta y Región de AWS que la instancia de Concesiones de acceso de S3. Si tiene una instancia de IAM Identity Center configurada en una Región de AWS diferente, también puede [replicar](https://docs.aws.amazon.com/singlesignon/latest/userguide/replicate-to-additional-region.html) esta instancia a la misma Región de AWS que la instancia de Concesiones de acceso de S3. Esta configuración es más común para los casos de uso de prueba de concepto o de desarrollo local. En todos los casos, la instancia del Centro de identidades de IAM debe estar en la misma Región de AWS que la instancia de S3 Access Grants a la que se asociará.

En el siguiente diagrama de una configuración del Centro de identidades de IAM con un IdP externo, el IdP se configura con SCIM para sincronizar el almacén de identidades del IdP al almacén de identidades del Centro de identidades de IAM.

![\[Integración del Centro de identidades de IAM con un almacén de identidades externo mediante el aprovisionamiento automático.\]](http://docs.aws.amazon.com/es_es/AmazonS3/latest/userguide/images/s3ag-identity-store.png)


Para usar las identidades de su directorio corporativo con S3 Access Grants, haga lo siguiente:
+ Configure el [aprovisionamiento automático](https://docs.aws.amazon.com/singlesignon/latest/userguide/provision-automatically.html) en el Centro de identidades de IAM para sincronizar la información de usuarios y grupos de su IdP con el Centro de identidades de IAM. 
+ Configure su origen de identidad externa en el Centro de identidades de IAM como un emisor de tokens de confianza. Para obtener más información, consulte [Propagación de identidad de confianza en aplicaciones](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html) en la *Guía del usuario del AWS IAM Identity Center*.
+ Asocie su instancia de S3 Access Grants a su instancia del Centro de identidades de IAM. Puede hacerlo al [crear su instancia de S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-instance.html). Si ya ha creado su instancia de S3 Access Grants, consulte [Asociar o desasociar su instancia del Centro de identidades de IAM](access-grants-instance-idc.md). 

## Cómo pueden acceder las identidades de directorio a los datos de S3
<a name="access-grants-directory-ids-details"></a>

Suponga que tiene usuarios del directorio corporativo que necesitan acceder a sus datos de S3 a través de una aplicación corporativa, por ejemplo, una aplicación de visualización de documentos, que está integrada con su IdP externo (por ejemplo, Okta) para autenticar a los usuarios. La autenticación del usuario en estas aplicaciones se suele realizar mediante redireccionamientos en el navegador web del usuario. Puesto que los usuarios del directorio no son las entidades principales de IAM, su aplicación necesita credenciales de IAM con las que pueda llamar a la operación de la API `GetDataAccess` de S3 Access Grants para [obtener credenciales de acceso a los datos de S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-credentials.html) en nombre de los usuarios. A diferencia de los usuarios y roles de IAM, que obtienen las credenciales ellos mismos, su aplicación necesita una forma de representar a un usuario del directorio, que no esté asignado a un rol de IAM, para que el usuario pueda acceder a los datos a través de S3 Access Grants.

Esta transición, de un usuario de directorio autenticado a un intermediario de IAM que puede realizar solicitudes a S3 Access Grants en nombre del usuario del directorio, la realiza la aplicación a través de la característica del emisor de tokens de confianza del Centro de identidades de IAM. La aplicación, después de autenticar al usuario del directorio, tiene un token de identidad del IdP (por ejemplo, Okta) que representa al usuario del directorio según Okta. La configuración del emisor de tokens de confianza del Centro de identidades de IAM permite a la aplicación intercambiar este token de Okta (el inquilino de Okta está configurado como el "emisor de confianza") por un token de identidad diferente del Centro de identidades de IAM que representará de forma segura al usuario del directorio dentro de Servicios de AWS. La aplicación de datos asumirá entonces un rol de IAM y proporcionará el token del usuario del directorio del Centro de identidades de IAM como contexto adicional. La aplicación puede usar la sesión de IAM resultante para llamar a S3 Access Grants. El token representa tanto la identidad de la aplicación (la propia entidad principal de IAM) como la identidad del usuario del directorio.

El paso principal de esta transición es el intercambio de token. La aplicación realiza este intercambio de token mediante una llamada a la operación de la API `CreateTokenWithIAM` en el Centro de identidades de IAM. Por supuesto, también se trata de una llamada a la API AWS y requiere que una entidad principal de IAM la firme. La entidad principal de IAM que realiza esta solicitud suele ser un rol de IAM asociado a la aplicación. Por ejemplo, si la aplicación se ejecuta en Amazon EC2, la solicitud `CreateTokenWithIAM` normalmente la realiza el rol de IAM asociado a la instancia EC2 en la que se ejecuta la aplicación. El resultado de una llamada `CreateTokenWithIAM` correcta es un nuevo token de identidad, que se reconocerá en Servicios de AWS. 

El siguiente paso, antes de que la aplicación pueda llamar `GetDataAccess` en nombre del usuario del directorio, consiste en obtener una sesión de IAM que incluya la identidad del usuario del directorio. La aplicación lo hace con una solicitud `AssumeRole` de AWS Security Token Service (AWS STS) que también incluye el token del Centro de identidades de IAM para el usuario del directorio como contexto de identidad adicional. Este contexto adicional es lo que permite al Centro de identidades de IAM propagar la identidad del usuario del directorio para pasar al siguiente paso. El rol de IAM que asume la aplicación es el que necesitará los permisos de IAM para llamar a la operación `GetDataAccess`.

Tras haber asumido el rol de IAM portador de la identidad con el token del Centro de identidades de IAM para el usuario del directorio como contexto adicional, la aplicación ahora tiene todo lo necesario para realizar una solicitud firmada a `GetDataAccess` en nombre del usuario del directorio autenticado.

La propagación del token se basa en los siguientes pasos:

**Crear una aplicación del Centro de identidades de IAM**

En primer lugar, cree una nueva aplicación en el Centro de identidad de IAM. Esta aplicación utilizará una plantilla que permite al Centro de identidades de IAM identificar el tipo de configuración de la aplicación que puede utilizar. El comando para crear la aplicación requiere que proporciones la instancia del Centro de identidades de IAM, el nombre de recurso de Amazon (ARN), un nombre de aplicación y el ARN del proveedor de la aplicación. El proveedor de la aplicación es el proveedor de aplicaciones SAML u OAuth que la aplicación utilizará para realizar llamadas al Centro de identidades de IAM. 

Para utilizar el comando de ejemplo siguiente, sustituya `user input placeholders` con su información.

```
aws sso-admin create-application \
 --instance-arn "arn:aws:sso:::instance/ssoins-ssoins-1234567890abcdef" \
 --application-provider-arn "arn:aws:sso::aws:applicationProvider/custom" \
 --name MyDataApplication
```

Respuesta:

```
{
   "ApplicationArn": "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d"
}
```

**Crear un emisor de tokens de confianza**

Ahora que dispone de la aplicación del Centro de identidades de IAM, el siguiente paso es configurar un emisor de tokens de confianza que se utilizará para intercambiar sus valores `IdToken` de su IdP por los tokens del Centro de identidades de IAM. En este paso debe proporcionar los siguientes elementos:
+ La URL del emisor del proveedor de identidad
+ El nombre del emisor de tokens de confianza
+ La ruta del atributo de la notificación
+ La ruta de los atributos del almacén de identidades
+ La opción de recuperación de JSON Web Key Set (JWKS)

La ruta del atributo de la notificación es el atributo del proveedor de identidad que se utilizará para asignarse al atributo del almacén de identidades. Normalmente, la ruta del atributo de la notificación es la dirección de correo electrónico del usuario, pero puede utilizar otros atributos para realizar la asignación.

Cree un archivo de especificaciones denominado `oidc-configuration.json` con la siguiente información: Para utilizar este archivo, sustituya `user input placeholders` por su información.

```
{
  "OidcJwtConfiguration":
     {
      "IssuerUrl": "https://login.microsoftonline.com/a1b2c3d4-abcd-1234-b7d5-b154440ac123/v2.0",
      "ClaimAttributePath": "preferred_username",
      "IdentityStoreAttributePath": "userName",
      "JwksRetrievalOption": "OPEN_ID_DISCOVERY"
     }
}
```

Para crear el emisor de tokens de confianza, ejecute el siguiente comando. Para utilizar este comando de ejemplo, sustituya `user input placeholders` por su propia información.

```
aws sso-admin create-trusted-token-issuer \
  --instance-arn "arn:aws:sso:::instance/ssoins-1234567890abcdef" \
  --name MyEntraIDTrustedIssuer \
  --trusted-token-issuer-type OIDC_JWT \
  --trusted-token-issuer-configuration file://./oidc-configuration.json
```

Respuesta

```
{
  "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234"
}
```

**Conectar la aplicación del Centro de identidades de IAM con el emisor de tokens de confianza**

El emisor de tokens de confianza necesita algunos ajustes de configuración más para funcionar. Defina la audiencia en la que confiará el emisor de tokens de confianza. La audiencia es el valor dentro del `IdToken` que se identifica con la clave y que se encuentra en la configuración del proveedor de identidades. Por ejemplo: 

```
1234973b-abcd-1234-abcd-345c5a9c1234
```

Cree un archivo denominado `grant.json` que contenga el contenido siguiente. Para usar este archivo, cambie la audiencia para que coincida con la configuración de su proveedor de identidad y proporcione el ARN del emisor de tokens de confianza que devolvió el comando anterior.

```
{
   "JwtBearer":
     {
       "AuthorizedTokenIssuers":
         [
           {
             "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234",
               "AuthorizedAudiences":
                 [
                   "1234973b-abcd-1234-abcd-345c5a9c1234"
                 ]
            }
         ]
     }
 }
```

Ejecute el siguiente comando de ejemplo. Para usar este comando, sustituya `user input placeholders` por su propia información.

```
aws sso-admin put-application-grant \
  --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \
  --grant-type "urn:ietf:params:oauth:grant-type:jwt-bearer" \
  --grant file://./grant.json \
```

Este comando establece los ajustes de configuración para que el emisor de tokens de confianza confíe en la audiencia del archivo `grant.json` y vincule esta audiencia con la aplicación creada en el primer paso para intercambiar tokens de tipo `jwt-bearer`. La cadena `urn:ietf:params:oauth:grant-type:jwt-bearer` no es una cadena arbitraria. Es un espacio de nombres registrado en los perfiles de aserción JSON Web Token (JWT) de OAuth. Puede encontrar más información sobre este espacio de nombres en el [RFC 7523](https://datatracker.ietf.org/doc/html/rfc7523).

A continuación, utilice el siguiente comando para configurar los alcances que incluirá el emisor de tokens de confianza al intercambiar valores `IdToken` desde su proveedor de identidad. En el caso de S3 Access Grants, el valor del parámetro `--scope` es `s3:access_grants:read_write`.

```
aws sso-admin put-application-access-scope \
  --application-arn "arn:aws:sso::111122223333:application/ssoins-ssoins-111122223333abcdef/apl-abcd1234a1b2c3d" \
  --scope "s3:access_grants:read_write"
```

El último paso consiste en adjuntar una política de recursos a la aplicación del Centro de identidades de IAM. Esta política permitirá al rol de IAM de su aplicación realizar solicitudes a la operación de la API `sso-oauth:CreateTokenWithIAM` y recibir los valores `IdToken` del Centro de identidades de IAM.

Cree un archivo denominado `authentication-method.json` que contenga el contenido siguiente. Reemplace `123456789012` por su ID de cuenta.

```
{
   "Iam":
       {
         "ActorPolicy":
             {
                "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
                    "Statement":
                    [
                        {
                           "Effect": "Allow",
                            "Principal":
                            {
                              "AWS": "arn:aws:iam::123456789012:role/webapp"
                            },
                           "Action": "sso-oauth:CreateTokenWithIAM",
                            "Resource": "*"
                        }
                    ]
                }
            }
        }
```

Para asociar la política a la aplicación del Centro de identidades de IAM, ejecute este comando:

```
aws sso-admin put-application-authentication-method \
   --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \
   --authentication-method-type IAM \
   --authentication-method file://./authentication-method.json
```

Esto completa la configuración para usar S3 Access Grants con los usuarios del directorio a través de una aplicación web. Puede probar esta configuración directamente en la aplicación o puede llamar a la operación de la API `CreateTokenWithIAM` mediante el siguiente comando desde un rol de IAM permitido en la política de la aplicación del Centro de identidades de IAM:

```
aws sso-oidc create-token-with-iam \
   --client-id "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d"  \
   --grant-type urn:ietf:params:oauth:grant-type:jwt-bearer \
   --assertion IdToken
```

La respuesta será parecida a la siguiente:

```
{
    "accessToken": "<suppressed long string to reduce space>",
    "tokenType": "Bearer",
    "expiresIn": 3600,
    "refreshToken": "<suppressed long string to reduce space>",
    "idToken": "<suppressed long string to reduce space>",
    "issuedTokenType": "urn:ietf:params:oauth:token-type:refresh_token",
    "scope": [
      "sts:identity_context",
      "s3:access_grants:read_write",
      "openid",
      "aws"
    ]
}
```

Si decodifica el valor `IdToken` que está codificado con base64, puede ver los pares clave-valor en formato JSON. La clave `sts:identity_context` contiene el valor que la aplicación debe enviar en la solicitud `sts:AssumeRole` para incluir la información de identidad del usuario del directorio. A continuación, se muestra un ejemplo del `IdToken` decodificado:

```
{
    "aws:identity_store_id": "d-996773e796",
    "sts:identity_context": "AQoJb3JpZ2luX2VjEOTtl;<SUPRESSED>",
    "sub": "83d43802-00b1-7054-db02-f1d683aacba5",
    "aws:instance_account": "123456789012",
    "iss": "https://identitycenter.amazonaws.com/ssoins-1234567890abcdef",
    "sts:audit_context": "AQoJb3JpZ2luX2VjEOT<SUPRESSED>==",
    "aws:identity_store_arn": "arn:aws:identitystore::232642235904:identitystore/d-996773e796",
    "aud": "abcd12344U0gi7n4Yyp0-WV1LWNlbnRyYWwtMQ",
    "aws:instance_arn": "arn:aws:sso:::instance/ssoins-6987d7fb04cf7a51",
    "aws:credential_id": "EXAMPLEHI5glPh40y9TpApJn8...",
    "act": {
       "sub": "arn:aws:sso::232642235904:trustedTokenIssuer/ssoins-6987d7fb04cf7a51/43b4a822-1020-7053-3631-cb2d3e28d10e"
    },
    "auth_time": "2023-11-01T20:24:28Z",
    "exp": 1698873868,
    "iat": 1698870268
}
```

Puede obtener el valor de `sts:identity_context` y pasar esta información en una llamada `sts:AssumeRole`. A continuación se muestra un ejemplo de la CLI de la sintaxis. El rol que se va a asumir es un rol temporal con permisos para invocar `s3:GetDataAccess`.

```
aws sts assume-role \
   --role-arn "arn:aws:iam::123456789012:role/temp-role" \
   --role-session-name "TempDirectoryUserRole" \
   --provided-contexts ProviderArn="arn:aws:iam::aws:contextProvider/IdentityCenter",ContextAssertion="value from sts:identity_context"
```

Ahora puede usar las credenciales recibidas de esta llamada para invocar la operación de la API `s3:GetDataAccess` y recibir las credenciales finales con acceso a sus recursos de S3.