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 Connect および Direct Link Dedicatedを 参照してください。

IAMプラットフォーム-アクセスユーザーの役割とアクション
プラットフォーム役割 アクションの説明 アクション例
管理者 ユーザーが Direct Link IAM アクセス・ポリシーを他のユーザーに割り当てることができるようにします。 ゲートウェイの作成
ゲートウェイの削除
ゲートウェイの編集
ゲートウェイへの仮想接続の追加*
ゲートウェイからの仮想接続の削除*
仮想接続の編集 (API のみ)
サービスのユーザー・アクセス・ポリシーの更新
エディター ゲートウェイや仮想接続の管理を含む、すべてのアクションを実行します。 ゲートウェイの作成
ゲートウェイの削除
ゲートウェイの編集
ゲートウェイへの仮想接続の追加*
ゲートウェイからの仮想接続の削除*
仮想接続の編集 (API のみ)
ビューアー/オペレーター リソースの状態を変更しないアクションを実行します。 ゲートウェイの一覧表示
ゲートウェイの取得
ゲートウェイの仮想接続の一覧表示
ゲートウェイの仮想接続の表示
ゲートウェイ関連情報の取得(認証完了通知)
着信接続リクエストの表示*

* VPC への仮想接続を追加または削除する、あるいは接続要求への同意または却下をする場合、ユーザーには、VPC に対するエディターまたは管理者のプラットフォーム・アクセス役割も必要です。 詳しくは、VPC: IAM 入門を参照してください。

注記:

  • すべての Direct Link リソースは 1 つのリソース・グループに含まれています。 Direct Link リソースを作成するには、選択したリソースグループに対する「エディター」権限が必要です。
  • コンソールでのユーザー役割の割り当てについては、リソースに対するアクセス権限の管理を参照してください。

コンソールでの「 Direct Link 」へのアクセス権の割り当て

コンソールでアクセスを割り当てる一般的な方法:

  • ユーザー別のアクセス・ポリシー。 コンソールで**「管理」>「アクセス (IAM)」>「ユーザー」**ページから、ユーザー別のアクセス・ポリシーを管理できます。 IAM アクセス権限を割り当てる手順については、リソースに対するアクセス権限の管理を参照してください。
  • アクセス・グループ。 アクセス・グループは、アクセス権限をグループに 1 回割り当てることによってアクセス管理を簡素化するために使用されます。その後、ユーザーのアクセス権限を制御するために、必要に応じてグループにユーザーを追加したり、グループからユーザーを削除したりすることができます。 コンソールの**「管理」>「アクセス (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のドキュメントを作成する を参照してください。 API でアクセス権限を割り当てるには、以下の表に記載している役割のクラウド・リソース名 (CRN) を使用します。

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 を参照してください。