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 리소스 속성을 참조하십시오.
| 자원 | 자원 속성 |
|---|---|
| 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를 호출하는 기능을 사용할 수 있습니다.
| 플랫폼 역할 | 조치에 대한 설명 |
|---|---|
| 뷰어 | 서비스 인스턴스를 볼 수는 있지만, 수정할 수는 없습니다. |
| 운영자 | 서비스 대시보드를 확인하는 등, 서비스 인스턴스를 구성하고 운영하는 데 필요한 플랫폼 작업을 수행할 수 있습니다. |
| 편집자 | 계정 관리 및 액세스 정책 할당을 제외한 모든 플랫폼 작업을 수행할 수 있습니다. |
| 관리자 | 이 역할이 할당된 리소스를 기반으로, 다른 사용자에게 액세스 정책을 할당하는 것을 포함하여 모든 플랫폼 작업을 수행할 수 있습니다. |
| 서비스 역할 | 조치에 대한 설명 |
|---|---|
| 독자 | 서비스 내에서 서비스별 리소스를 조회하는 등 읽기 전용 작업을 수행할 수 있습니다. |
| 작성자 | 귀하에게는 ‘독자’ 역할 이상의 권한이 있으며, 여기에는 서비스별 리소스를 생성하고 편집하는 권한도 포함됩니다. |
| 관리자 | 귀하께서는 ‘작성자’ 역할 이상의 권한을 보유하고 있어, 해당 서비스에서 정의한 대로 특권 작업을 수행할 수 있습니다. 또한 서비스 특정 리소스를 작성하고 편집할 수 있습니다. |
| VPN 클라이언트 | 사용자 ID및 비밀번호 인증이 구성된 VPN 클라이언트에 대한 액세스를 지정해야 하는 경우에만 이 역할을 선택해야 합니다. 사용자 ID및 패스코드 인증을 구성해야 하는 경우 사용자 ID및 패스코드 구성 을 참조하십시오. |
| 베어메탈 고급 네트워크 운영자 | 베어메탈 인터페이스에서 IP 스푸핑 및 인프라 NAT를 수정할 수 있는 액세스 권한이 있습니다. |
| 베어메탈 콘솔 관리 | 베어메탈 서버 콘솔에 액세스할 수 있습니다. |
| IP 스푸핑 운영자 | 가상 서버 인스턴스에서 IP 스푸핑 검사를 사용 또는 사용 안함으로 설정할 수 있습니다. 필요한 경우에만 이 역할을 부여하십시오. |
| 콘솔 관리자 | 가상 서버 인스턴스 콘솔에 액세스할 수 있습니다. 이 역할은 콘솔 액세스 권한만 제공하므로, ‘Operator’, ‘Editor’ 또는 ‘Administrator’와 같이 가상 서버에 대한 운영자 액세스 권한을 가진 다른 역할과 함께 사용해야 합니다. |
각 역할에 맵핑되는 정확한 조치에 대한 자세한 정보는 IAM 역할 및 조치 페이지에서 Infrastructure Services 의 내용을 참조하십시오.
다음 링크는 IAM 역할 및 조치 페이지에서 특정 인프라 서비스로 직접 이동합니다.
네트워크 IAM 역할 및 작업
IAM 역할 및 작업 계산
스토리지 IAM 역할 및 작업
- Block Storage for VPC
- Block Storage Snapshots for VPC
- Block Storage VPC용 다중 볼륨 스냅샷
- VPC용 BaaS(Backup as a Service)
- File Storage for VPC
일부 VPC 태스크에는 여러 IAM 조치에 대한 권한이 필요합니다. 예를 들어, 가상 서버 인스턴스를 작성하려면 is.instance.instance.create 가 필요할 뿐만 아니라 is.vpc.vpc.operate, is.subnet.subnet.operate, is.security-group.security-group.operate 및 is.volume.volume.create 도 필요합니다. 추가 조건부 조치가 필요할 수 있습니다. 예를 들어, 전용 호스트에서 인스턴스를 프로비저닝하는 경우 is.dedicated-host.dedicated-host-group.operate 및 is.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로 액세스를 지정하는 데 사용됩니다.
| 역할 이름 | 역할 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_의 _프로젝트_와 개념적으로 유사합니다.
리소스가 작성될 때만 리소스 그룹에 리소스를 지정할 수 있습니다. 작성된 후에 리소스는 리소스 그룹을 변경할 수 없습니다.
여러 리소스 그룹을 사용하려는 경우, 조직 내 리소스와 사용자를 각 리소스 그룹에 어떻게 할당할지 미리 계획해 두는 것이 좋습니다.
리소스 그룹에 대한 자세한 정보는 리소스 그룹 을 참조하십시오.