コンテキスト・ベースの制限によるクラスター・リソースの保護

コンテキストベースの制限により、 アカウント所有者と管理者は、アクセス要求のコンテキストに基づいて、 IBM Cloud® リソースに対するアクセス制限を定義し、実施することができます。 IBM Cloud Kubernetes Service リソースへのアクセスは、コンテキストベースの制限とアイデンティティおよびアクセス管理ポリシーで制御できる。

これらの制限は、ID に基づく従来の IAM ポリシーと連携して、追加の保護レイヤーを提供します。 IAM ポリシーとは異なり、コンテキスト・ベースの制限はアクセス権限を割り当てません。 コンテキスト・ベースの制限は、アクセス要求が、構成された許可されるコンテキストからのものであるかどうかを検査します。 IAM アクセスとコンテキスト・ベースの制限の両方によってアクセスが強制されるので、資格情報が漏洩した場合や適切に管理されなかった場合でも、コンテキスト・ベースの制限によって保護が提供されます。 詳しくは、コンテキスト・ベースの制限とはを参照してください。

ルールの作成、更新、削除を行うには、 IBM Cloud Kubernetes Service サービスで Administrator ロールを持つ必要があります。 また、ユーザーがネットワーク・ゾーンを作成、更新、または削除するには、コンテキスト・ベースの制限サービスに対する編集者または管理者の役割を持っている必要があります。

生成される Activity Tracker または監査ログ・イベントは、 IBM Cloud Kubernetes Serviceではなく、コンテキスト・ベースの制限サービスから生成されます。 詳しくは、 コンテキスト・ベースの制約事項のモニター を参照してください。

Cluster APIタイプを使用して制限できるクラスタコントロールプレーンへのアクセスの試みは、 Activity Tracker または監査ログイベントを生成しません。

IBM Cloud Kubernetes Service とコンテキスト・ベースの制限との統合方法

クラスタ制御プレーンAPIまたは IBM Cloud クラスタ管理APIに対してコンテキストベースの制限(CBR)を作成できます。 コンテキスト・ベースの制限により、以下のリソースを保護できます。

クラスタ制御プレーンAPI
クラスタまたはクラスタ内の特定のネームスペースの IBM Cloud Kubernetes Service API へのアクセスを保護します。 例えば、 Kubernetes ネームスペースを作成するためにAPIを保護することができます。
管理 API
特定のクラスタの IBM Cloud Kubernetes Service API へのアクセスを保護します。 例えば、APIを保護してクラスタを作成することができる。

Kubernetes LoadBalancer によって公開されるウェブ・サーバーなど、 IBM Cloud Kubernetes Service クラスター上で実行されるアプリケーションは、CBR ルールによって制限されない。

クラスター・リソースの保護

CBR ルールを作成して、特定の領域およびクラスターを保護することができます。

クラスター
特定の IBM Cloud Kubernetes Service クラスターを保護します。 CBR ルールでクラスターを選択した場合、そのルールに関連付けられたネットワーク・ゾーン内のリソースからのトラフィックのみがそのクラスターと対話できます。
CLIを使用する場合は、 --service-instance CLUSTER-ID オプションを指定して特定のクラスタを保護できます。
APIを使用する場合は、リソース属性で "name": "serviceInstance","value": "CLUSTER-ID"
リージョン
特定の地域の IBM Cloud Kubernetes Service リソースを保護します。 CBR ルールでリージョンを選択すると、そのルールに関連付けられたネットワーク・ゾーン内のリソースからのトラフィックのみが、そのリージョン内のリソースと対話できます。
CLIを使用する場合は、 --region REGION オプションを指定して、特定の地域のリソースを保護することができます。
APIを使用する場合は、リソース属性で "name": "region","value": "REGION" フィールドを指定できます。
リソース・グループ
特定のリソースグループ内の IBM Cloud Kubernetes Service リソースを保護します。
CLIを使用する場合は、 --resource-group-id RESOURCE-GROUP-ID オプションを指定して、特定のリソースグループのリソースを保護することができます。
APIを使用する場合は、リソース属性で "name": "resourceGroupId","value": "RESOURCE-GROUP-ID" フィールドを指定できます。

特定の API の保護

CBR ルールを作成して、 IBM Cloud Kubernetes Serviceの以下の API タイプを保護できます。

クラスター・コントロール・プレーン API
名前空間やポッドなどを作成するための API など、クラスター内の API へのアクセスを保護します。 クラスター API タイプに適用される CBR ルールは、クラスター API サーバーへのアクセスを制御します。これには、そのクラスターに対するすべての kubectl コマンドが含まれます。 CBR ルールでクラスター・コントロール・プレーン API を選択した場合、そのルールに関連付けられているネットワーク・ゾーン内のリソースからのトラフィックのみがクラスター・コントロール・プレーン API と対話できます。 その他の要求はすべてブロックされます。
CLIを使用する場合は、 --api-types オプションと crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster タイプを指定できる。
APIを使用する場合は、 "operations" の仕様で "api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster"
管理 API
クラスター、ワーカー・プールなどをプロビジョニングおよび管理するための API へのアクセスを保護します。 管理 API タイプに適用される CBR ルールは、 ibmcloud ks clustersibmcloud ks cluster create などのすべての ibmcloud ks コマンド呼び出しを含む IBM Cloud Kubernetes Service API へのアクセスを制御します。 CBR ルールで管理 API を選択すると、ルールに関連付けられたネットワーク・ゾーン内のリソースが管理 API と対話できるようになります。
CLIを使用する場合は、 --api-types オプションと crn:v1:bluemix:public:containers-kubernetes::::api-type:management タイプを指定できる。
APIを使用する場合は、 "operations" の仕様で "api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:management"

CBR シナリオの例に従うには、 コンテキスト・ベースの制約事項のセットアップ を参照してください。

CLIでサービス・リファレンス・ターゲットのリストを取得するには、 ibmcloud cbr service-ref-targets コマンドを実行します。

CBR が有効になっているとき、 IBM Cloud Kubernetes Service が他の IBM Cloud リソースへのアクセスを維持できるようにする

以下のサービスに対して作成されたルールについては、ネットワーク・ゾーンに containers-kubernetes を追加する必要があります。

IAM Identity サービス
IBM Cloud Kubernetes Service がクラスター API キーや IBM Cloud Container Registry トークンや API キーなどのトークンおよび API キーを作成できるようにします。
IAM アクセス管理サービス
IBM Cloud Kubernetes Service が IBM Cloud Container Registryへのリーダー・サービス・アクセス役割の IAM アクセス・ポリシーを作成できるようにします。
IAM アクセス・グループ・サービス
クラスター内の RBAC と IAM アクセス・ポリシーを同期するときに、 IBM Cloud Kubernetes Service がアクセス・グループを検索できるようにします。
ユーザー管理
クラスター内の RBAC と IAM アクセス・ポリシーを同期するときに、 IBM Cloud Kubernetes Service がユーザー情報にアクセスできるようにします。
Key Protect:
IBM Cloud Kubernetes Service がクラスターで暗号化を有効にできるようにします。
Block Storage for VPC (サーバープロテクト)
IBM Cloud Kubernetes Service が Block Storage for VPC ボリュームにアクセスし、暗号化できるようにする。
VPC
VPC内のリソースに IBM Cloud Kubernetes Service。

ネットワーク・ゾーンの作成

ネットワーク・ゾーンは、CBR ルールの作成時に定義するターゲット・リソースの許可リストとして機能します。 ネットワーク・ゾーンまたは許可リストを作成した後、ネットワーク・ゾーンがアクセスできるリソースを定義するルールを作成できます。

他の IBM Cloud リソースに適用されるルール( IBM Cloud Object Storage を保護するルールや、一部のクラスタ操作が失敗する可能性があるルールなど)については、必ず containers-kubernetes サービスをネットワークゾーンに追加してください。 詳しくは、 CBRを使用して、 IBM Cloud Kubernetes Service が他の IBM Cloud リソースにアクセスできるようにするを 参照。

ネットワーク・ゾーンを作成する前に、 制限 を確認してください。

API からのネットワーク・ゾーンの作成

/v1/zones API を使用してネットワーク・ゾーンを作成できます。 詳しくは、API資料をご覧ください。 containers-kubernetes サービスをネットワーク・ゾーンに追加して、 IBM Cloud Kubernetes Service がアカウント内のリソースおよびサービスにアクセスできるようにすることができます。

ネットワーク・ゾーン・ペイロードには複数のアドレス・タイプを含めることができます。 詳しくは、 API 資料 のペイロードの例を参照してください。

IBM Cloud Kubernetes Service をネットワーク・ゾーンに追加するペイロードの例。 IBM Cloud Kubernetes Service の serviceRef 属性は containers-kubernetes です。

{
  "name": "Example zone 1",
  "description": "",
  "addresses": [
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "containers-kubernetes",
        "account_id": "ACCOUNT-ID"
      }
    }
  ]
}

複数のサービス、IP アドレス、および VPC をネットワーク・ゾーンに追加するペイロードの例。

{
  "name": "zone",
  "description": "",
  "addresses": [
    {
      "type": "ipAddress",
      "value": "192.168.0.0"
    },
    {
      "type": "vpc",
      "value": "crn:v1:bluemix:public:is:us-east:a/CRN"
    },
    {
      "type": "vpc",
      "value": "crn:v1:bluemix:public:is:us-south:a/CRN"
    },
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "cloud-object-storage",
        "account_id": "ACCOUNT-ID"
      }
    },
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "codeengine",
        "account_id": "ACCOUNT-ID"
      }
    },
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "containers-kubernetes",
        "account_id": "ACCOUNT-ID"
      }
    },
    {
      "type": "serviceRef",
      "ref": {
        "service_type": "platform_service",
        "account_id": "ACCOUNT-ID"
      }
    },
    {
      "type": "serviceRef",
      "ref": {
        "service_name": "iam-groups",
        "account_id": "ACCOUNT-ID"
      }
    }
  ],
  "excluded": []
}

CLI からのネットワーク・ゾーンの作成

  1. CLI からネットワーク・ゾーンを作成するには、 CBR CLI プラグインをインストールします

  2. cbr-zone-create コマンドを使用して、ネットワーク・ゾーンにリソースを追加できます。 詳しくは、CBR CLI リファレンス を参照してください。 IBM Cloud Kubernetes Service の service_namecontainers-kubernetes であることに注意してください。

    使用可能なサービス参照のリストを見つけるには、 ibmcloud cbr service-ref-targets コマンド を実行します。

    containers-kubernetes サービスをネットワーク・ゾーンに追加するコマンドの例。

    ibmcloud cbr zone-create --name example-zone-1 --description "Example zone 1" --service-ref service_name=containers-kubernetes
    

    以下の例では、単一のパブリック IP アドレスにアクセスを許可するネットワーク・ゾーンを作成します。 この例は、 1 つの IP サンプル・ルール と組み合わせて使用することもできます。 このシナリオについて詳しくは、 コンテキスト・ベースの制限のセットアップ を参照してください。

    ibmcloud cbr zone-create --addresses 129.41.86.7 --description "Allow only client IP" --name allow-client-ip
    

コンソールからのネットワーク・ゾーンの作成

  1. 許可リストに追加するリソースを決定します。
  2. コンソールでコンテキスト・ベースの制限を作成する 手順に従います。 Kubernetes サービスをネットワーク・ゾーンに追加して、 IBM Cloud Kubernetes Service がアカウント内のサービスおよびリソースにアクセスできるようにします。

ルールの作成

アカウント内のリソースへのアクセスを保護するためのルールを定義します。 ルールで定義するコンテキストによって、ネットワーク・ゾーン内のリソース (許可リスト) がルールで定義されたリソースとどのように対話できるかが決まります。

ルールを作成する前に、 制限 を確認してください。

API の使用によるルールの作成

ルールを作成するための要求例を以下に示します。 v1/rules API について詳しくは、 API の資料 を参照してください。

ルールを作成した後、IAM TTL 応答キャッシュが原因で、そのルールを更新するまでに最大で 10 分かかる場合があります。

以下のペイロードの例では、 CLUSTER-ID クラスターを保護するルールを作成します。 NETWORK-ZONE-ID ゾーン内のリソースのみがクラスターにアクセスできます。 operations が指定されていないため、 NETWORK-ZONE-ID ゾーン内のリソースは cluster API と management API の両方にアクセスできます。

{
  "description": "Example rule 1",
  "resources": [
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "ACCOUNT-ID"
        },
        {
          "name": "serviceName",
          "value": "containers-kubernetes"
        },
        {
          "name": "serviceInstance",
          "value": "CLUSTER-ID"
        }
      ]
    }
  ],
  "contexts": [
    {
      "attributes": [
        {
          "name": "networkZoneId",
          "value": "NETWORK-ZONE-ID"
        },
        {
          "name": "endpointType",
          "value": "private"
        }
      ]
    }
  ]
}

以下のペイロードの例では、 CLUSTER-ID クラスターを保護するルールを作成します。 クラスターにアクセスできるのは、 NETWORK-ZONE-ID ゾーンに定義されているリソースのみです。 cluster API タイプが指定されているため、 NETWORK-ZONE-ID ゾーン内のリソースは、プライベート・ネットワークを介してクラスター API を介してクラスターにアクセスできます。

{
  "description": "Example rule 2",
  "resources": [
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "ACCOUNT-ID"
        },
        {
          "name": "serviceName",
          "value": "containers-kubernetes"
        },
        {
          "name": "serviceInstance",
          "value": "CLUSTER-ID"
        }
      ]
    }
  ],
  "operations": {
    "api_types": [
      {
        "api_type_id": "crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster"
      }
    ]
  },
  "contexts": [
    {
      "attributes": [
        {
          "name": "networkZoneId",
          "value": "NETWORK-ZONE-ID"
        },
        {
          "name": "endpointType",
          "value": "private"
        }
      ]
    }
  ]
}

CLI からのルールの作成

  1. CLI からルールを作成するには、 CBR CLI プラグインをインストールします
  2. ibmcloud cbr rule-create コマンド を使用して、CBR ルールを作成できます。 詳しくは、CBR CLI リファレンス を参照してください。 IBM Cloud Kubernetes Service の service_namecontainers-kubernetes であることに注意してください。 サービス名のリストを見つけるには、 ibmcloud cbr service-ref-targets コマンドを実行します。 サービスの API タイプのリストを見つけるには、 ibmcloud cbr api-types --service-name SERVICE コマンドを実行します。

addresses キー、 cluster API タイプ、および ipAddress タイプを使用するルールを作成するためのサンプル・コマンド。

ibmcloud cbr rule-create my-rule-1 --service-name containers-kubernetes --api-type crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --zone-id ZONE-ID

以下のコマンドは、 CLUSTER-ID クラスターを保護するルールを作成します。 NETWORK-ZONE-ID ネットワーク・ゾーン内のリソースのみがクラスターにアクセスできます。 このルールには、 clustermanagement の両方の API タイプが含まれます。

ibmcloud cbr rule-create my-rule-2 --service-name containers-kubernetes --service-instance CLUSTER-ID --zone-id NETWORK-ZONE-ID

以下のコマンド例では、すべてのプライベート・ネットワーク接続を許可するルールを作成しますが、パブリック・ネットワークを介してクラスターに接続できるのは allow-client-ip ネットワーク・ゾーン内のリソースのみです。 このシナリオの詳細については、 コンテキストベースの制限の設定を 参照してください。

ibmcloud cbr rule-create --api-types crn:v1:bluemix:public:containers-kubernetes::::api-type:cluster --description "privateAccess=allowAll, publicAccess=oneIP" --service-name containers-kubernetes --service-instance CLUSTER-ID --context-attributes endpointType=private --context-attributes endpointType=public,networkZoneId=allow-client-ip

コンソールからのルール作成

  1. 使用可能なコンテキストを確認 し、作成する規則を決定します。
  2. コンソールでコンテキスト・ベースの制限を作成する 手順に従います。

制限

  • ルールの適用を作成、適用、または無効化した後、変更が有効になるまでに最大で 10 分かかる場合があります。
  • 以下の制限は、すべてのAPIタイプまたは cluster APIタイプに適用される IBM Cloud Kubernetes Service CBRルールに適用される:
    • IPv6 アドレスを含むネットワークゾーンを参照してはならない。 cluster タイプに含まれるAPIは、 IPv6 をサポートしていない。
    • 適用されるネットワークゾーンで、 IBM Cloud Object Storage や Key Protect のような他のサービスを参照してはならない。
    • クラスタAPIタイプの Report-only
    • プライベート・ルールでは200IP/サブネット以下、パブリック・ルールでは500IP/サブネット以下に制限される。
  • 2022 年 10 月 8 日より前に作成された一部の IBM Cloud Kubernetes Service クラスターは、クラスターの API サーバーに公開 CBR ルールを適用できません。 クラスターがこれらのパブリック・クラスター API タイプ CBR ルールをサポートしているかどうかを確認するには、 ibmcloud ks cluster get -c <CLUSTER-ID> コマンドを実行します。 いずれかのサービス・エンドポイント URL が https://cXXX (XXX は任意の 3 桁の数字) で始まる場合、クラスターは公開 CBR ルールをサポートします。 サービス・エンドポイント URL が https://cX ( c の後の数字は 1 桁) で始まる場合、クラスターは、クラスターの APIserver に対してパブリック CBR ルールを適用できません。 パブリック CBR ルールを使用するには、新規クラスターを作成する必要があります。