기업 관리에 대한 접근 권한 할당

사용자에게 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 파일이 사용되었습니다. 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))

자세한 내용은 ‘정책 만들기’를 참조하세요.