联合用户和工作负载的可信配置文件
无需管理凭证即可授予访问权限 在计算资源中为具有 SAML 属性或工作负载身份的联合用户使用受信任的配置文件。
您可以使用受信任的配置文件授权不同的 IBM Cloud® 身份访问您账户中的资源。 根据 SAML 企业目录中的属性,自动授予联合用户访问账户的条件。 或者,使用可信配置文件为在计算资源中运行的应用程序设置细粒度授权。 这样,您就无需为计算资源创建服务 ID 或 API 密钥。 您还可以与 IBM Cloud 服务或另一个账户中的服务 ID 建立信任关系,以授予跨账户访问权限。
用户不需要是账户成员就可以使用受信任配置文件。 如果用户的身份供应商 ( IdP ) 与信任条件中使用的 IdP 匹配,用户就可以使用该配置文件。
最初创建受信任配置文件时,可以与以下实体类型建立信任条件:联合用户、计算资源、服务 ID 或 IBM Cloud 服务。 创建受信任的配置文件后,您可以添加更多条件,在同一配置文件中组合多个实体类型。
您可以使用 Activity Tracker 监控哪些联合用户计算资源、服务 ID 和 IBM Cloud 服务应用了可信配置文件。 有关详细信息,请参阅 监控受信任配置文件的登录会话。
准备工作
如果您有以下权限,就可以创建受信任的配置文件:
- 帐户所有者
- 所有账户管理服务的管理员角色
- IAM Identity Service 上的管理员角色。 更多信息,请参阅 IAM 身份服务。
在控制台中与联合用户建立信任关系
完成以下步骤,定义哪些联合用户可以访问特定资源:
-
在 IBM Cloud 控制台中,单击管理 > 访问 (IAM),然后选择受信任的配置文件。
-
单击创建。
-
通过提供姓名、电子邮件和描述来描述您的个人资料,然后单击“继续”。
在电子邮件中,您可以添加个人电子邮件 ID 或分发列表。
在描述中,提供此受信任配置文件的可用操作列表。
-
您可以选择稍后决定,在添加详细信息之前创建受信任的配置文件。 或者,通过完成以下步骤建立信任:
-
从列表中选择联合用户作为受信任实体类型。
-
选择 IBMid 联合的用户或 IBM Cloud 联合的用户 App ID 作为身份验证方法,并输入在步骤 1 中启用的默认身份供应商 ( IdP )。
如果要创建受信任的配置文件的用户使用 IBM Cloud App ID,则将受信任的配置文件创建为 App ID 用户,同样,也将受信任的配置文件创建为 IBMid 用户。 这样,您自己的 SAML 属性就能让您知道如何构建受信任的配置文件条件。 拥有相同 IdP 的其他用户可以拥有不同的 SAML 属性。 仅将自己的属性作为提示。 若要在索赔中使用与自己不同的属性,请手动输入。 {: tip}
- 选择“由 IBMid 联合的用户”、“由 IBM Cloud 联合的用户 App ID”或“由 IBM Cloud 联合的用户 SAML”作为身份验证方法,并输入在步骤 1 中启用的默认身份供应商 ( IdP )。
-
根据 IdP 数据添加条件,定义联合用户应用配置文件的方式和时间。
- 点击添加条件,可以定义多个条件。 联邦用户必须满足所有条件,才能被纳入受信任配置文件。 有关用于创建条件的字段的更多信息,请参阅 IAM 条件属性。
- 单击“查看身份提供者 ( IdP ) 数据”,从 IdP 中搜索个人数据中的属性名和值。 如需了解更多信息,请参阅 使用 IdP 数据建立可信档案。
-
定义会话持续时间,即用户可以在多长时间内应用配置文件,然后必须重新进行身份验证。
-
-
单击继续。
-
(可选) 为受信任配置文件分配访问权限。
-
或者,单击“创建”,不分配任何访问权限。
有关用于为受信任配置文件创建条件的字段的更多信息,请参阅 IAM 条件属性。
与控制台中的计算资源建立信任关系
完成以下步骤,设置更好的计算资源访问权限控制。
IBM Cloud Kubernetes Service 仅支持 1.21 及更新版本的受信任配置文件。 免费的 IBM Cloud Kubernetes Service 集群只创建早期版本。 您可以选择使用标准计划的早期版本创建群集,因此请务必选择 1.21 或更新版本。
-
在 IBM Cloud 控制台中,单击管理 > 访问 (IAM),然后选择受信任的配置文件。
-
单击创建个人资料。
-
通过提供名称和描述来描述您的个人资料,然后单击“继续”。
-
您可以选择稍后决定,在添加详细信息之前创建受信任的配置文件。 或者,通过完成以下步骤建立信任:
-
选择计算资源,然后从列表中选择计算服务类型。
-
如果选择“所有服务资源”选项,则可以定义多个条件,通过单击“添加条件”过滤所选计算 服务类型的资源。 这些条件基于资源类别或位置等属性,适用于所有现有和未来资源。 资源必须满足所有条件才能纳入受信任配置文件。
您输入的 Kubernetes 命名空间和服务帐户名不必已经存在。 今后任何使用这些名称的命名空间或服务账户都可以建立信任。 要列出现有命名空间,请登录群集并运行
kubectl get ns。 要列出现有服务帐户,请登录群集并运行kubectl get sa -n <namespace>。 您也可以同时输入default。 -
如果选择“特定资源”,则可以无条件地直接与一个或多个现有计算资源实例建立信任。 例如,Kubernetes 集群。
-
-
单击继续。
-
(可选) 为受信任配置文件分配访问权限。
-
或者,单击“创建”,不分配任何访问权限。
有关用于为受信任配置文件创建条件的字段的更多信息,请参阅 IAM 条件属性。
在控制台中与 IBM Cloud 服务建立信任关系
您账户或其他账户中的 IBM Cloud 服务可能需要令牌才能在您的账户中运行操作。
- 示例 1
- 另一个账户中的项目服务实例可以使用受信任配置文件,在您的账户中安全部署架构,而无需进行密钥轮换。 有关更多信息,请参阅 使用可信配置文件授权项目部署体系结构。
- 示例 2
- 私有目录是由 CRN 标识的目录管理服务实例。 您可能希望在一个独立于包含您的目录的账户中验证您的私人目录中的产品。 您可以通过在目标账户中创建受信任配置文件,授予私有目录在目标账户中创建资源以进行验证的权限。 然后,使用目录 CRN 将服务实例链接到受信任的配置文件,从而与目录建立信任关系。 有关更多信息,请参阅 将软件加入专用目录。
使用受信任的配置文件跨账户共享资源只适用于有限的服务,并不是跨账户访问服务的通用方法。
完成以下步骤,定义 IBM Cloud 服务如何访问账户中的特定资源:
-
向服务管理员询问唯一标识服务实例的云资源名称 (CRN)。 CRN 用于授权操作。
服务管理员可以通过导航菜单图标
> 资源列表,并单击目标服务的名称来查找 CRN。 在详细信息部分,复制 CRN。 对于私有目录 CRN,转到管理 > 目录 > 私有目录,然后选择私有目录。 单击操作... > 编辑目录详细信息,找到目录 CRN。
-
在 IBM Cloud 控制台中,单击管理 > 访问 (IAM),然后选择受信任的配置文件。
-
单击创建个人资料。
-
通过提供名称和描述来定义您的个人资料,然后单击“继续”。
在描述中,提供受信任配置文件可用的操作列表。
-
您可以选择稍后决定,在添加详细信息之前创建受信任的配置文件。 或者,通过完成以下步骤建立信任:
- 选择 IBM Cloud® 服务。
- 输入服务管理员提供给您的 CRN。
IBM Cloud 服务是静态身份,不使用建立信任的条件。 相反,您可以使用 CRN 与受信任实体建立直接链接,从而建立信任。
-
单击继续。
-
(可选) 为受信任配置文件分配访问权限。
-
或者,单击“创建”,不分配任何访问权限。
通过控制台中的服务 ID 建立信任
您可以使用受信任的配置文件为服务 ID 提供跨账户访问权限和对传统基础架构服务的访问权限。 要让一个账户中的服务 ID 可以访问目标账户,请在目标账户中创建受信任配置文件。 完成以下步骤,定义服务 ID 如何访问账户中的特定资源:
-
向另一个账户的管理员询问标识服务 ID 的服务 ID 值。
管理员可以通过 管理 > 访问 (IAM) > 服务标识,并选择要针对的服务 ID 来查找服务 ID 值。 单击详细信息,然后复制以
ServiceId开头的 ID。 -
在 IBM Cloud 控制台中,单击管理 > 访问 (IAM),然后选择受信任的配置文件。
-
单击创建个人资料。
-
通过提供名称和描述来定义您的个人资料,然后单击“继续”。
在描述中,提供可用于此受信任配置文件的操作列表。
-
您可以选择稍后决定,在添加详细信息之前创建受信任的配置文件。 或者,通过完成以下步骤建立信任:
- 选择服务 ID
- 输入管理员提供给您的服务 ID 值。
-
单击继续。
-
(可选) 为受信任配置文件分配访问权限。
-
或者,单击“创建”,不分配任何访问权限。
服务 ID 是静态身份,不使用建立信任的条件。 相反,您可以使用服务 ID 元数据中的 ID 值与受信任实体建立直接链接,从而建立信任。
为受信任配置文件分配访问权限
与联合用户、计算资源、IBM Cloud 服务或服务 ID 建立信任关系后,就可以分配访问权限。
只有当您的帐户与 Softlayer 帐户相链接时,才能分配经典基础架构访问权限。
- 分配访问权限。
- 将受信任配置文件添加到一个或多个访问组中,为其分配访问权限。 这样,你就可以使用已创建的访问组中存在的策略。
- 选择访问组,然后选择要添加受信任配置文件的所有组。 您只能将用户分配到您有权管理的访问组。
- 单击添加。
- 使用访问策略为受信任配置文件分配访问权限。
- 选择访问策略。 根据您的访问级别,您可以分配 IAM 策略和传统基础架构权限。
- 选择单个服务或一组服务,如所有启用身份和访问的服务、所有账户管理服务或所有 IAM 账户管理服务。 然后,单击下一步。
- 根据所选属性确定访问所有资源或特定资源的范围。 然后,单击下一步。
- 选择角色和权限的任意组合以定义访问范围,然后单击“审查”。
- 单击添加,将策略配置添加到摘要中。
- 您可以通过选择用户、设备或服务,然后任意组合细粒度权限,来分配经典基础架构的访问权限。
- 将受信任配置文件添加到一个或多个访问组中,为其分配访问权限。 这样,你就可以使用已创建的访问组中存在的策略。
- 单击创建。
定制控制台体验
作为受信任配置文件管理员,您可以为应用受信任配置文件的用户自定义 IBM Cloud 控制台横幅中显示的导航项目。 这项功能可以隐藏用户不需要访问的导航元素,并防止用户探索缺乏权限的区域,从而帮助简化控制台体验。
要自定义受信任配置文件的控制台导航,请完成以下步骤:
- 在 IBM Cloud 控制台中,单击管理 > 访问 (IAM),然后单击受信任的配置文件。
- 选择要自定义的受信任配置文件,然后单击控制台体验。
- 选择要用作默认登陆页面的登陆页面,然后单击保存。
- 选择要包含在控制台横幅中的导航项目。
- 选择受信任配置文件可以访问特定产品的私有目录,然后单击保存。
使用 CLI 与联合用户建立信任关系
完成以下步骤,定义哪些联合用户可以访问特定资源:
-
运行以下命令创建受信任配置文件:
ibmcloud iam trusted-profile-create my-profile -d "sample trusted profile"有关更多信息,请参阅 CLI 参考。
-
要为受信任配置文件创建条件,请运行
ibmcloud iam trusted-profile-rule-create命令:ibmcloud iam trusted-profile-rule-create my-profile --name my-rule --type Profile-SAML --conditions claim:cn,operator:EQUALS,value:my_user --realm-name https://w3id.sso.ibm.com/auth/sps/samlidp2/saml20 --expiration 1200有关更多信息,请参阅 CLI 参考。
-
运行以下命令,为账户中的所有资源创建具有
Viewer角色的访问策略:ibmcloud iam trusted-profile-policy-create --roles Viewer有关更多信息,请参阅 CLI 参考。
使用 CLI 建立对计算资源的信任
完成以下步骤,设置更好的计算资源访问权限控制。
IBM Cloud Kubernetes Service 仅支持 1.21 及更新版本的受信任配置文件。 免费的 IBM Cloud Kubernetes Service 集群只创建早期版本。 您可以选择使用标准计划的早期版本创建群集,因此请务必选择 1.21 或更新版本。
-
运行以下命令创建受信任配置文件:
ibmcloud iam trusted-profile-create sample-compute-profile -d "sample trusted profile for compute resources"有关更多信息,请参阅 CLI 参考。
-
使用
ibmcloud iam trusted-profile-rule-create命令为受信任配置文件创建条件:ibmcloud iam trusted-profile-rule-create sample-compute-profile --name cr-rule --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:default --conditions claim:crn,operator:EQUALS,value:crn:test:bluemix:public:containers-kubernetes:us-south:a/test:: --cr-type IKS_SA有关更多信息,请参阅 CLI 参考。
您还可以创建一个直接链接:
ibmcloud iam trusted-profile-link-create sample-compute-profile --name my_link --cr-type IKS_SA --link-name default --link-namespace default --link-crn my_compute_resource_crn有关更多信息,请参阅 CLI 参考。
-
运行以下命令创建访问策略:
ibmcloud iam trusted-profile-policy-create --roles Viewer有关更多信息,请参阅 CLI 参考。
使用 CLI 与 IBM Cloud 服务建立信任关系
另一个账户中的 IBM Cloud 服务可能需要一个令牌才能在您的账户中执行操作。 完成以下步骤,定义 IBM Cloud 服务如何访问账户中的特定资源:
-
向另一个账户中的服务管理员询问唯一标识服务实例的 CRN。 CRN 用于授权操作。
服务管理员可通过导航菜单图标
> 资源列表并单击目标服务来查找 CRN。 在详细信息部分,复制 CRN。
-
通过直接链接建立信任关系:
ibmcloud iam trusted-profile-link-create sample-cloudservice-profile --name my_cloudservice_link --link-crn `crn:version:cname:ctype:service-name:location:scope:service-instance:resource-type:resource`有关更多信息,请参阅 CLI 参考。
-
运行以下命令创建访问策略:
ibmcloud iam trusted-profile-policy-create --roles Viewer有关更多信息,请参阅 CLI 参考。
使用 CLI 建立对服务 ID 的信任
完成以下步骤,定义服务 ID 如何访问账户中的特定资源:
您可以使用受信任的配置文件为服务 ID 提供跨账户访问权限和调用经典基础架构服务的权限。
-
向另一个账户的管理员询问标识服务 ID 的服务 ID 值。
管理员可进入 管理 > 访问 (IAM) > 服务标识,选择要针对的服务 ID,从而找到服务 ID 值。 单击详细信息,然后复制以
ServiceId开头的 ID。 -
通过直接链接建立信任关系:
ibmcloud iam trusted-profile-link-create sample-serviceid-profile --name my_serviceid_link --link-crn `crn:version:cname:ctype:service-name:location:scope:service-instance:resource-type:resource`有关更多信息,请参阅 CLI 参考。
-
运行以下命令创建访问策略:
ibmcloud iam trusted-profile-policy-create --roles Viewer有关更多信息,请参阅 CLI 参考。
使用 CLI 为受信任配置文件分配访问权限
与联合用户、计算资源、IBM Cloud 服务或服务 ID 建立信任关系后,就可以分配访问权限。
只有当您的帐户与 Softlayer 帐户相链接时,才能分配经典基础架构访问权限。
使用该命令 trusted-profile-policy-create 为受信任配置文件分配访问策略。 下面的示例为所有帐户管理服务分配了一个具有管理员角色的策略:
ibmcloud iam trusted-profile-policy-create Profile-36f5c562-1t36-4442-b7f0-2663c85386f1 --roles Administrator --attributes serviceType=service
使用应用程序接口与联合用户建立信任关系
完成以下步骤,定义哪些联合用户可以访问特定资源:
-
指定账户 ID,创建受信任的配置文件。
curl -X POST 'https://iam.cloud.ibm.com/v1/profiles' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{ "name": "My Nice Profile", "description": "My Nice Profile - desc", "account_id": "ACCOUNT_ID" }'在描述中,提供此受信任配置文件的可用操作列表。
-
为您的可信档案创建条件。 对于联合用户,将
type属性设为Profile-SAML。realm-name就是 IdP URL。 更多信息,请参阅 IAM 身份服务 API。curl -X POST 'https://iam.cloud.ibm.com/v1/profiles/PROFILE_ID/rules' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{ "type": "Profile-SAML", "realm_name": "https://www.example.org/my-nice-idp", "expiration": 43200, "conditions": [ { "claim": "groups", "operator": "EQUALS", "value": "\"cloud-docs-dev\"" } ] }'每个受信任配置文件最多可有 20 条申请规则。
-
(可选) 为受信任配置文件分配访问权限。
通过应用程序接口与计算资源建立信任关系
完成以下步骤,设置更好的计算资源访问权限控制。
IBM Cloud Kubernetes Service 仅支持 1.21 及更新版本的受信任配置文件。 免费的 IBM Cloud Kubernetes Service 集群只创建早期版本。 您可以选择使用标准计划的早期版本创建群集,因此请务必选择 1.21 或更新版本。
-
指定账户 ID,创建受信任的配置文件。
curl -X POST 'https://iam.cloud.ibm.com/v1/profiles' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{ "name": "My Nice Profile", "description": "My Nice Profile - desc", "account_id": "ACCOUNT_ID" }'在描述中,提供此受信任配置文件的可用操作列表。
-
为您的受信任配置文件创建一条申请规则,该规则通过指定只针对需要访问的资源的条件,遵循最小特权原则。 条件适用于所有现有的未来资源。 您还可以创建与特定现有资源的直接链接。
- 创造条件
- 对于计算资源,将
type属性设为Profile-CR。 更多信息,请参阅 IAM 身份服务 API。
curl -X POST 'https://iam.cloud.ibm.com/v1/profiles/PROFILE_ID/rules' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{ "type": "Profile-CR", "conditions": [ { "claim": "namespace", "operator": "EQUALS", "value": "\"default123\"" } ] }'每个受信任配置文件最多可有 20 条申请规则。
- 创建直接链接
- 您可以与特定的现有资源建立直接联系。
curl -X POST 'https://iam.cloud.ibm.com/v1/profiles/PROFILE_ID/links' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{ "name": "my link", "cr_type": "VSI", "is_cross_account": true, "link": { "crn": "crn:v1:staging:public:iam-identity::a/18e3020749ce4744b0b472466d61fdb4::computeresource:Fake-Compute-Resource", "namespace": "default", "name": "my compute resource name" } }'
-
(可选) 为受信任配置文件分配访问权限。
使用应用程序接口向受信任配置文件分配访问权限
与联合用户、计算资源、IBM Cloud 服务或服务 ID 建立信任关系后,就可以分配访问权限。
只有当您的帐户与 Softlayer 帐户相链接时,才能分配经典基础架构访问权限。
下面的示例为所有帐户管理服务分配了一个具有管理员角色的策略:
curl -X POST \
'https://iam.cloud.ibm.com/v1/policies' \
-H 'Authorization: $TOKEN'\
-H 'Content-Type: application/json'\
-d '{
"type": "access",
"subjects": [
{
"attributes": [
{
"name": "iam_id",
"value": "Iam-Profile-35f55552-1e36-4442-z7f0-2673c85386f9"
}
]
}'
],
"roles":[
{
"role_id": "crn:v1:bluemix:public:iam::::role:Administrator"
}
],
"resources":[
{
"attributes": [
{
"name": "accountId",
"value": "$ACCOUNT_ID"
},
{
"name": "serviceType",
"value": "platform-service"
}
]
}
]
}'
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
.name("iam_id")
.value("Iam-Profile-35f55552-1e36-4442-z7f0-2673c85386f9")
.build();
PolicySubject policySubjects = new PolicySubject.Builder()
.addAttributes(subjectAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:iam::::role:Administrator")
.build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
.name("accountId")
.value("exampleAccountId")
.operator("stringEquals")
.build();
ResourceAttribute serviceTypeResourceAttribute = new ResourceAttribute.Builder()
.name("serviceType")
.value("platform-service")
.operator("stringEquals")
.build();
PolicyResource policyResources = new PolicyResource.Builder()
.addAttributes(accountIdResourceAttribute)
.addAttributes(serviceTypeResourceAttribute)
.build();
CreatePolicyOptions options = new CreatePolicyOptions.Builder()
.type("access")
.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: 'iam_id',
value: "Iam-Profile-35f55552-1e36-4442-z7f0-2673c85386f9",
},
],
},
];
const policyRoles = [
{
role_id: 'crn:v1:bluemix:public:iam::::role:Administrator',
},
];
const accountIdResourceAttribute = {
name: 'accountId',
value: 'exampleAccountId',
operator: 'stringEquals',
};
const serviceTypeResourceAttribute = {
name: 'serviceType',
value: 'platform-service',
operator: 'stringEquals',
};
const policyResources = [
{
attributes: [accountIdResourceAttribute, serviceTypeResourceAttribute]
},
];
const params = {
type: 'access',
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='iam_id', value='Iam-Profile-35f55552-1e36-4442-z7f0-2673c85386f9')])
policy_roles = PolicyRole(
role_id='crn:v1:bluemix:public:iam::::role:Administrator')
account_id_resource_attribute = ResourceAttribute(
name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
name='serviceType', value='platform-service')
policy_resources = PolicyResource(
attributes=[account_id_resource_attribute,
service_type_resource_attribute])
policy = iam_policy_management_service.create_policy(
type='access',
subjects=[policy_subjects],
roles=[policy_roles],
resources=[policy_resources]
).get_result()
print(json.dumps(policy, indent=2))
subjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("iam_id"),
Value: core.StringPtr("Iam-Profile-35f55552-1e36-4442-z7f0-2673c85386f9"),
}
policySubjects := &iampolicymanagementv1.PolicySubject{
Attributes: []iampolicymanagementv1.SubjectAttribute{*subjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Administrator"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("accountId"),
Value: core.StringPtr("ACCOUNT_ID"),
Operator: core.StringPtr("stringEquals"),
}
serviceTypeResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
Name: core.StringPtr("serviceType"),
Value: core.StringPtr("platform-service"),
Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
Attributes: []iampolicymanagementv1.ResourceAttribute{
*accountIDResourceAttribute, *serviceTypeResourceAttribute},
}
options := iamPolicyManagementService.NewCreatePolicyOptions(
"access",
[]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))