管理 IBM Cloud Direct Link 的 IAM 存取權
IBM Cloud® Identity and Access Management (IAM) 控制您帳戶中使用者對 Direct Link 閘道的存取。 您帳戶中每位存取 Direct Link 服務的使用者,都必須被指派一項包含 IAM 角色的存取政策。 檢閱下列角色、動作等,以協助確定分配 Direct Link 存取權限的最佳方式。
IBM Cloud® Direct Link 可讓客戶內部資源與 IBM Cloud 資源之間建立連線,這些資源託管在傳統和虛擬私有雲 (VPC) 基礎架構中。
您在帳戶中指派使用者的存取原則會決定使用者可以在您所選取服務或特定實例的環境定義內執行哪些動作。 直接連結將允許的操作自訂並定義為允許在服務上執行的操作。 每一個動作都會對映至您可以指派給使用者的 IAM 平台或服務角色。
如果特定角色及其動作不符合您想要處理的使用案例,您可以 建立自訂角色,並挑選要包含的動作。
IAM 存取政策可讓系統在不同層級授予存取權限。 一些選項包括:
- 在您帳戶中跨 Direct Link 服務實例的存取權
- 帳戶中個別服務實例的存取權
- 對實例中特定資源的存取權
請檢閱下表,其中概述當您使用 Direct Link 服務時,每個角色所容許的作業類型。 平台管理角色可讓使用者在平台層級對服務資源執行各項任務,例如:授予使用者對該服務的存取權限,以及建立或刪除執行個體。
Direct Link 不具有服務存取角色,而服務存取角色可讓使用者存取 Direct Link,並能夠呼叫 Direct Link API。 如需關於映射到每個角色的確切動作的資訊,請參閱 Direct Link Connect 和 Direct Link Dedicated。
| 平台角色 | 動作的說明 | 範例動作 |
|---|---|---|
| 管理者 | 容許使用者將 Direct Link IAM 存取原則指派給其他使用者。 | 建立閘道 刪除閘道 編輯閘道 新增虛擬連線到閘道* 從閘道&ast 移除虛擬連線; 編輯虛擬連線 (僅限 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 上更新授權。 |
在 CLI 中指派對 Direct Link 的存取權
如需指派、移除及檢閱存取權的逐步指示,請參閱 使用 CLI 指派存取資源。 下列範例顯示將 Editor 角色指派給使用者的指令:
使用 directlink 作為服務名稱。 此外,請使用引號括住角色名稱,這些角色名稱不只一個單字,如這裡的範例。
ibmcloud iam user-policy-create USER@EXAMPLE.COM --service-name directlink --roles Editor
使用 API 來指派對 Direct Link 的存取權
有關指派、刪除和審查存取權限的逐步說明,請參閱 使用 API 指派對資源的存取權限 或者 建立政策 API 文件。 下表中的角色雲端資源名稱 (CRN) 用來使用 API 指派存取權。
| 角色名稱 | 角色 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 取得服務名稱,並參閱角色 ID 值表以確保您使用的 CRN 值正確。
下列原則會將使用者「撰寫者」角色指派給帳戶中的所有 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。