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アクセスポリシーにより、さまざまなレベルでアクセス権を付与することができます。 以下に、いくつかのオプションを示します。

  • アカウント内のすべてのサービス・インスタンスに対するアクセス権限
  • アカウント内の個別のサービス・インスタンスに対するアクセス権限
  • インスタンス内の特定のリソースへのアクセス。例: vpcIdinstanceId など。

次の表に、VPCリソースの属性を示します。 詳しくは、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>
Placement Group for VPC placementGroupId: <placement-group-id>
VPC向けのプライベートパスサービス privatePathServiceGatewayId: <private-path-service-gateway-id>
VPCの公開アドレス範囲 publicAddressRangeId: <public-address-range-id>
Public Gateway for 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>
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 を呼び出すことができます。

IAM VPCインフラストラクチャ・サービス・プラットフォームの役割
プラットフォーム役割 アクションの説明
ビューアー サービスインスタンスは表示できますが、変更することはできません。
オペレーター サービスインスタンスの設定や運用に必要なプラットフォーム操作(サービスダッシュボードの表示など)を実行できます。
エディター アカウントおよびアクセスポリシーの割り当てを除く、すべてのプラットフォーム操作を実行できます。
管理者 このロールが割り当てられているリソースに基づいて、他のユーザーへのアクセスポリシーの割り当てを含め、すべてのプラットフォーム操作を実行できます。
IAM VPCインフラストラクチャサービスアクセスロール
サービス役割 アクションの説明
リーダー サービス内では、サービス固有のリソースの表示など、読み取り専用の操作を実行できます。
ライター 「リーダー」ロール以上の権限をお持ちで、サービス固有のリソースの作成や編集なども行えます。
マネージャー サービスで定義されている通り、ライターロール以上の権限をお持ちであり、特権アクションを実行することができます。 それに加え、サービス固有のリソースを作成および編集できます。
VPNClient ユーザー ID とパスコード認証が構成されている VPN クライアントにアクセス権限を割り当てる必要がある場合にのみ、この役割を選択する必要があります。 ユーザー ID とパスコードの認証を構成する必要がある場合は、 ユーザー ID とパスコードの構成 を参照してください。
ベアメタル拡張ネットワーク・オペレーター ベア・メタル・インターフェース上の IP スプーフィングおよびインフラストラクチャー NAT を変更するためのアクセス権限があります。
ベアメタル・コンソール管理者 ベアメタル・サーバー・コンソールにアクセスできます。
IP スプーフィング・オペレーター 仮想サーバー・インスタンスの IP スプーフィング・チェックを有効または無効にすることができます。 このロールは、必要な場合にのみ付与してください。
コンソール管理者 仮想サーバー・インスタンス・コンソールにアクセスできます。 このロールではコンソールへのアクセス権のみが提供されるため、「Operator」、「Editor」、または「Administrator」など、仮想サーバーへのオペレーターアクセス権を持つ別のロールと組み合わせて使用する必要があります。

各役割にマップされる正確なアクションについて詳しくは、「 Infrastructure Services 」の IAM 役割とアクションのページを参照してください。

以下のリンクをクリックすると、IAM の役割とアクションのページにある特定のインフラストラクチャー・サービスに直接アクセスできます。

ネットワーク IAM のロールとアクション

IAMロールとアクションの算出

ストレージのIAMロールとアクション

一部の VPC タスクでは、複数の IAM アクションの許可が必要です。 例えば、仮想サーバー・インスタンスを作成するには、 is.instance.instance.create だけでなく、 is.vpc.vpc.operateis.subnet.subnet.operateis.security-group.security-group.operate、および is.volume.volume.create も必要です。 追加の条件付きアクションが必要になる場合があります。 例えば、専用ホストでインスタンスをプロビジョンする場合は、 is.dedicated-host.dedicated-host-group.operateis.dedicated-host.dedicated-host.operate が必要です。 仮想プライベート・クラウド API リファレンスには、各 API 呼び出しの許可セクション (例えば、 インスタンスの作成) が含まれています。

コンソールでの VPC インフラストラクチャー・サービスへのアクセス権限の割り当て

コンソールでアクセス権を割り当てるには、主に2つの方法があります:

  • ユーザー別のアクセス・ポリシー。 コンソールで**「管理」>「アクセス (IAM)」>「ユーザー」**ページから、ユーザー別のアクセス・ポリシーを管理できます。 IAM アクセス権限を割り当てる手順の詳細については、リソースに対するアクセス権限の管理を参照してください。
  • アクセス・グループ。 アクセス・グループは、アクセス権限をグループに 1 回割り当てることによってアクセス管理を簡素化するために使用されます。その後、ユーザーのアクセス権限を制御するために、必要に応じてグループにユーザーを追加したり、グループからユーザーを削除したりすることができます。 コンソールの**「管理」>「アクセス (IAM)」>「アクセス・グループ」**ページから、アクセス・グループと各グループのアクセス権限を管理します。 詳しくは、コンソールでのグループへのアクセス権限の割り当てを参照してください。

CLI での VPC インフラストラクチャー・サービスへのアクセス権限の割り当て

アクセス権限の割り当て、削除、および確認のステップバイステップの手順については、CLI を使用したアクセス・ロー・リソースの割り当てを参照してください。

以下の例は、 VPC Infrastructure ServicesViewer 役割を割り当てるコマンドを示しています。

サービス名には is を使用します。 また、こちらの例のように、2語以上のロール名には引用符を付けてください。

ibmcloud iam user-policy-create USER@EXAMPLE.COM --service-name is --roles "Viewer"

API を使用した VPC インフラストラクチャー・サービスへのアクセス権限の割り当て

アクセス権の割り当て、削除、および確認に関する手順については、 「API を使用したリソースへのアクセス権の割り当て 」または「 ポリシー API の作成 」を参照してください。 API でアクセス権限を割り当てるには、以下の表に記載している役割のクラウド・リソース名 (CRN) を使用します。

APIで使用するVPCインフラストラクチャ・サービスのロールID値
役割名 役割の 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
VPNClient 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 ServicesViewer 役割を割り当てるためのものです。

サービス名には「 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 ServicesViewer 役割を割り当てるためのものです。

サービス名には 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 全体を利用するような中小企業では、1 つのリソース・グループだけで十分かもしれません。 OpenStack を使い慣れているユーザー向けには、リソース・グループの概念は、OpenStack Keystone の_プロジェクト_に似ているとも言えます。

リソースの作成時にしか、リソースをリソース・グループに割り当てることはできません。 リソースを作成した後に、リソース・グループを変更することはできません。

複数のリソースグループを使用する場合は、組織内のリソースやユーザーを各リソースグループにどのように割り当てるかを事前に計画しておくことをお勧めします。

リソース・グループについて詳しくは、 リソース・グループ を参照してください。

アクセス管理タグ

アクセス管理タグとは、アクセス制御の関係を整理するためにリソースに追加されるメタデータのことです。 タグは、管理するための柔軟なリソース・グループを作成します。

タグを使用してリソースに対するアクセス権限を制御すれば、チームのプロジェクトが大きくなっても IAM ポリシーを更新する必要はありません。 アクセス管理タグを VPC インフラストラクチャー・リソースに付加し、タグに基づいてそれらのリソースへのアクセス・レベルを定義することができます。

VPC インフラストラクチャー・リソースには複雑な許可モデルがあり、単一の API 呼び出しで複数のリソースの許可を検査できます。 このような API の場合、API がアクセスする必要があるすべてのリソースにタグを付加する必要があります。 必要な API 許可について詳しくは、 VPC API リファレンス を参照してください。

API 呼び出しがリソース・グループ名に対して UNKNOWN を返した場合は、アクセス管理タグ・ポリシーを作成するときに、リソース・グループに対するビューアー権限を追加します。

アクセス管理タグの使用に関する詳細については、以下のリソースを参照してください

制限

  1. 現在の実装と API 仕様との間にはいくつかのギャップがあります。これらについては、 ここ に記載されています。

  2. インスタンス・テンプレートおよび専用ホスト・グループは、アクセス管理タグをサポートしません。 そのため、これらのタグを使用して 「オート・スケール」 および 「専用ホスト」 のアクセスを完全に管理することはできません。

  3. サイト間 VPN で使用される Internet Key Exchange (IKE) ポリシー・リソースおよび IPsec ポリシー・リソースは、アクセス管理タグをサポートしません。

サービス定義の役割を割り当てるための UI の制限

UI を使用してアクセス管理タグを持つアクセス・ポリシーにサービス定義の役割を割り当てることはサポートされていません。 この機能は、API および CLI を介してのみサポートされます。

サービス定義の役割を割り当てるための API の使用

UI を使用してアクセス管理タグを持つアクセス・ポリシーにサービス定義の役割を割り当てることはサポートされていません。 この機能は、API および CLI を介してのみサポートされます。 API については、以下の例を使用してください。

curl --location --request POST 'https://iam.cloud.ibm.com/v1/policies' \
--header 'Content-Type: application/json' \
--header 'Authorization: <your token>' \
--data-raw '{
    "description": "useful description here",
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "<user iam-id>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:is::::serviceRole:VPNClient"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                            "name": "serviceName",
                            "value": "is",
                            "operator": "stringEquals"
                        },
                        {
                            "name": "accountId",
                            "value": "<your account id>"
                        }
            ],
            "tags":[
                {
                    "name": "abc",
                    "value": "test"
                }
            ]
        }
    ]
}'

サービス定義の役割を割り当てるための CLI の使用

UI を使用してアクセス管理タグを持つアクセス・ポリシーにサービス定義の役割を割り当てることはサポートされていません。 この機能は、API および CLI を介してのみサポートされます。 CLI の場合は、以下の例を使用します。

ic iam access-group-policy-create Developers_MyApp --roles Viewer --service-name kms --tags abc:test