Security Token Service (STS) impone más requisitos en la gestión de permisos que Resource Access Management (RAM). Si utiliza STS para otorgar permisos temporales sobre recursos a usuarios de RAM, debe seguir un procedimiento complejo.
Contexto
Los usuarios de RAM y los permisos que se les otorgan tienen validez permanente. Solo es posible eliminar manualmente a los usuarios de RAM o revocar sus permisos. Si la información de un usuario de RAM se filtra y no elimina dicho usuario ni revoca sus permisos, sus recursos e información de Alibaba Cloud quedan expuestos a riesgos. Por lo tanto, se recomienda utilizar STS para gestionar permisos críticos o aquellos que no requieren validez a largo plazo.
Figura 1. Procedimiento para otorgar permisos temporales a un usuario de RAM 
Paso 1: Crear un rol de RAM
Un rol de RAM es una entidad virtual que posee un conjunto de permisos.
Procedimiento
Inicie sesión en la consola de RAM como administrador de RAM.
En el panel de navegación izquierdo, seleccione .
En la página Roles, haga clic en Create Role.
-
En la página Create Role, establezca Principal Type en Cloud Account, especifique los detalles de la cuenta de Alibaba Cloud y luego haga clic en OK.
Current Account: Seleccione esta opción para permitir que todos los usuarios y roles de RAM bajo la cuenta actual de Alibaba Cloud asuman el rol. Seleccione Current Account.
Other Account: Seleccione esta opción para permitir que todos los usuarios y roles de RAM de otra cuenta de Alibaba Cloud asuman el rol. Seleccione Other Account e introduzca el ID de la otra cuenta de Alibaba Cloud (cuenta principal). Esta opción se utiliza principalmente para el acceso a recursos entre cuentas. Para obtener más información, consulte Access resources across Alibaba Cloud accounts.Puede encontrar el ID de su cuenta de Alibaba Cloud (cuenta principal) en la página Security Settings.
-
(Opcional) Para restringir el rol a usuarios o roles de RAM específicos, haga clic en Switch to Policy Editor para modificar la directiva de confianza.
El editor admite dos modos: Visual Editor y JSON Editor. En el siguiente ejemplo, el rol de RAM solo puede ser asumido por el usuario de RAM
Alicebajo la cuenta actual de Alibaba Cloud (AccountID=1000719).-
Visual Editor
En la sección Principal, agregue el usuario de RAM.
Haga clic en el enlace Edit junto a Cloud Account e introduzca el ID de la cuenta de confianza.
En el cuadro de diálogo Add Principal, seleccione Current Account para Cloud Account y RAM user para Identity Type. Introduzca el nombre de usuario objetivo, como Alice, en el campo User Name y luego haga clic en OK.
-
JSON Editor
En el campo
RAMdel objetoPrincipal, introduzca el ARN completo del usuario de RAM.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": { "RAM": "acs:ram::100******0719:user/Alice" }, "Action": "sts:AssumeRole" } ] }
-
En el cuadro de diálogo Create Role, introduzca un Role Name y luego haga clic en OK.
Paso 2: Crear una directiva de RAM
Una directiva de RAM define los permisos que desea otorgar a los roles para el acceso a recursos.
Inicie sesión en la consola de RAM como administrador de RAM.
En el panel de navegación izquierdo, seleccione .
En la página Policies, haga clic en Create Policy.
-
En la página Create Policy, haga clic en la pestaña JSON Editor.
La página muestra un editor JSON. La plantilla de directiva predeterminada incluye un elemento
Version(establecido en"1") y una matrizStatement. Cada declaración incluye los elementosEffect(valor predeterminado"Allow"),Action,ResourceyCondition. Debe completar los elementosActionyResource. -
Introduzca el contenido de la directiva.
Para obtener más información sobre la sintaxis y estructura de las directivas, consulte Policy syntax and structure.
El siguiente código de ejemplo muestra una directiva que define permisos de solo lectura sobre los recursos de IoT Platform:
{ "Version":"1", "Statement":[ { "Action":[ "rds:DescribeDBInstances", "rds:DescribeDatabases", "rds:DescribeAccounts", "rds:DescribeDBInstanceNetInfo" ], "Resource":"*", "Effect":"Allow" }, { "Action":"ram:ListRoles", "Effect":"Allow", "Resource":"*" }, { "Action":[ "mns:ListTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "dhs:ListProject", "dhs:ListTopic", "dhs:GetTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "ots:ListInstance", "ots:ListTable", "ots:DescribeTable" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "log:ListShards", "log:ListLogStores", "log:ListProject" ], "Resource":"*", "Effect":"Allow" }, { "Effect":"Allow", "Action":[ "iot:Query*", "iot:List*", "iot:Get*", "iot:BatchGet*" ], "Resource":"*" } ] }El siguiente código de ejemplo muestra una directiva que define permisos de lectura y escritura sobre los recursos de IoT Platform:
{ "Version":"1", "Statement":[ { "Action":[ "rds:DescribeDBInstances", "rds:DescribeDatabases", "rds:DescribeAccounts", "rds:DescribeDBInstanceNetInfo" ], "Resource":"*", "Effect":"Allow" }, { "Action":"ram:ListRoles", "Effect":"Allow", "Resource":"*" }, { "Action":[ "mns:ListTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "dhs:ListProject", "dhs:ListTopic", "dhs:GetTopic" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "ots:ListInstance", "ots:ListTable", "ots:DescribeTable" ], "Resource":"*", "Effect":"Allow" }, { "Action":[ "log:ListShards", "log:ListLogStores", "log:ListProject" ], "Resource":"*", "Effect":"Allow" }, { "Effect":"Allow", "Action":"iot:*", "Resource":"*" } ] }
Una vez creada la directiva, puede adjuntarla a un rol de RAM. De este modo, los permisos definidos en dicha directiva se otorgan al rol de RAM.
Paso 3: Autorizar un rol de RAM
Solo los roles de RAM autorizados pueden acceder a los recursos. Para autorizar un único rol de RAM, haga clic en Add Permissions en la columna Actions del rol de RAM correspondiente en la página Roles de la consola de RAM. Para obtener más información, consulte Grant permissions to a RAM role. Para autorizar varios roles de RAM simultáneamente, realice los siguientes pasos:
Después de autorizar los roles de RAM, puede otorgar a un usuario de RAM los permisos necesarios para asumir dichos roles.
Paso 4: Otorgar a un usuario de RAM permisos para asumir un rol de RAM
Cuando se adjunta una directiva a un rol de RAM, este obtiene los permisos definidos en ella. Sin embargo, un rol de RAM es únicamente una identidad virtual. El rol de RAM solo puede utilizarse para realizar las operaciones permitidas después de que un usuario de RAM lo asuma. Si todos los usuarios de RAM pudieran asumir un rol de RAM, podrían existir riesgos de seguridad. Para prevenir estos riesgos, solo los usuarios de RAM autorizados pueden asumir roles de RAM.
Para autorizar a un usuario de RAM a asumir un rol de RAM, cree una directiva personalizada en la que el valor del parámetro Resource se establezca en el ID del rol de RAM. A continuación, utilice esta directiva para autorizar al usuario de RAM.
Inicie sesión en la consola de RAM como administrador de RAM.
En el panel de navegación izquierdo, seleccione .
En la página Policies, haga clic en Create Policy.
-
En la página Create Policy, haga clic en la pestaña JSON Editor.
La página muestra un editor JSON. La plantilla de directiva predeterminada incluye un elemento
Version(establecido en"1") y una matrizStatement. Cada declaración incluye los elementosEffect(valor predeterminado"Allow"),Action,ResourceyCondition. Debe completar los elementosActionyResource. -
Introduzca el contenido de la directiva.
NotaEn la declaración de la directiva, establezca el valor del elemento Resource en el Alibaba Cloud Resource Name (ARN) de un rol de RAM. Para ver el ARN de un rol de RAM, vaya a la página Roles y haga clic en el nombre del rol de RAM. Puede consultar el ARN del rol de RAM en la sección Basic Information.
Ejemplo:
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":"iot:QueryProduct", "Resource":"ARN of a RAM role" } ] } -
Una vez creada la directiva, regrese a la página principal de la RAM console.
En el panel de navegación izquierdo, seleccione .
En la lista de usuarios de RAM, seleccione el usuario de RAM que desea autorizar y haga clic en Add Permissions debajo de la lista de usuarios de RAM.
En el panel Add Permissions, seleccione la directiva creada y haga clic en OK.
Una vez completada la autorización, el usuario de RAM obtiene los permisos para asumir un rol de RAM específico. Posteriormente, puede utilizar STS para obtener las credenciales de identidad temporales necesarias para acceder a los recursos.
Paso 5: Obtener credenciales de identidad temporales para un usuario de RAM
Los usuarios de RAM autorizados pueden llamar a las operaciones de la API de STS o utilizar los SDK de STS para obtener las credenciales de identidad temporales. Estas credenciales incluyen un AccessKey ID, un AccessKey secret y un token de seguridad. Para obtener más información sobre la API de STS y los SDK de STS, consulte STS API reference y STS SDK reference.
Los siguientes parámetros son obligatorios al utilizar la API o el SDK de STS para obtener credenciales de identidad temporales:
RoleArn: el ARN del rol de RAM que el usuario de RAM desea asumir.
RoleSessionName: el nombre de las credenciales de identidad temporales. Este es un parámetro personalizado.
Policy: la directiva que especifica los permisos otorgados al usuario de RAM. Este parámetro se utiliza para generar un token con permisos limitados del rol de RAM. Si no establece este parámetro, se devuelve un token con todos los permisos del rol de RAM.
DurationSeconds: el periodo de validez de las credenciales de identidad temporales. Este parámetro se mide en segundos. El valor predeterminado es 3600 y el rango de valores va de 900 a 3600.
id y secret: el AccessKey ID y el AccessKey secret del usuario de RAM que desea asumir el rol de RAM.
Los siguientes ejemplos muestran cómo obtener credenciales de identidad temporales.
Ejemplo de uso de la API: El usuario de RAM llama a la operación AssumeRole de STS para obtener las credenciales de identidad temporales.
https://sts.aliyuncs.com?Action=AssumeRole
&RoleArn=acs:ram::1234567890123456:role/iotstsrole
&RoleSessionName=iotreadonlyrole
&DurationSeconds=3600
&Policy=<url_encoded_policy>
&<Common request parameters>
Ejemplo de uso del SDK: El usuario de RAM utiliza la interfaz de línea de comandos (CLI) de Python para STS con el fin de obtener las credenciales de identidad temporales.
$python ./sts.py AssumeRole RoleArn=acs:ram::1234567890123456:role/iotstsrole RoleSessionName=iotreadonlyrole Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":"iot:*","Resource":"*"}]}' DurationSeconds=3600 --id=id --secret=secret
Si la solicitud se realiza correctamente, se devuelven las credenciales de identidad temporales. Las credenciales incluyen un AccessKey ID, un AccessKey secret y un token de seguridad.
Paso 6: Acceder a recursos como usuario de RAM
Una vez que un usuario de RAM obtiene las credenciales de identidad temporales, puede incluirlas en las solicitudes del SDK para asumir el rol de RAM específico.
El siguiente código de ejemplo muestra cómo un usuario de RAM utiliza el SDK de STS para Java con el fin de asumir un rol de RAM. El usuario de RAM incluye el AccessKey ID, el AccessKey secret y el token de seguridad en la solicitud, y crea el objeto IAcsClient.
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", AccessKeyId,AccessKeySecret);
RpcAcsRequest request.putQueryParameter("SecurityToken", Token);
IAcsClient client = new DefaultAcsClient(profile);
AcsResponse response = client.getAcsResponse(request);