Concesión de acceso entre los servicios
Utilice IBM Cloud® Identity and Access Management (IAM) para crear o eliminar una autorización que otorgue a un servicio acceso a otro servicio. Utilice la delegación de autorización para crear automáticamente políticas de acceso que otorguen acceso a servicios dependientes.
Muchas de las capacidades de IAM se centran en gestionar y hacer cumplir el acceso de usuarios y aplicaciones a los recursos de IBM Cloud. Sin embargo, es posible que encuentre otros casos de ejemplo en los que necesite proporcionar un servicio con acceso al recurso de un usuario en otro servicio. Este tipo de acceso se denomina autorización.
En una autorización, el servicio de origen es el servicio al que se otorga acceso al servicio de destino. Los roles que seleccione definen el nivel de acceso para el servicio de origen. El servicio de destino es el servicio al que otorga permiso para que acceda el servicio de origen en función de los roles que asigne. Un servicio de origen puede estar en la misma cuenta en la que se ha creado la autorización o en otra cuenta. El servicio de destino siempre está en la cuenta donde se crea la autorización. Puede ver si el servicio de origen se encuentra en la cuenta actual o en otra cuenta visualizando la columna de cuenta de origen para la autorización específica en la página Autorizaciones de la consola de IBM Cloud®.
Autorización de servicios a personas dependientes
En algunos casos, puede autorizar a servicios dependientes, además de al servicio de origen. El servicio de origen al que se permite acceder al servicio de destino depende de otro servicio. Se debe asignar acceso al servicio dependiente para completar el flujo de trabajo. El siguiente diagrama ilustra el proceso de delegación de acceso entre los servicios de origen, destino y dependientes:
Para obtener más información sobre las funciones, consulte Funciones de acceso al servicio.
El siguiente ejemplo explica cómo funciona la relación entre los servicios de origen, destino y dependientes. Supongamos que tiene un servicio IBM Watson® que depende de una instancia de IBM Cloud Object Storage para almacenar datos. Cuando habilita una autorización entre el servicio IBM Watson y el servicio IBM® Key Protect, es posible que necesite que la instancia de Object Storage acceda a una clave en la instancia de Key Protect del usuario. Por lo tanto, aunque la autorización está entre el servicio de IBM Watson y el servicio de Key Protect, el servicio de Object Storage también tiene acceso como servicio dependiente del servicio de IBM Watson. Si selecciona la opción de habilitar autorizaciones para servicios dependientes, no es necesario que realice ninguna acción adicional porque se crean políticas automáticamente para los servicios dependientes.
Los servicios dependientes del servicio de origen pueden estar en la cuenta del servicio de origen, lo que significa que no resultan visibles para el usuario en su cuenta. Sin embargo, las políticas de acceso creadas por el servicio de origen para sus servicios dependientes siempre resultan visibles para el usuario. Puede saber las autorizaciones que ha creado un usuario o el servicio de origen que se crea consultando la columna Tipo de la autorización específica en la página Autorizaciones.
Creación de una autorización en la consola
Debe tener acceso al servicio de destino para poder crear una autorización entre servicios. Solo puede otorgar el nivel de acceso que tenga como usuario del servicio de destino. Por ejemplo, si tiene acceso de visor sobre el servicio de destino, solo puede asignar el rol de visor para la autorización.
-
En la consola de IBM Cloud, pulse Gestionar > Acceso (IAM) y seleccione Autorizaciones.
-
Pulse Crear.
-
Seleccione una cuenta de origen.
- Si el origen que necesita acceso al destino está en esta cuenta, seleccione Esta cuenta.
- Si el origen que necesita acceso al destino está en una cuenta diferente, seleccione Otra cuenta. A continuación, especifique el ID de cuenta de la cuenta de origen.
-
Seleccione el servicio o servicios a los que necesita acceder.
- Puede seleccionar un servicio individual y especificar si desea que la fuente incluya todos los recursos, instancias sólo en un determinado grupo de recursos o sólo una instancia específica en la cuenta.
- Nuevo También puede seleccionar Todos los servicios habilitados de Identidad y Acceso y seleccionar o introducir un ID de grupo de recursos.
Nuevo Introducir un grupo de recursos como origen da acceso a las instancias de servicio de un grupo de recursos al recurso de destino de su cuenta. Puede que quieras configurar este nivel de acceso si no quieres dar acceso directo a un recurso.
-
Selecciona un objetivo.
-
Especifique si desea que el destino incluya todos los recursos o recursos específicos. Si elige recursos específicos como destino, puede añadir atributos para delimitar aún más el acceso. El tipo de atributos depende del servicio de destino que haya seleccionado.
-
(Opcional) Seleccione Permitir que la autorización sea delegada por los servicios de origen y dependientes para permitir que el servicio de origen delegue su acceso a cualquier servicio dependiente. Esta opción solo se muestra si el servicio de origen tiene servicios dependientes. Si selecciona esta opción, el servicio de origen crea políticas automáticamente para los servicios dependientes.
-
Seleccione un rol para asignar acceso al servicio de origen que accede al servicio de destino.
-
Pulse Autorizar.
Si crea una autorización entre un servicio de otra cuenta y un servicio de destino de su cuenta actual, sólo necesitará acceso al recurso de destino. Para la cuenta de origen, solo necesita el número de cuenta.
Creación de una autorización utilizando la CLI
Para autorizar a un servicio de origen a acceder a un servicio de destino, ejecute el mandato ibmcloud iam authorization-policy-create.
El ejemplo siguiente utiliza datos simulados para crear una política en la que una instancia de servicio de origen específica de IBM Cloud Object Storage está autorizada para acceder a una instancia de servicio de destino específica de IBM Key Protect:
ibmcloud iam authorization-policy-create cloud-object-storage kms Reader --source-service-instance-id 123123 --target-service-instance-id 456456
Para obtener más información sobre todos los parámetros que están disponibles para este mandato, consulte ibmcloud iam authorization-policy-create.
Creación de una autorización utilizando Terraform
Debe tener acceso al servicio de destino para poder crear una autorización entre servicios. Solo puede otorgar el nivel de acceso que tenga como usuario del servicio de destino. Por ejemplo, si tiene acceso de visor sobre el servicio de destino, solo puede asignar el rol de visor para la autorización.
Antes de poder crear una autorización mediante Terraform, asegúrese de haber completado lo siguiente:
- Instale Terraform CLI y configure el complemento IBM Cloud Provider para Terraform. Para más información, consulte el tutorial de Introducción a Terraform en IBM Cloud®. El plug-in abstrae las API de IBM Cloud que se utilizan para completar esta tarea.
- Cree un archivo de configuración de Terraform denominado
main.tf. En este archivo se definen los recursos utilizando el lenguaje de configuración HashiCorp. Para más información, consulte la documentación de Terraform.
Siga los siguientes pasos para crear una autorización mediante Terraform:
-
Cree una política de autorización entre servicios utilizando el argumento de recurso
ibm_iam_authorization_policyen su archivomain.tf.El siguiente ejemplo crea una autorización entre servicios:
resource "ibm_iam_authorization_policy" "policy" { source_service_name = "cloud-object-storage" target_service_name = "kms" roles = ["Reader"] description = "Authorization Policy" transaction_id = "terraformAuthorizationPolicy" }El recurso
ibm_iam_authorization_policyrequiere el servicio de origen, el servicio de destino y el rol. El servicio de origen tiene acceso al servicio de destino, y el rol es el nivel de permiso que permite el acceso. Opcionalmente, puede añadir una descripción para la autorización y un ID de transacción.Para más ejemplos, consulte la documentación de Terraform para recursos de autorización.
-
Después de terminar de crear el archivo de configuración, inicializa Terraform CLI. Para más información, consulte Inicializar directorios de trabajo.
terraform init -
Aprovisione los recursos desde el archivo
main.tf. Para obtener más información, consulte Aprovisionamiento de infraestructura con Terraform.-
Ejecute
terraform planpara generar un plan de ejecución Terraform para previsualizar las acciones propuestas.terraform plan -
Ejecute
terraform applypara crear los recursos definidos en el plan.terraform apply
-
Creación de una autorización utilizando la API
Para autorizar a un servicio de origen a acceder a un servicio de destino, utilice la API de gestión de políticas de IAM. Consulte el siguiente ejemplo de API para crear un método de
política con type=authorization especificado.
Los atributos admitidos para crear una política de autorización dependen de lo que admite cada servicio. Para obtener más información sobre los atributos admitidos para cada servicio, consulte la documentación de los servicios que esté utilizando.
curl --request POST \
--url https://iam.cloud.ibm.com/v1/policies \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"type": "authorization",
"subjects": [
{
"attributes": [
{
"name": "accountId",
"value": "<account-id>"
},
{
"name": "serviceName",
"value": "<service-name>"
},
{
"name": "serviceInstance",
"value": "<instance-id>"
}
]
}
],
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Reader"
}
],
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "<account-id>"
},
{
"name": "serviceName",
"value": "<service-name>"
},
{
"name": "serviceInstance",
"value": "<instance-id>"
},
{
"name": "resourceType",
"value": "<resource-type>"
},
{
"name": "resource",
"value": "<id>"
}
]
}
]
}'
SubjectAttribute accountSubjectAttribute = new SubjectAttribute.Builder()
.name("accountId")
.value(exampleAccountId)
.build();
SubjectAttribute serviceNameSubjectAttribute = new SubjectAttribute.Builder()
.name("serviceName")
.value(exampleSourceServiceName)
.build();
SubjectAttribute serviceInstanceSubjectAttribute = new SubjectAttribute.Builder()
.name("serviceInstance")
.value(exampleSourceServiceInstanceId)
.build();
PolicySubject policySubjects = new PolicySubject.Builder()
.addAttributes(accountSubjectAttribute)
.addAttributes(serviceNameSubjectAttribute)
.addAttributes(serviceInstanceSubjectAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:iam::::serviceRole:Reader")
.build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
.name("accountId")
.value(exampleAccountId)
.operator("stringEquals")
.build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
.name("serviceName")
.value(exampleTargetServiceName)
.operator("stringEquals")
.build();
ResourceAttribute serviceInstanceResourceAttribute = new ResourceAttribute.Builder()
.name("serviceInstance")
.value(exampleTargetInstanceId)
.operator("stringEquals")
.build();
ResourceAttribute resourceTypeResourceAttribute = new ResourceAttribute.Builder()
.name("resourceType")
.value(exampleResourceType)
.operator("stringEquals")
.build();
ResourceAttribute resourceResourceAttribute = new ResourceAttribute.Builder()
.name("resource")
.value(exampleResourceId)
.operator("stringEquals")
.build();
PolicyResource policyResources = new PolicyResource.Builder()
.addAttributes(accountIdResourceAttribute)
.addAttributes(serviceNameResourceAttribute)
.addAttributes(serviceInstanceResourceAttribute)
.addAttributes(resourceTypeResourceAttribute)
.addAttributes(resourceResourceAttribute)
.build();
CreatePolicyOptions options = new CreatePolicyOptions.Builder()
.type("authorization")
.subjects(Arrays.asList(policySubjects))
.roles(Arrays.asList(policyRoles))
.resources(Arrays.asList(policyResources))
.build();
Response<Policy> response = service.createPolicy(options).execute();
Policy policy = response.getResult();
System.out.println(policy);
const policySubjects = [
{
attributes: [
{
name: 'accountId',
value: exampleAccounId,
},
{
name: 'serviceName',
value: exampleSourceServiceName,
},
{
name: 'serviceInstance',
value: exampleSourceServiceInstaceId,
},
],
},
];
const policyRoles = [
{
role_id: 'crn:v1:bluemix:public:iam::::serviceRole:Reader',
},
];
const accountIdResourceAttribute = {
name: 'accountId',
value: exampleAccountId,
operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
name: 'serviceName',
value: exampleTargetServiceName,
operator: 'stringEquals',
};
const serviceInstanceResourceAttribute = {
name: 'serviceInstance',
value: exampleTargetServiceInstanceId,
operator: 'stringEquals',
};
const resourceTypeResourceAttribute = {
name: 'resourceType',
value: exampleResourceType,
operator: 'stringEquals',
};
const resourceResourceAttribute = {
name: 'resource',
value: exampleResourceId,
operator: 'stringEquals',
};
const policyResources = [
{
attributes: [
accountIdResourceAttribute,
serviceNameResourceAttribute,
serviceInstanceResourceAttribute,
resourceTypeResourceAttribute,
resourceResourceAttribute,
],
},
];
const params = {
type: 'authorization',
subjects: policySubjects,
roles: policyRoles,
resources: policyResources,
};
iamPolicyManagementService.createPolicy(params)
.then(res => {
examplePolicyId = res.result.id;
console.log(JSON.stringify(res.result, null, 2));
})
.catch(err => {
console.warn(err)
});
policy_subjects = PolicySubject(
attributes=[SubjectAttribute(name='accountId', value=example_account_id),
SubjectAttribute(name='serviceName', value=example_source_service_name),
SubjectAttribute(name='serviceInstance', value=example_source_service_instance_id)])
policy_roles = PolicyRole(
role_id='crn:v1:bluemix:public:iam::::serviceRole:Reader')
account_id_resource_attribute = ResourceAttribute(
name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
name='serviceName', value=example_target_service_name)
service_instance_resource_attribute = ResourceAttribute(
name='serviceInstance', value=example_target_service_instance_id)
resource_type_resource_attribute = ResourceAttribute(
name='resourceType', value=example_resource_type)
resource_resource_attribute = ResourceAttribute(
name='resource', value=example_resource_id)
policy_resources = PolicyResource(
attributes=[account_id_resource_attribute,
service_name_resource_attribute,
service_instance_resource_attribute,
resource_type_resource_attribute,
resource_resource_attribute])
policy = iam_policy_management_service.create_policy(
type='authorization',
subjects=[policy_subjects],
roles=[policy_roles],
resources=[policy_resources]
).get_result()
print(json.dumps(policy, indent=2))
accountSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("accountId"),
Value: &exampleAccountID,
}
serviceNameSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("serviceName"),
Value: &exampleSourceServiceName,
}
serviceInstanceSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("serviceInstance"),
Value: &exampleSourceServiceInstanceId,
}
policySubjects := &iampolicymanagementv1.PolicySubject{
Attributes: []iampolicymanagementv1.SubjectAttribute{*accountSubjectAttribute,
*serviceNameSubjectAttribute, *serviceInstanceSubjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::serviceRole:Reader"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("accountId"),
Value: core.StringPtr(exampleAccountID),
Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("serviceName"),
Value: core.StringPtr(exampleTargetServiceName),
Operator: core.StringPtr("stringEquals"),
}
serviceInstanceResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("serviceInstance"),
Value: core.StringPtr(exampleTargetServiceInstanceId),
Operator: core.StringPtr("stringEquals"),
}
resourceTypeResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("resourceType"),
Value: core.StringPtr(exampleResourceType),
Operator: core.StringPtr("stringEquals"),
}
resourceResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("resource"),
Value: core.StringPtr(exampleResourceId),
Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
Attributes: []iampolicymanagementv1.ResourceAttribute{
*accountIDResourceAttribute, *serviceNameResourceAttribute,
*serviceInstanceResourceAttribute, *resourceTypeResourceAttribute,
*resourceResourceAttribute},
}
options := iamPolicyManagementService.NewCreatePolicyOptions(
"authorization",
[]iampolicymanagementv1.PolicySubject{*policySubjects},
[]iampolicymanagementv1.PolicyRole{*policyRoles},
[]iampolicymanagementv1.PolicyResource{*policyResources},
)
policy, response, err := iamPolicyManagementService.CreatePolicy(options)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(policy, "", " ")
fmt.Println(string(b))
No todos los servicios admiten políticas a nivel resourceType y resource individual. Algunos ejemplos de servicios que no admiten estos atributos son IBM Cloud Object Storage y IBM Key Protect, donde los grupos y las
claves son del tipo de recurso y se lista el ID para especificar el recurso específico.
Creación de autorizaciones que utilizan resource-group como resourceType
Para crear una autorización que utilice resource-group como origen o destino, utilice la API de gestión de políticas de IAM.
resource-group como fuente
Consulte el siguiente ejemplo de API para Crear un método de política con la dirección resource-group especificada como origen.
{
"type": "authorization",
"subjects": [
{
"attributes": [
{
"name": "resourceGroupId",
"value": "<rgId>"
},
{
"name": "accountId",
"value": "<sourceAccountId>"
}
]
}
],
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
}
],
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "<targetAccountId>"
},
{
"name": "serviceName",
"value": "<targetService>"
},
{
"name": "serviceInstance",
"value": "<targetServiceInstance>"
}
]
}
]
}
resource-group como objetivo
Consulte el siguiente ejemplo de API para Crear un método de política con la dirección resource-group especificada como destino.
{
"type": "authorization",
"subjects": [
{
"attributes": [
{
"name": "accountId",
"value": "<sourceAccountId>"
},
{
"name": "serviceName",
"value": "<sourceService>"
},
{
"name": "serviceInstance",
"value": "<sourceServiceInstance>"
}
]
}
],
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
}
],
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "<targetAccountId>"
},
{
"name": "resourceType",
"value": "resource-group"
}
]
}
]
}
Eliminación de una autorización en la consola
Puede eliminar cualquier autorización entre servicios de la cuenta si tiene asignado el rol de Administrador sobre el servicio de destino. Si elimina cualquier política de acceso creada por el servicio de origen para sus servicios dependientes, el servicio de origen no puede completar el flujo de trabajo ni acceder al servicio de destino.
- En la consola de IBM Cloud, pulse Gestionar > Acceso (IAM) y seleccione Autorizaciones.
- Identifique la fila de la autorización que desea eliminar de la cuenta.
- Pulse el icono Acciones
> Eliminar.
- Seleccione Eliminar.
Si el servicio de origen se elimina de la cuenta, cualquier política creada por el servicio para sus servicios dependientes se suprime automáticamente. Paralelamente, si el servicio dependiente se elimina de la cuenta, también se suprime cualquier política de acceso que se haya delegado a dicho servicio.
Eliminación de una autorización mediante la CLI
Puede eliminar cualquier autorización entre servicios de la cuenta si tiene asignado el rol de Administrador sobre el servicio de destino. Si elimina cualquier política de acceso creada por el servicio de origen para sus servicios dependientes, el servicio de origen no puede completar el flujo de trabajo ni acceder al servicio de destino.
Para autorizar a un servicio de origen a acceder a un servicio de destino, ejecute el mandato ibmcloud iam authorization-policy-create.
El ejemplo siguiente suprime una política de autorización:
ibmcloud iam authorization-policy-delete 12345678-abcd-1a2b-a1b2-1234567890ab
Para obtener más información sobre todos los parámetros que están disponibles para este mandato, consulte ibmcloud iam authorization-policy-delete.
Si el servicio de origen se elimina de la cuenta, cualquier política creada por el servicio para sus servicios dependientes se suprime automáticamente. Paralelamente, si el servicio dependiente se elimina de la cuenta, también se suprime cualquier política de acceso que se haya delegado a dicho servicio.
Eliminación de una autorización mediante la API
Puede eliminar cualquier autorización entre servicios de la cuenta si tiene asignado el rol de Administrador sobre el servicio de destino. Si elimina cualquier política de acceso creada por el servicio de origen para sus servicios dependientes, el servicio de origen no puede completar el flujo de trabajo ni acceder al servicio de destino.
Para suprimir una política de autorización, utilice la API de gestión de políticas de IAM como en la siguiente solicitud de ejemplo:
curl -X DELETE 'https://iam.cloud.ibm.com/v1/policies/$POLICY_ID' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json'
DeletePolicyOptions options = new DeletePolicyOptions.Builder()
.policyId(examplePolicyId)
.build();
service.deletePolicy(options).execute();
const params = {
policyId: examplePolicyId,
};
iamPolicyManagementService.deletePolicy(params)
.then(res => {
console.log(JSON.stringify(res, null, 2));
})
.catch(err => {
console.warn(err)
});
response = iam_policy_management_service.delete_policy(
policy_id=example_policy_id
).get_result()
print(json.dumps(response, indent=2))
options := iamPolicyManagementService.NewDeletePolicyOptions(
examplePolicyID,
)
response, err := iamPolicyManagementService.DeletePolicy(options)
if err != nil {
panic(err)
}
Si el servicio de origen se elimina de la cuenta, cualquier política creada por el servicio para sus servicios dependientes se suprime automáticamente. Paralelamente, si el servicio dependiente se elimina de la cuenta, también se suprime cualquier política de acceso que se haya delegado a dicho servicio.
Eliminación de una autorización mediante Terraform
Si desea eliminar una autorización mediante Terraform, debe eliminar el argumento del archivo main.tf. Después de eliminar el argumento, aprovisione su archivo siguiendo los siguientes pasos:
-
Ejecute
terraform planpara generar un plan de ejecución Terraform para previsualizar las acciones propuestas.terraform plan -
Ejecute
terraform applypara crear los recursos definidos en el plan.terraform apply