IBM Cloud Direct Link에 대한 IAM 액세스 관리

IBM Cloud® Identity and Access Management (IAM)은 계정 내 사용자의 Direct Link 게이트웨이에 대한 액세스를 제어합니다. 계정의 Direct Link 서비스에 액세스하는 모든 사용자에게 IAM 역할과 함께 액세스 정책이 지정되어야 합니다. Direct Link 에 대한 액세스 권한을 할당하는 가장 적합한 방법을 결정하는 데 도움이 되도록 다음 역할, 작업 등을 검토해 보십시오.

IBM Cloud® Direct Link은(는) 고객의 사내 구축형 리소스 간의 연결을 클래식 및 가상 사설 클라우드 (VPC) 인프라에서 호스팅되는 IBM Cloud 리소스로 연결할 수 있습니다.

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

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

IAM 액세스 정책을 사용하면 서로 다른 레벨에서 액세스 권한을 부여할 수 있습니다. 일부 옵션은 다음과 같습니다.

  • 계정에 있는 Direct Link 서비스의 인스턴스에서 액세스
  • 계정의 개별 서비스 인스턴스에 액세스
  • 인스턴스 내의 특정 리소스에 액세스

Direct Link 서비스를 사용할 때 각 역할별로 수행할 수 있는 작업 유형을 요약한 다음 표를 확인해 보세요. 플랫폼 관리 역할은 사용자가 플랫폼 수준에서 서비스 리소스에 대한 작업을 수행할 수 있도록 해줍니다. 예를 들어, 서비스에 대한 사용자 액세스 권한을 할당하거나 인스턴스를 생성·삭제하는 등의 작업이 가능합니다.

Direct Link 에는 사용자가 Direct Link 에 액세스하고 Direct Link API를 호출할 수 있는 서비스 액세스 역할이 없습니다. 각 역할에 매핑되는 정확한 작업에 대한 자세한 내용은 Direct Link 연결Direct Link 전용을 참조하세요.

IAM 플랫폼 액세스 사용자 역할 및 작업
플랫폼 역할 조치에 대한 설명 예제 조치
관리자 사용자가 다른 사용자에게 Direct Link IAM 액세스 정책을 지정하도록 합니다. 게이트웨이 작성
게이트웨이 삭제
게이트웨이 편집
게이트웨이에 가상 연결 추가*
게이트웨이에서 가상 연결 제거*
가상 연결 편집(API만 해당)
서비스에 대한 사용자 액세스 정책 업데이트
편집자 게이트웨이 및 가상 연결 관리를 포함하여 모든 조치를 수행합니다. 게이트웨이 작성
게이트웨이 삭제
게이트웨이 편집
게이트웨이에 가상 연결 추가*
게이트웨이에서 가상 연결 제거*
가상 연결 편집(API에만 해당)
뷰어/운영자 리소스 상태를 변경하지 않는 조치를 수행합니다. 게이트웨이 목록 조회
게이트웨이 가져오기
게이트웨이의 가상 연결 목록 조회
게이트웨이의 가상 연결 보기
게이트웨이 관련 정보 조회 (승인 완료 알림)
수신 연결 요청 보기*

* VPC에 가상 연결을 추가하거나 제거하거나 연결 요청을 수락하거나 거부하려면 사용자에게도 VPC에 대한 편집자 또는 관리자 플랫폼 액세스 역할 권한이 있어야 한다. 자세한 정보는 VPC: IAM 시작하기를 참조하십시오.

참고:

  • 모든 Direct Link 리소스는 리소스 그룹에 존재합니다. Direct Link 리소스를 생성하려면 선택한 리소스 그룹에 대한 편집자 권한이 필요합니다.
  • 콘솔에서 사용자 역할을 지정하는 데 대한 정보는 리소스에 대한 액세스 관리를 참조하십시오.

콘솔에서 Direct Link 에 대한 액세스 권한 할당

콘솔에서 액세스 권한을 할당하는 일반적인 방법은 다음과 같습니다.

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

교차 계정 가상 연결에 대한 권한 고려사항

다음 표에는 교차 계정 가상 연결에 대한 권한 변경사항이 표시됩니다.

교차 계정 가상 연결에서는 게이트웨이가 IBM Cloud 계정에 있고 이 게이트웨이의 가상 연결은 다른 IBM Cloud 계정의 VPC에 연결됩니다. 이 구성은 해당 객체(직접 링크 및 VPC)와 해당 리소스 그룹이 두 계정 모두에 존재하지 않기 때문에, 권한 설정에 특별한 고려가 필요합니다.

계정 간 가상 연결에 대한 인증 변경 사항
관련 계정 기능 필수 권한
게이트웨이 계정 이 표에 언급되지 않은 모든 기능. 권한 변경 없음.
게이트웨이 계정 교차 계정 가상 연결을 작성하고 삭제합니다. directlink.dedicated.edit 또는 directlink.connect.edit
생성 또는 삭제 시점에 필요한 VPC 인증이 없습니다.
네트워크 계정 읽기 전용 게이트웨이 및 가상 연결을 봅니다. 서비스 레벨 directlink.dedicated.view 또는 directlink.connect.view
네트워크 계정 보류 연결을 허용하고 거부합니다. 서비스 레벨 directlink.dedicated.view 또는 directlink.connect.view
연결된 VPC에서 권한을 업데이트합니다.
네트워크 계정 접속된 가상 연결을 DELETE합니다. 서비스 레벨 directlink.dedicated.view 또는 directlink.connect.view
연결된 VPC에서 권한을 업데이트합니다.

API를 사용하여 Direct Link 에 대한 액세스 권한 부여

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

API 사용을 위한 역할 ID 값
역할 이름 역할 CRN
뷰어 crn:v1:bluemix:public:directlink::::serviceRole:Viewer
운영자 crn:v1:bluemix:public:directlink::::serviceRole:Operator
편집자 crn:v1:bluemix:public:directlink::::serviceRole:Editor
관리자 crn:v1:bluemix:public:directlink::::serviceRole:Administrator
독자 crn:v1:bluemix:public:directlink::::serviceRole:Reader
작성자 crn:v1:bluemix:public:directlink::::serviceRole:Writer
관리자 crn:v1:bluemix:public:directlink::::serviceRole:Manager

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

다음 정책은 계정의 모든 serviceName=directlink 리소스에 사용자 작성자 역할을 지정합니다.

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Writer role for Direct Link",
  "subjects": [
   {
    "attributes": [{
        "name": "iam_id",
        "value": "IBMid-123453user"
    }]
  }],
  "roles": [{
    "roles_id": "crn:v1:bluemix:public:directlink::::serviceRole:Writer"
   }],
  "resources": [{
    "attributes": [
    {
        "name": "accountId",
        "value": "1234567890987654321"
    },
    {
        "name": "serviceName",
        "value": "directlink"
    }]
}]
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:directlink::::serviceRole:Writer")
      .build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
      .name("accountId")
      .value("ACCOUNT_ID")
      .operator("stringEquals")
      .build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceName")
      .value("directlink")
      .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);
policy_subjects = PolicySubject(
  attributes=[SubjectAttribute(name='iam_id', value='IBMid-123453user')])
policy_roles = PolicyRole(
  role_id='crn:v1:bluemix:public:directlink::::serviceRole:Writer')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value='ACCOUNT_ID')
service_name_resource_attribute = ResourceAttribute(
  name='serviceName', value='directlink')
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:directlink::::serviceRole:Writer"),
}
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("directlink"),
  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))
const policySubjects = [
  {
    attributes: [
      {
        name: 'iam_id',
        value: 'IBMid-123453user',
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:directlink::::serviceRole:Writer',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: 'ACCOUNT_ID',
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: 'directlink',
  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)
  });

Curl 예제 2

다음 정책은 계정에 있는 dedicated 유형의 모든 serviceName=directlink 리소스에 사용자 작성자 역할을 지정합니다.

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Writer role for Direct Link Dedicated",
  "subjects": [
  {
    "attributes": [{
        "name": "iam_id",
        "value": "IBMid-123453user"
  }]
}],
"roles": [{
    "roles_id": "crn:v1:bluemix:public:directlink::::serviceRole:Writer"
}],
"resources": [{
    "attributes": [
    {
        "name": "accountId",
        "value": "1234567890987654321"
    },
    {
        "name": "serviceName",
        "value": "directlink"
    },
    {
        "name": "dedicatedId",
        "value": "*"
    }]
}]

Terraform을 사용하여 directlink 에 대한 액세스 권한 부여

다음 예제는 directlink 에 ‘ Editor ’ 역할을 할당하는 방법입니다:

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

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

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