為企業管理指派存取權限

若要授予使用者管理「IBM Cloud®」企業的權限,您必須先邀請該使用者加入企業帳戶,並為其指派企業帳戶管理服務的存取權限。

管理企業的存取權需要企業帳戶內的存取原則。 當您在企業的子帳戶內將「企業」帳戶管理服務原則指派給使用者時,使用者無法管理帳戶所屬的企業。 根據企業帳戶中「企業帳戶管理服務」所指派的角色,使用者可執行特定操作:

  • 在企業中建立新帳戶
  • 建立及命名帳戶群組
  • 在帳戶群組之間移動帳戶
  • 在刪除所有相關資源後取消帳戶
  • 將現有帳戶匯入至企業
  • 更新企業名稱或網域
  • 檢視用於計算帳單的企業、特定帳戶群組、帳戶群組內的帳戶或特定帳戶的使用報告,並提供計劃層級的詳細資訊
  • 建立企業管理的 IAM 範本
  • 將企業管理的 IAM 範本指定給子帳戶
  • 為子帳戶指定 IAM 範本
  • 在子帳戶上設定支出通知,以通知企業成員
  • 監控安全與合規性 IBM Cloud Security and Compliance Center Workload Protection
  • 分享私人目錄

賦予使用者存取企業服務權限的政策,既可套用至整個企業,也可僅套用至特定帳戶群組或單一帳戶。

一般而言,企業帳戶本身不包含許多資源。 相反地,資源會建立在企業的子帳戶中。 它是在使用者可以受邀加入的其中每一個帳戶內,而且還會提供它存取權,以管理及使用資源。 使用者在企業帳戶中具有的存取權及成員資格,不適用於企業階層中的帳戶群組及子帳戶。 如以下圖表所示,使用者管理與存取管理仍各自獨立於各帳戶之中。

第一個圖表顯示如何將政策指派給企業帳戶中的使用者,以管理整個企業。 第二個圖表顯示範圍涵蓋帳戶群組的政策,該政策僅提供管理該帳戶群組及組織在其中的子帳戶的存取權。

企業存取
企業存取的圖表

在決定存取範圍時,原則的目標和角色很重要。 企業中的使用者、服務 ID 或存取群組可以完成企業管理任務:

  • 橫跨整個企業。
  • 在可能包含其他帳戶群組和帳戶的帳戶群組上。
  • 在單一帳戶上。

舉例來說,如果使用者在企業帳戶管理服務上被指派了存取政策,而該存取政策的目標範圍是特定帳戶群組,那麼使用者就可以在帳戶群組內完成任務。 當目標設為特定帳戶群組或帳戶時,使用者無法完成影響整個企業的動作,例如更新企業名稱或網域。

您可以將適用的企業存取原則指派給子帳戶中的使用者,以僅管理該帳戶或其中包含的資源。 舉例來說,若您在企業帳戶管理服務中為子帳戶中的某位使用者指派一個角色,該使用者將無法在企業帳戶層級執行任何操作。 您必須將他們新增至企業帳戶,並指派該環境定義中的原則。

帳戶存取
帳戶存取的圖表

特定工作的必要原則

取決於需要完成的工作,非企業擁有者的使用者可能需要存取原則的組合。 下列範例提供一組存取原則,您必須將這些原則指派給企業中的使用者,才能完成特定作業。

如果您是不屬於企業的帳戶擁有者,但想要帳戶中的另一位使用者能夠將您帳戶轉換成企業,則可以將「計費」帳戶管理服務的「管理者」角色指派給該使用者。

在企業中檢視用量及管理計費

如需使用者能夠檢視企業中所有帳戶的用量報告、進行付款,以及檢視發票,您必須指派下列所有存取原則:

  • 企業帳戶中「企業」帳戶管理服務的用量報告檢視者角色
  • 企業帳戶中「計費」帳戶管理服務的「管理者」角色

將現有帳戶匯入至企業

若要讓使用者 將現有的 IBM Cloud 帳戶匯入企業環境,您必須指派以下所有存取政策:

  • 要匯入之帳戶中「計費」帳戶管理服務的「管理者」角色
  • 帳戶群組或企業帳戶的企業帳戶管理服務上的管理員或編輯角色
  • 企業帳戶之「計費」帳戶管理服務的「管理者」角色

移動帳戶

為了讓使用者能夠在企業內移動帳戶,您必須指派下列存取原則:

  • 企業帳戶中「計費」帳戶管理服務的「管理者」角色

然後,使用下列兩個選項之一:

  • 整個企業之「企業」帳戶管理服務的「管理者」或「編輯者」角色
  • 目前和目標帳戶群組的管理員或編輯角色

有關使用者針對各角色可執行的操作詳情,請參閱 《帳戶管理服務的操作與角色》。

管理安全性與合規性

若要讓使用者透過 IBM Cloud Security and Compliance Center Workload Protection [平台名稱] 管理安全性與合規性,您必須指派以下存取政策:

  • 管理員或編輯角色 IBM Cloud Security and Compliance Center Workload Protection
  • 企業的自訂角色

若要建立具有適當權限的自訂角色,請參閱 透過 IAM 控制存取。

建立和指派企業管理的 IAM 範本

若要建立由企業管理的 IAM 範本,您必須為「所有 IAM 帳戶管理服務」指派「範本管理員」角色。

若要將企業管理的 IAM 範本指派給子帳戶,您必須將「所有 IAM 帳戶管理服務」的「範本指派管理員」角色,以及在「企業服務」上至少具備「檢視者」角色的政策,指派給該帳戶。

預設情況下,任何使用者都沒有這些權限,包括帳戶擁有者。

有關使用者針對各角色可執行的操作詳情,請參閱 《帳戶管理服務的操作與角色》。

在主控台中指派存取權

若要將存取原則指派給企業帳戶中的現有使用者,請完成下列步驟:

您可以將原則的目標設為整個企業、特定帳戶群組(可以包含其內所有帳戶的存取權),或甚至是帳戶群組中的特定帳戶。

  1. 在 IBM Cloud 控制台中,按一下 「管理」 >「存取權限 (IAM)」,然後選取「使用者」。
  2. 在您要授予存取權限的用戶所在的列中,點選「動作」圖示,然後點選 「授予存取權限」。
  3. 從服務中,選擇企業。
  4. 按下一步。
  5. 將存取範圍擴大到資源群組的特定子帳戶,或企業中的所有帳戶。 然後按下一步。
  6. 選取任何角色或權限組合,然後按一下檢閱。
  7. 按一下新增,將您的政策組態新增至政策摘要。
  8. (可選)重複步驟以新增其他存取。
  9. 按一下指派。

有關在企業帳戶中指定存取權限的角色和動作的詳細資訊,請參閱 指定帳戶管理服務的存取權限。

使用 CLI 指派存取權

若要為使用者建立新的存取原則,請執行 ibmcloud iam user-policy-create 指令。 在指令範例中,使用 JSON 檔案來指定原則詳細資料。 請檢閱使用 API 指派存取權一節,以取得 JSON 檔案中所包含內容的範例。

建立使用者原則:

ibmcloud iam user-policy-create name@example.com -f policy.json

如需相關資訊,請參閱 ibmcloud iam user-policy-create。

使用 API 指派存取權

以下請求範例為企業帳戶中,於 Enterprise 服務上具有「編輯者」角色的使用者指派一項政策,且該政策的作用範圍限定於某個帳戶群組。 此類型的原則為階層式,並適用於階層中的所有後代物件,這表示在指定目標帳戶群組內的所有帳戶群組或帳戶。

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Editor role for SERVICE_NAME's RESOURCE_NAME",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "IBMid-123453user"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::role:Editor"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "$ACCOUNT_ID"
        },
        {
          "name": "serviceName",
          "value": "$SERVICE_NAME"
        },
        {
          "name": "resource",
          "value": "$RESOURCE_NAME",
          "operator": "stringEquals"
        }
      ]
    }
  ]
}'
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
        .name("iam_id")
        .value(EXAMPLE_USER_ID)
        .build();
PolicySubject policySubjects = new PolicySubject.Builder()
        .addAttributes(subjectAttribute)
        .build();
PolicyRole policyRoles = new PolicyRole.Builder()
        .roleId("crn:v1:bluemix:public:iam::::role:Viewer")
        .build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
        .name("accountId")
        .value(exampleAccountId)
        .operator("stringEquals")
        .build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
        .name("serviceType")
        .value("service")
        .operator("stringEquals")
        .build();
ResourceTag policyResourceTag = new ResourceTag.Builder()
        .name("project")
        .value("prototype")
        .operator("stringEquals")
        .build();
PolicyResource policyResources = new PolicyResource.Builder()
        .addAttributes(accountIdResourceAttribute)
        .addAttributes(serviceNameResourceAttribute)
        .addTags(policyResourceTag)
        .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: exampleUserId,
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:iam::::role:Viewer',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: exampleAccountId,
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceType',
  value: 'service',
  operator: 'stringEquals',
};
const policyResourceTag = {
  name: 'project',
  operator: 'stringEquals',
  value: 'prototype',
};
const policyResources = [
  {
    attributes: [accountIdResourceAttribute, serviceNameResourceAttribute],
    tags: [policyResourceTag],
  },
];
const params = {
  type: 'access',
  subjects: policySubjects,
  roles: policyRoles,
  resources: policyResources,
};
iamPolicyManagementService.createPolicy(params)
  .then(res => {
    examplePolicyId = res.result.id;
    console.log('createPolicy() result:\n' + JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
policy_subjects = PolicySubject(
  attributes=[SubjectAttribute(name='iam_id', value=example_user_id)])
policy_roles = PolicyRole(
  role_id='crn:v1:bluemix:public:iam::::role:Viewer')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
  name='serviceType', value='service')
policy_resource_tag = ResourceTag(
  name='project', value='prototype')
policy_resources = PolicyResource(
  attributes=[account_id_resource_attribute,
        service_name_resource_attribute],
  tags=[policy_resource_tag])
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: &exampleUserID,
}
policySubjects := &iampolicymanagementv1.PolicySubject{
  Attributes: []iampolicymanagementv1.SubjectAttribute{*subjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
  RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Viewer"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("accountId"),
  Value:    core.StringPtr(exampleAccountID),
  Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("serviceType"),
  Value:    core.StringPtr("service"),
  Operator: core.StringPtr("stringEquals"),
}
policyResourceTag := &iampolicymanagementv1.ResourceTag{
  Name:     core.StringPtr("project"),
  Value:    core.StringPtr("prototype"),
  Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
  Attributes: []iampolicymanagementv1.ResourceAttribute{
    *accountIDResourceAttribute, *serviceNameResourceAttribute},
  Tags: []iampolicymanagementv1.ResourceTag{*policyResourceTag},
}
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))

如需更多資訊,請參閱「建立政策」。