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>
Snapshot 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>
Virtual Private Cloud 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 인프라 서비스 액세스 역할
서비스 역할 조치에 대한 설명
독자 서비스 내에서 서비스별 리소스를 조회하는 등 읽기 전용 작업을 수행할 수 있습니다.
작성자 귀하에게는 ‘독자’ 역할 이상의 권한이 있으며, 여기에는 서비스별 리소스를 생성하고 편집하는 권한도 포함됩니다.
관리자 귀하께서는 ‘작성자’ 역할 이상의 권한을 보유하고 있어, 해당 서비스에서 정의한 대로 특권 작업을 수행할 수 있습니다. 또한 서비스 특정 리소스를 작성하고 편집할 수 있습니다.
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 스펙 사이에 몇 가지 차이가 있습니다. 이는 여기 에 설명되어 있습니다.

  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