企業管理のためのアクセス権の割り当て

IBM Cloud® エンタープライズを管理するためのアクセス権限をユーザーに割り当てるには、ユーザーをエンタープライズ・アカウントに招待し、エンタープライズ・アカウント管理サービスに関するアクセス権限を割り当てる必要があります。

エンタープライズを管理するためのアクセス権限には、エンタープライズ・アカウント内のアクセス・ポリシーが必要です。 エンタープライズ内の子アカウント内のエンタープライズ・アカウント管理サービス・ポリシーをユーザーに割り当てた場合、ユーザーはそのアカウントが属しているエンタープライズを管理することはできません。 エンタープライズ・アカウント内のエンタープライズ・アカウント管理サービスに対して割り当てられた役割に応じて、ユーザーは以下の特定のアクションを実行できます。

  • エンタープライズ内の新規アカウントの作成
  • アカウント・グループの作成および命名
  • アカウント・グループ間でのアカウントの移動
  • すべての関連リソースが削除された後、アカウントをキャンセルする
  • エンタープライズへの既存アカウントのインポート
  • エンタープライズの名前またはドメインの更新
  • 企業、特定のアカウント・グループ、アカウント・グループ内のアカウント、または特定のアカウントについて、請求の計算に使用される使用状況レポートを、プラン・レベルで詳細に表示できます
  • 企業管理のIAMテンプレートを作成する
  • 企業管理のIAMテンプレートを子アカウントに割り当てる
  • 子アカウントにIAMテンプレートを割り当てる
  • 子アカウントに支出通知を設定し、企業のメンバーに通知する
  • セキュリティとコンプライアンスを監視する IBM Cloud Security and Compliance Center Workload Protection
  • プライベート・カタログの共有

エンタープライズ・サービスへのアクセス権限をユーザーに付与するポリシーは、エンタープライズ全体で割り当てることも、特定のアカウント・グループまたは単一アカウントのみで割り当てることもできます。

通常、エンタープライズ・アカウント自体には多くのリソースは含まれません。 代わりに、エンタープライズの子アカウント内にリソースが作成されます。 ユーザーを招待して、リソースを管理および処理するためのアクセス権限をユーザーに付与できるのは、これらのアカウント内です。 エンタープライズ・アカウント内でユーザーが持つアクセス権限およびメンバーシップは、エンタープライズ階層内のアカウント・グループおよび子アカウントには適用されません。 ユーザー管理とアクセス権限管理は、以下の図に示されているように、各アカウントに分離されたままです。

最初の図は、エンタープライズ・アカウント内のユーザーに、エンタープライズ全体を管理するためのポリシーを割り当てる方法を示しています。 2 番目の図は、あるアカウント・グループを適用範囲とするポリシー、つまり、そのアカウント・グループとそのグループ内に編成された子アカウントのみを管理するためのアクセス権限を付与するポリシーを示しています。

企業アクセス
企業アクセス用の図

ポリシーのターゲットと役割は、アクセス権限の有効範囲を決定する上で重要です。 エンタープライズ内のユーザー、サービス ID、またはアクセス・グループは、以下の範囲でエンタープライズ管理タスクを実行できます。

  • エンタープライズ全体。
  • 1 つのアカウント・グループ (他のアカウント・グループやアカウントを含んでいる場合あり)。
  • 単一のアカウント。

例えばユーザーに、有効範囲として特定のアカウント・グループをターゲットにした、エンタープライズ・アカウント管理サービスに対するアクセス・ポリシーを割り当てると、そのユーザーはアカウント・グループ内でタスクを実行できます。 ターゲットが特定のアカウント・グループまたはアカウントに設定されている場合、ユーザーはエンタープライズ全体に影響するアクション (エンタープライズ名やドメインの更新など) を実行できません。

エンタープライズ内の子アカウント内のユーザーには、そのアカウントまたはそこに含まれるリソースのみの管理に適用されるアクセス・ポリシーを割り当てることができます。 例えば、子アカウント内のユーザーに、エンタープライズ・アカウント管理サービスに対する役割が割り当てられた場合、そのユーザーはエンタープライズ・アカウント・レベルのアクションを実行することはできません。 ユーザーをエンタープライズ・アカウントに追加し、そのコンテキストでポリシーを割り当てる必要があります。

アカウントへのアクセス
アカウントへのアクセスに関する図

特定のジョブに必要なポリシー

実行する必要があるジョブによっては、エンタープライズ所有者ではないユーザーのために複数のアクセス・ポリシーを組み合わせることが必要な場合があります。 以下の例は、特定のタスクを実行できるようにエンタープライズ内のユーザーに割り当てる必要があるアクセス・ポリシーのセットを示しています。

エンタープライズに属していないアカウントの所有者は、そのアカウント内の別のユーザーがアカウントからエンタープライズに変換できるようにしたい場合、そのユーザーに請求アカウント管理サービスに対する管理者役割を割り当てることができます。

エンタープライズ内の使用量表示および請求管理

ユーザーがエンタープライズ内のすべてのアカウントの使用量レポートの表示、支払いの実施、および送り状の表示を行うには、以下のすべてのアクセス・ポリシーが割り当てられる必要があります。

  • エンタープライズ・アカウント内のエンタープライズ・アカウント管理サービスに対する使用量レポート・ビューアー役割
  • エンタープライズ・アカウント内の請求アカウント管理サービスに対する管理者役割

エンタープライズへの既存アカウントのインポート

ユーザーが 既存の IBM Cloud アカウントをエンタープライズにインポートする にアクセスするには、以下のアクセスポリシーをすべて割り当てる必要があります

  • インポートするアカウント内の請求アカウント管理サービスに対する管理者役割
  • アカウント・グループまたはエンタープライズ・アカウントのエンタープライズ・アカウント管理サービスに対する管理者またはエディターの役割
  • エンタープライズ・アカウントの請求アカウント管理サービスに対する管理者役割

アカウントの移動

ユーザーがエンタープライズ内でのアカウントの移動を行うには、以下のアクセス・ポリシーが割り当てられる必要があります。

  • エンタープライズ・アカウント内の請求アカウント管理サービスに対する管理者役割

さらに、以下の 2 つのオプションのいずれか。

  • エンタープライズ全体のエンタープライズ・アカウント管理サービスに対する管理者またはエディターの役割
  • 現在のアカウント・グループとターゲットのアカウント・グループに対する管理者またはエディターの役割

役割ごとにユーザーが実行できるアクションについて詳しくは、アカウント管理サービスのアクションおよび役割を参照してください。

セキュリティーとコンプライアンスの管理

ユーザーがセキュリティとコンプライアンスを管理するには 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 ファイルが使用されています。 JSON ファイルに含める内容の例については、『API を使用したアクセス権限の割り当て』セクションの例を参照してください。

ユーザー・ポリシーを作成します。

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

詳しくは、『ibmcloud iam user-policy-create』を参照してください。

API を使用したアクセス権限の割り当て

以下の要求例は、有効範囲がアカウント・グループに設定され、エンタープライズ・アカウント内のエンタープライズ・サービスに対するエディター役割が設定された、ユーザー用のポリシーを割り当てます。 このタイプのポリシーは階層型であり、階層内のすべての下位オブジェクト (つまり、指定されたターゲット・アカウント・グループ内のすべてのアカウント・グループまたはアカウント) に適用されます。

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))

詳細については、「 ポリシーの作成 」を参照してください。