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> |
| 스냅샷 | 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를 호출하는 기능을 사용할 수 있습니다.
| 플랫폼 역할 | 조치에 대한 설명 |
|---|---|
| 뷰어 | 서비스 인스턴스를 볼 수는 있지만, 수정할 수는 없습니다. |
| 운영자 | 서비스 대시보드를 확인하는 등, 서비스 인스턴스를 구성하고 운영하기 위해 필요한 플랫폼 작업을 수행할 수 있습니다. |
| 편집자 | 계정 관리 및 액세스 정책 할당을 제외한 모든 플랫폼 작업을 수행할 수 있습니다. |
| 관리자 | 이 역할이 할당된 리소스를 기반으로, 다른 사용자에게 액세스 정책을 할당하는 것을 포함하여 모든 플랫폼 작업을 수행할 수 있습니다. |
| 서비스 역할 | 조치에 대한 설명 |
|---|---|
| 독자 | 서비스 내에서 서비스별 리소스를 조회하는 등 읽기 전용 작업을 수행할 수 있습니다. |
| 작성자 | 귀하에게는 ‘독자(Reader)’ 역할 이상의 권한이 있으며, 여기에는 서비스별 리소스를 생성 및 편집하는 권한도 포함됩니다. |
| 관리자 | 귀하는 서비스에서 정의한 바와 같이, ‘작성자’ 역할 이상의 권한을 보유하고 있어 특권 작업을 수행할 수 있습니다. 또한 서비스 특정 리소스를 작성하고 편집할 수 있습니다. |
| 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_의 _프로젝트_와 개념적으로 유사합니다.
리소스가 작성될 때만 리소스 그룹에 리소스를 지정할 수 있습니다. 작성된 후에 리소스는 리소스 그룹을 변경할 수 없습니다.
여러 리소스 그룹을 사용하려는 경우, 조직 내 리소스와 사용자를 각 리소스 그룹에 어떻게 할당할지 미리 계획해 두는 것이 좋습니다.
리소스 그룹에 대한 자세한 정보는 리소스 그룹 을 참조하십시오.