IBM Cloud Docs
VPC インフラストラクチャー・サービスの IAM アクセス権限の管理

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 を使用します。 また、1語以上のロール名については、この例のように引用符で囲んでください。

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