VPC 인프라 서비스에 대한 IAM 액세스 관리

계정의 사용자에 대한 IBM Cloud® Virtual Private Cloud 서비스 인스턴스에 대한 액세스는 Cloud Identity and Access Management(IAM)에서 제어합니다. 계정 내의 VPC Infrastructure Services 서비스에 액세스하는 모든 사용자에게는 IAM 역할이 포함된 액세스 정책이 할당되어야 합니다. VPC Infrastructure Services 에 대한 액세스 권한을 할당하는 가장 적합한 방법을 결정하는 데 도움이 되도록 다음 역할, 작업 등을 검토해 보십시오.

계정에서 사용자를 지정하는 액세스 정책을 통해 사용자가 선택하는 서비스 또는 특정 인스턴스의 컨텍스트 내에서 수행할 수 있는 조치가 결정됩니다. 허용 가능한 조치는 서비스에서 수행할 수 있는 조작으로 VPC Infrastructure Services 에 의해 사용자 정의되고 정의됩니다. 각 조치는 사용자에게 지정할 수 있는 IAM 플랫폼 또는 서비스 역할에 맵핑됩니다.

특정 역할 및 해당 조치가 처리하려는 유스 케이스에 맞지 않는 경우 사용자 정의 역할을 작성하고 포함할 조치를 선택할 수 있습니다.

IAM 액세스 정책을 통해 다양한 수준에서 액세스 권한을 부여할 수 있습니다. 다음은 포함된 몇 가지 옵션입니다.

  • 계정에 있는 서비스의 모든 인스턴스에 대한 액세스
  • 계정의 개별 서비스 인스턴스에 액세스
  • vpcId 이나 instanceId 과 같이 인스턴스 내의 특정 리소스에 대한 액세스.

다음 표에는 VPC 리소스 속성이 나열되어 있습니다. 자세한 정보는 VPC 리소스 속성을 참조하십시오.

VPC 리소스 속성
자원 자원 속성
Auto Scale for VPC instanceGroupId:<instance-group-id>
백업 서비스 backupPolicyId: <backup-policy-id>
Block Storage for VPC volumeId: <volume-id>
베어메탈 서버 bareMetalServerId: <bare-metal-server-id>
VPC용 클러스터 네트워크 clusterNetworkId: <cluster-network-id>
Dedicated Host for VPC dedicatedHostId:<dedicated-host-id>
File Storage shareId: <share-id>
Floating IP for VPC floatingIpId: <fip-id>
Flow Logs for VPC flowLogCollectorId: <flc-id>
Image Service for VPC imageId:<image-id>
Load Balancer for VPC loadBalancerId: <load-balancer-id>
Network ACL networkAclId: <nacl-id>
VPC에 대한 배치 그룹 placementGroupId: <placement-group-id>
VPC용 Private Path 서비스 privatePathServiceGatewayId: <private-path-service-gateway-id>
VPC용 공용 주소 범위 publicAddressRangeId: <public-address-range-id>
VPC용 공용 게이트웨이 publicGatewayId: <pgw-id>
VPC 예약 reservationId: <reservation-id>
Security Group for VPC securityGroupId: <default-sec-grp-id>
스냅샷 snapshotId: <snapshot-id>
SSH Key for VPC keyId:<key-id>
서브넷 subnetId: <subnet-id>
가상 네트워크 인터페이스 virtualNetworkInterfaceId:<virtual-network-interface-id>
Virtual Private Endpoint for VPC endpointGatewayId:<endpoint-gateway-id>
가상 사설 클라우드 vpcId: <vpc-id>
Virtual Server for VPC instanceId: <instance-id>
VPN for VPC vpnGatewayID: <vpn-gateway-id>

VPC Infrastructure Services 서비스를 사용할 때 각 역할별로 수행할 수 있는 작업 유형을 요약한 다음 표를 확인해 보세요. 플랫폼 관리 역할을 사용하여 사용자는 플랫폼 레벨에서 서비스 리소스에 대한 태스크를 수행할 수 있습니다. 예를 들어, 서비스에 대한 사용자 액세스 권한을 부여하고, 인스턴스를 생성하거나 삭제하며, 인스턴스를 애플리케이션에 연결할 수 있습니다. 서비스 액세스 역할을 사용하면 VPC Infrastructure Services 에 대한 사용자 액세스 및 VPC Infrastructure Services API를 호출하는 기능을 사용할 수 있습니다.

IAM VPC 인프라 서비스 플랫폼 역할
플랫폼 역할 조치에 대한 설명
뷰어 서비스 인스턴스를 볼 수는 있지만, 수정할 수는 없습니다.
운영자 서비스 대시보드를 확인하는 등, 서비스 인스턴스를 구성하고 운영하기 위해 필요한 플랫폼 작업을 수행할 수 있습니다.
편집자 계정 관리 및 액세스 정책 할당을 제외한 모든 플랫폼 작업을 수행할 수 있습니다.
관리자 이 역할이 할당된 리소스를 기반으로, 다른 사용자에게 액세스 정책을 할당하는 것을 포함하여 모든 플랫폼 작업을 수행할 수 있습니다.
IAM VPC 인프라 서비스 액세스 역할
서비스 역할 조치에 대한 설명
독자 서비스 내에서 서비스별 리소스를 조회하는 등 읽기 전용 작업을 수행할 수 있습니다.
작성자 귀하에게는 ‘독자(Reader)’ 역할 이상의 권한이 있으며, 여기에는 서비스별 리소스를 생성 및 편집하는 권한도 포함됩니다.
관리자 귀하는 서비스에서 정의한 바와 같이, ‘작성자’ 역할 이상의 권한을 보유하고 있어 특권 작업을 수행할 수 있습니다. 또한 서비스 특정 리소스를 작성하고 편집할 수 있습니다.
VPN 클라이언트 사용자 ID및 비밀번호 인증이 구성된 VPN 클라이언트에 대한 액세스를 지정해야 하는 경우에만 이 역할을 선택해야 합니다. 사용자 ID및 패스코드 인증을 구성해야 하는 경우 사용자 ID및 패스코드 구성 을 참조하십시오.
베어메탈 고급 네트워크 운영자 베어메탈 인터페이스에서 IP 스푸핑 및 인프라 NAT를 수정할 수 있는 액세스 권한이 있습니다.
베어메탈 콘솔 관리 베어메탈 서버 콘솔에 액세스할 수 있습니다.
IP 스푸핑 운영자 가상 서버 인스턴스에서 IP 스푸핑 검사를 사용 또는 사용 안함으로 설정할 수 있습니다. 필요한 경우에만 이 역할을 부여하십시오.
콘솔 관리자 가상 서버 인스턴스 콘솔에 액세스할 수 있습니다. 이 역할은 콘솔 액세스 권한만 제공하므로, ‘운영자(Operator)’, ‘편집자(Editor)’ 또는 ‘관리자(Administrator)’와 같이 가상 서버에 대한 운영자 액세스 권한을 가진 다른 역할과 함께 사용해야 합니다.

각 역할에 맵핑되는 정확한 조치에 대한 자세한 정보는 IAM 역할 및 조치 페이지에서 Infrastructure Services 의 내용을 참조하십시오.

다음 링크는 IAM 역할 및 조치 페이지에서 특정 인프라 서비스로 직접 이동합니다.

네트워크 IAM 역할 및 작업

IAM 역할 및 작업 계산

스토리지 IAM 역할 및 작업

일부 VPC 태스크에는 여러 IAM 조치에 대한 권한이 필요합니다. 예를 들어, 가상 서버 인스턴스를 작성하려면 is.instance.instance.create 가 필요할 뿐만 아니라 is.vpc.vpc.operate, is.subnet.subnet.operate, is.security-group.security-group.operateis.volume.volume.create 도 필요합니다. 추가 조건부 조치가 필요할 수 있습니다. 예를 들어, 전용 호스트에서 인스턴스를 프로비저닝하는 경우 is.dedicated-host.dedicated-host-group.operateis.dedicated-host.dedicated-host.operate 가 필요합니다. 가상 프라이빗 클라우드 API 참조에는 각 API 호출에 대한 권한 부여 섹션이 포함되어 있습니다 (예: 인스턴스 작성).

콘솔에서 VPC 인프라 서비스에 대한 액세스 지정

콘솔에서 액세스 권한을 할당하는 데는 두 가지 일반적인 방법이 있습니다:

  • 사용자별 액세스 정책. 콘솔의 관리 > 액세스(IAM) > 사용자 페이지에서 사용자별 액세스 정책을 관리할 수 있습니다. IAM 액세스를 지정하는 단계에 대한 자세한 정보는 리소스에 대한 액세스 관리를 참조하십시오.
  • 액세스 그룹. 액세스 그룹은 그룹에 대한 액세스 권한을 한 번 지정하여 액세스 관리를 간소화하는 데 사용되며, 필요한 대로 그룹에서 사용자를 추가하거나 제거하여 액세스 권한을 제어할 수 있습니다. 콘솔의 관리 > 액세스(IAM) > 액세스 그룹 페이지에서 액세스 그룹 및 해당 액세스를 관리합니다. 자세한 정보는 콘솔에서 그룹에 대한 액세스 지정을 참조하십시오.

CLI에서 VPC 인프라 서비스에 대한 액세스 지정

액세스 권한 지정, 제거 및 검토에 대한 단계별 지시사항은 CLI를 사용하여 리소스에 대한 액세스 권한 지정을 참조하십시오.

다음 예제는 VPC Infrastructure Services 에 대한 Viewer 역할을 지정하기 위한 명령을 보여줍니다.

서비스 이름에 is을(를) 사용하십시오. 또한, 여기 예시와 같이 두 단어 이상으로 이루어진 역할 이름은 따옴표로 묶어 주세요.

ibmcloud iam user-policy-create USER@EXAMPLE.COM --service-name is --roles "Viewer"

API를 사용하여 VPC 인프라 서비스에 대한 액세스 지정

액세스 권한 할당, 제거 및 검토에 대한 단계별 지침은 ‘API를 사용하여 리소스에 대한 액세스 권한 할당’ 또는 ‘정책 생성 API’를 참조하십시오. 다음 표에 있는 역할 클라우드 리소스 이름(CRN)은 API로 액세스를 지정하는 데 사용됩니다.

API 사용을 위한 VPC 인프라 서비스 역할 ID 값
역할 이름 역할 CRN
뷰어 crn:v1:bluemix:public:iam::::role:Viewer
운영자 crn:v1:bluemix:public:iam::::role:Operator
편집자 crn:v1:bluemix:public:iam::::role:Editor
관리자 crn:v1:bluemix:public:iam::::role:Administrator
독자 crn:v1:bluemix:public:iam::::serviceRole:Reader
작성자 crn:v1:bluemix:public:iam::::serviceRole:Writer
관리자 crn:v1:bluemix:public:iam::::serviceRole:Manager
VPN 클라이언트 crn:v1:bluemix:public:iam::::serviceRole:VPNClient
베어메탈 고급 네트워크 운영자 crn:v1:bluemix:public:iam::::serviceRole:BareMetalAdvancedNetworkOperator
베어메탈 콘솔 관리 crn:v1:bluemix:public:iam::::serviceRole:BareMetalConsoleAdmin
IP 스푸핑 운영자 crn:v1:bluemix:public:iam::::serviceRole:IPSpoofingOperator
콘솔 관리자 crn:v1:bluemix:public:iam::::serviceRole:VirtualServerConsoleAdmin

다음 예제는 VPC Infrastructure Services 에 대한 Viewer 역할을 지정하기 위한 것입니다.

서비스 이름으로는 ‘ is ’을 사용하고, CRN에 올바른 값이 지정되었는지 확인하려면 역할 ID 값 표를 참조하십시오.

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Object Writer role for Cloud Object Storage",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "IBMid-123453user"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "$ACCOUNT_ID"
        },
        {
          "name": "serviceName",
          "value": "is"
        }
      ]
    }
  ]
}
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
      .name("iam_id")
      .value("IBMid-123453user")
      .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("ACCOUNT_ID")
      .operator("stringEquals")
      .build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceName")
      .value("is")
      .operator("stringEquals")
      .build();
PolicyResource policyResources = new PolicyResource.Builder()
      .addAttributes(accountIdResourceAttribute)
      .addAttributes(serviceNameResourceAttribute)
      .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: 'IBMid-123453user',
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:iam::::role:Viewer',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: 'ACCOUNT_ID',
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: 'is',
  operator: 'stringEquals',
};
const policyResources = [
  {
    attributes: [accountIdResourceAttribute, serviceNameResourceAttribute]
  },
];
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='IBMid-123453user')])
policy_roles = PolicyRole(
  role_id='crn:v1:bluemix:public:iam::::role:Viewer')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value='ACCOUNT_ID')
service_name_resource_attribute = ResourceAttribute(
  name='serviceName', value='is')
policy_resources = PolicyResource(
  attributes=[account_id_resource_attribute,
        service_name_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("IBMid-123453user"),
}
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("ACCOUNT_ID"),
  Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("serviceName"),
  Value:    core.StringPtr("is"),
  Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
  Attributes: []iampolicymanagementv1.ResourceAttribute{
    *accountIDResourceAttribute, *serviceNameResourceAttribute}
}
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))

Terraform을 사용하여 VPC 인프라 서비스에 대한 액세스 지정

다음 예제는 VPC Infrastructure Services 에 대한 Viewer 역할을 지정하기 위한 것입니다.

서비스 이름에 is을(를) 사용하십시오.

resource "ibm_iam_user_policy" "policy" {
  ibm_id = "test@example.com"
  roles  = ["Viewer"]
  resources {
    service = "is"
  }
}

자세한 정보는 ibm_iam_user_policy를 참조하십시오.

  • 컨테이너 리소스에 액세스해도 하위 리소스에 대한 액세스가 자동으로 부여되지 않습니다. 예를 들어 VPC에 대한 액세스 권한을 부여해도 해당 VPC의 서브넷에 대한 액세스 권한은 부여되지 않습니다.
  • 마찬가지로, 하위 리소스에 대한 액세스 권한은 해당 컨테이너 리소스에 대한 액세스 권한을 부여하지 않습니다. 예를 들어 서브넷에 대한 액세스 권한을 부여해도 해당 서브넷의 VPC에 대한 액세스 권한이 부여되지 않습니다.
  • 일반적으로 여러 리소스 간의 관계를 변경하려면 사용자가 각 리소스에 액세스할 수 있어야 합니다. 예를 들어 네트워크 인터페이스를 보안 그룹에 연결하려면 네트워크 인터페이스와 보안 그룹 모두에 액세스할 수 있어야 합니다.

콘솔에서 사용자 역할 할당에 대한 자세한 내용은 ‘VPC 리소스에 대한 사용자 권한 관리’를 참조하십시오.

IBM Cloud® 명령행 인터페이스(CLI)를 사용하여 사용자에게 역할을 지정할 수도 있습니다. 리소스 속성을 사용하여 리소스를 선택할 수 있습니다. 자세한 정보는 VPC 리소스 속성을 참조하십시오.

리소스 그룹

리소스 그룹은 권한 부여 및 사용 설정을 위해 서로 연관된 리소스(예: 전체 VPC 또는 단일 서브넷)의 모음입니다. 리소스 그룹은 프로젝트, 부서 또는 팀에서 사용할 수 있는 인프라 리소스의 콜렉션으로 간주할 수 있습니다.

대규모 엔터프라이즈는 VPC를 다양한 리소스 그룹으로 나눌 수 있지만, 소규모 기업은 모든 팀 구성원이 전체 VPC에 액세스할 수 있기 때문에 하나의 리소스 그룹만 필요할 수 있습니다. _OpenStack_에 익숙한 경우 자원 그룹은 _OpenStack Keystone_의 _프로젝트_와 개념적으로 유사합니다.

리소스가 작성될 때만 리소스 그룹에 리소스를 지정할 수 있습니다. 작성된 후에 리소스는 리소스 그룹을 변경할 수 없습니다.

여러 리소스 그룹을 사용하려는 경우, 조직 내 리소스와 사용자를 각 리소스 그룹에 어떻게 할당할지 미리 계획해 두는 것이 좋습니다.

리소스 그룹에 대한 자세한 정보는 리소스 그룹 을 참조하십시오.

액세스 관리 태그

액세스 관리 태그는 액세스 제어 관계를 체계적으로 정리하는 데 도움을 주기 위해 리소스에 추가되는 메타데이터입니다. 태그는 사용자가 관리할 수 있도록 유연한 자원 그룹화를 작성합니다.

태그를 사용하여 리소스에 대한 액세스를 제어하는 경우 IAM 정책에 대한 업데이트 없이도 팀 프로젝트의 확장이 가능합니다. 액세스 관리 태그를 VPC 인프라 리소스에 첨부할 수 있으며 태그를 기반으로 해당 리소스에 대한 액세스 레벨을 정의할 수 있습니다.

VPC 인프라 리소스에는 단일 API 호출이 여러 리소스에 대한 권한을 확인할 수 있는 복잡한 권한 부여 모델이 있습니다. 이러한 API의 경우 API가 액세스해야 하는 모든 리소스에 태그를 첨부해야 합니다. 필수 API 권한 부여에 대한 자세한 정보는 VPC API 참조 를 참조하십시오.

API 호출이 리소스 그룹 이름에 대해 UNKNOWN 를 리턴하는 경우, 액세스 관리 태그 정책을 작성할 때 리소스 그룹에 뷰어 액세스 권한을 추가하십시오.

액세스 관리 태그 사용에 대한 자세한 내용은 다음 자료를 참조하십시오

제한사항

  1. 현재 구현과 API 사양 간에는 몇 가지 차이가 있으며, 이러한 내용은 VPC 알려진 문제 사항에 기록되어 있습니다.

  2. 인스턴스 템플리트 및 전용 호스트 그룹은 액세스 관리 태그를 지원하지 않습니다. 결과적으로 이러한 태그를 사용하여 Auto scaleDedicated hosts 액세스를 완전히 관리할 수 없습니다.

  3. 사이트 간 VPN 에서 사용되는 IKE (Internet Key Exchange) 및 IPsec 정책 자원은 액세스 관리 태그를 지원하지 않습니다.

서비스 정의 역할 지정에 대한 UI 제한사항

UI를 사용하여 액세스 관리 태그가 있는 액세스 정책에 서비스 정의 역할을 지정하는 것은 지원되지 않습니다. 이 기능은 API및 CLI를 통해서만 지원됩니다.

서비스 정의 역할 지정을 위한 API 사용

UI를 사용하여 액세스 관리 태그가 있는 액세스 정책에 서비스 정의 역할을 지정하는 것은 지원되지 않습니다. 이 기능은 API및 CLI를 통해서만 지원됩니다. API에 대해 다음 예제를 사용하십시오.

curl --location --request POST 'https://iam.cloud.ibm.com/v1/policies' \
--header 'Content-Type: application/json' \
--header 'Authorization: <your token>' \
--data-raw '{
    "description": "useful description here",
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "<user iam-id>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:is::::serviceRole:VPNClient"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                            "name": "serviceName",
                            "value": "is",
                            "operator": "stringEquals"
                        },
                        {
                            "name": "accountId",
                            "value": "<your account id>"
                        }
            ],
            "tags":[
                {
                    "name": "abc",
                    "value": "test"
                }
            ]
        }
    ]
}'

CLI를 사용하여 서비스 정의 역할 지정

UI를 사용하여 액세스 관리 태그가 있는 액세스 정책에 서비스 정의 역할을 지정하는 것은 지원되지 않습니다. 이 기능은 API및 CLI를 통해서만 지원됩니다. CLI에 대해 다음 예제를 사용하십시오.

ic iam access-group-policy-create Developers_MyApp --roles Viewer --service-name kms --tags abc:test