すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:承認のベストプラクティス

最終更新日:Oct 31, 2024

Container Service for Kubernetes (ACK) の承認システムは、RAM (Resource Access Management) 承認とRBAC (role-based access control) 承認で構成されています。 RAM権限は、クラウドリソースに対する権限を付与するために使用されます。 RBAC権限付与は、クラスター内のKubernetesリソースに対する権限を付与するために使用されます。 2つの方法を使用して、ユーザーのロールと要件に基づいてユーザーに権限を付与できます。 このトピックでは、O&Mエンジニア、開発者、および認可管理者にクラスターとアプリケーションを管理する権限を付与するために使用できるRAM権限付与とRBAC権限付与のベストプラクティスについて説明します。

ACK認証システム

ACKの認証システムは、RAM認証とRBAC認証で構成されています。 RAM権限は、クラウドリソースに対する権限を付与するために使用されます。 RBAC権限付与は、クラスター内のKubernetesリソースに対する権限を付与するために使用されます。 次の図は、ACKの認可システムを示しています。授权体系

権限付与タイプ

シナリオ

API呼び出しで操作可能なリソース

RAM の権限付与

O&M操作のためにACKおよびその他のAlibaba CloudサービスのAPI操作に対する権限を付与するために使用されます。

  • クラスター: 作成、表示、アップグレード、および削除。

  • ノードプール: 作成、変更、スケール

  • 承認管理。

  • 監視、ログ、イベント。

RBAC認証

ACKクラスターのKubernetesリソースに対して、O&M操作のために名前空間レベルまたはクラスター全体の権限を付与するために使用されます。

  • ワークロードリソース: Deployment、StatefulSet、DaemonSet、Job、CronJob、ReplicaSet、Horizontal Pod Autoscaler (HPA) 、およびポッド。

  • ネットワークリソース: サービス、Ingress、およびNetworkPolicy。

  • ストレージリソース: 永続ボリューム (PV) 、永続ボリュームクレーム (PVC) 、およびStorageClass。

  • 名前空間、ConfigMap、およびシークレット。

RAMユーザーまたはRAMロールを使用してクラスターとクラスター内のアプリケーションを管理する場合は、RAMユーザーまたはRAMロールに対してRAM権限付与とRBAC権限付与の両方を実行する必要があります。 RBAC認証を実行する前に、RAM認証を完了する必要があります。 さまざまなシナリオで承認を完了するには、次のトピックを参照してください。

重要

RAMユーザーまたはRAMロールを削除しても、RAMユーザーまたはRAMロールのRBAC権限はACKクラスターのkubeconfigファイルから削除されません。 したがって、ユーザーのRAMユーザーまたはRAMロールを削除する前に、ユーザーのkubeconfigファイルを取り消す必要があります。 詳細については、「KubeConfig資格情報の取り消し」をご参照ください。

シナリオ1: O&Mエンジニアにクラスターとアプリケーションを管理する権限を付与する

O&Mエンジニアには、クラスターとアプリケーションを管理および保守するための権限が必要です。 RAM認証とRBAC認証の両方を実行する必要があります。

  1. RAM権限付与

    AliyunCSFullAccessおよびAliyunCSReadOnlyAccess RAMポリシーを使用して、ACK関連の権限を付与できます。

    • AliyunCSFullAccessには、ACKのすべてのAPI操作を呼び出す権限が含まれています。

    • AliyunCSReadOnlyAccessには、読み取り専用アクセスのためにACKのAPI操作を呼び出す権限が含まれています。

    RAMコンソールのRAMユーザーまたはRAMロールにAliyunCSFullAccessまたはAliyunCSReadOnlyAccessポリシーをアタッチできます。 詳細については、「RAMユーザーへの権限の付与」および「RAMロールへの権限の付与」をご参照ください。

    きめ細かいアクセス制御が必要な場合は、カスタムポリシーをアタッチできます。 詳細については、「カスタムRAMポリシーの作成」をご参照ください。

    この場合、使用するRAMユーザーまたはRAMロールに次のポリシーをアタッチできます。RAMポリシーのRAMアクションの詳細については、「アクションの説明」をご参照ください。

    {
      "Statement": [
        {
          "Action": [
            "cs:GetClusters",
            "cs:DescribeClustersV1",
            "cs:DescribeClusterNodes",
            "cs:DescribeClusterUserKubeconfig",
            "cs:DescribeClustersV1",
            "cs:DescribeClusterResources",
            "cs:DescribeUserQuota",
            "cs:DescribeClusterLogs",
            "cs:ModifyCluster",
            "cs:UpgradeCluster",
            "cs:GetUpgradeStatus",
            "cs:ResumeUpgradeCluster",
            "cs:PauseClusterUpgrade",
            "cs:CancelClusterUpgrade",
            "cs:InstallClusterAddons",
            "cs:UpgradeClusterAddons",
            "cs:DescribeClusterAddonsUpgradeStatus",
            "cs:DescribeAddons",
            "cs:RemoveClusterNodes",
            "cs:CreateClusterNodePool",
            "cs:DescribeClusterNodePools",
            "cs:DescribeClusterNodePoolDetail",
            "cs:ScaleClusterNodePool",
            "cs:ModifyClusterNodePool",
            "cs:DeleteClusterNodepool",
            "cs:UnInstallClusterAddons"
          ],
          "Effect": "Allow",
          "Resource": [
            "acs:cs:*:*:cluster/<yourclusterID>"
          ]
        }
      ],
      "Version": "1"
    }

    ACKのAPI操作の詳細については、「 [製品の変更] ACK APIによるユーザー認証の強化」および「関数別の操作のリスト」をご参照ください。

  2. RBAC権限付与

    RAM権限付与を実行した後、RAMユーザーまたはRAMロールに対してRBAC権限付与を実行する必要があります。 次の表に、ACKによって提供される事前定義されたRBACロールを示します。

    ロール

    クラスターリソースへのアクセス許可

    管理者

    すべての名前空間のリソースに対する読み取りおよび書き込み権限。

    O&Mエンジニア

    すべての名前空間のコンソールに表示されているKubernetesリソースに対する読み取りおよび書き込み権限、およびノード、永続ボリューム (PV) 、名前空間、クォータに対する読み取り専用権限。

    開発者

    すべての名前空間または指定された名前空間のコンソールで表示されるリソースに対する読み取りおよび書き込み権限。

    Restricted user

    すべての名前空間または指定された名前空間のコンソールに表示されるリソースに対する読み取り専用の権限。

    ACKコンソールの [権限付与] ページで、RAMユーザーまたはRAMロールにO&M Engineer権限を付与し、ロールが適用されるクラスターと名前空間を指定します。 RBAC

    定義済みのロールを割り当てると、RAMユーザーまたはRAMロールのClusterRoleBindingオブジェクトが自動的に作成されます。 次のサンプルコードは、O&Mエンジニアロールによって提供される権限を示しています。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cs:ops
    rules:
    - apiGroups: [""]
      resources:  ["pods", "pods/attach", "pods/exec", "pods/portforward", "pods/proxy"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: [""]
      resources:  ["configmaps", "endpoints", "persistentvolumeclaims", "replicationcontrollers", "replicationcontrollers/scale", "secrets", "serviceaccounts", "services", "services/proxy"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: [""]
      resources:  ["bindings", "events", "limitranges", "namespaces/status", "replicationcontrollers/status", "pods/log", "pods/status", "resourcequotas", "resourcequotas/status", "componentstatuses"]
      verbs: ["get", "list", "watch"]
    - apiGroups: [""]
      resources:  ["namespaces", "nodes", "persistentvolumes"]
      verbs: ["get", "list", "watch", "patch"]
    - apiGroups: ["coordination.k8s.io"]
      resources:  ["leases"]
      verbs: ["get"]
    - apiGroups: ["apps"]
      resources:  ["daemonsets", "deployments", "deployments/rollback", "deployments/scale", "replicasets", "replicasets/scale", "statefulsets"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["autoscaling"]
      resources:  ["horizontalpodautoscalers"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["batch"]
      resources:  ["cronjobs", "jobs"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["extensions"]
      resources:  ["daemonsets", "deployments", "deployments/rollback", "deployments/scale","ingresses","replicasets", "replicasets/scale", "replicationcontrollers/scale"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["networking.k8s.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["servicecatalog.k8s.io"]
      resources:  ["clusterserviceclasses", "clusterserviceplans", "clusterservicebrokers", "serviceinstances", "servicebindings"]
      verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["servicecatalog.k8s.io"]
      resources:  ["clusterservicebrokers/status", "clusterserviceclasses/status", "clusterserviceplans/status", "serviceinstances/status", "serviceinstances/reference", "servicebindings/status",]
      verbs: ["update"]
    - apiGroups: ["storage.k8s.io"]
      resources:  ["storageclasses"]
      verbs: ["get", "list", "watch"]
    - apiGroups: ["alicloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["policy"]
      resources:  ["poddisruptionbudgets"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["metrics.k8s.io"]
      resources: ["pods", "nodes"]
      verbs: ["get", "watch", "list"]
    - apiGroups: ["networking.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["config.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["rbac.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["istio.alibabacloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["authentication.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["log.alibabacloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["monitoring.kiali.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["kiali.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["serving.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["eventing.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["messaging.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["sources.eventing.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["tekton.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["alert.alibabacloud.com"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]

    きめ細かいアクセス制御が必要な場合は、カスタムClusterRoleを作成できます。 詳細は、「RBAC」をご参照ください。 カスタムClusterRoleを作成したら、ACKコンソールの [権限] ページに移動し、[カスタム] を選択し、ドロップダウンリストから作成したClusterRoleを選択します。 詳細については、「RBACロールのカスタマイズ」をご参照ください。

シナリオ2: クラスターとアプリケーションを管理する権限を開発者に付与する

開発者は、ACKクラスターでKubernetesリソースを管理するための権限のみを必要とします。 したがって、RBAC認証を実行するだけで済みます。

重要

権限付与を実行する前に、RAMユーザーまたはRAMロールにACKへの読み取り専用アクセスを許可する必要があります。 これを行うには、RAMユーザーまたはRAMロールにRAMポリシーをアタッチする必要があります。

  1. RAM権限付与

    RAMコンソールに移動し、カスタムポリシーを作成します。 次に、使用するRAMユーザーまたはRAMロールにポリシーをアタッチします。 詳細については、「カスタムRAMポリシーの作成」をご参照ください。 例:

    {
      "Statement": [
        {
          "Action": [
            "cs:Get*",
            "cs:List*",
            "cs:Describe*"
          ],
          "Effect": "Allow",
          "Resource": [
            "acs:cs:*:*:cluster/c5cc77f5180a449a4a48cf8001831xxxx" # Replace the cluster ID with the ID of the cluster that you want to manage. 
          ]
        }
      ],
      "Version": "1"
    }
    説明

    すべてのACKクラスターに対してRAMユーザーまたはRAMロールに読み取り専用権限を付与するには、RAMユーザーまたはRAMロールにAliyunCSReadOnlyAccessポリシーをアタッチします。

  2. RBAC権限付与

    ACKコンソールの [権限付与] ページで、RAMユーザーまたはRAMロールに開発者権限を付与し、ロールが適用されるクラスターと名前空間を指定します。 developer

    定義済みのロールを割り当てると、RAMユーザーまたはRAMロールのClusterRoleBindingオブジェクトが自動的に作成されます。 次のサンプルコードは、開発者ロールによって提供される権限を示しています。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cs:ns:dev
    rules:
    - apiGroups: [""]
      resources:  ["pods", "pods/attach", "pods/exec", "pods/portforward", "pods/proxy"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: [""]
      resources:  ["configmaps", "endpoints", "persistentvolumeclaims", "replicationcontrollers", "replicationcontrollers/scale", "secrets", "serviceaccounts", "services", "services/proxy"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: [""]
      resources:  ["events", "replicationcontrollers/status", "pods/log", "pods/status"]
      verbs: ["get", "list", "watch"]
    - apiGroups: ["apps"]
      resources:  ["daemonsets", "deployments", "deployments/rollback", "deployments/scale", "replicasets", "replicasets/scale", "statefulsets"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["autoscaling"]
      resources:  ["horizontalpodautoscalers"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["batch"]
      resources:  ["cronjobs", "jobs"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["extensions"]
      resources:  ["daemonsets", "deployments", "deployments/rollback", "deployments/scale","ingresses","replicasets", "replicasets/scale", "replicationcontrollers/scale"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["networking.k8s.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["servicecatalog.k8s.io"]
      resources:  ["clusterserviceclasses", "clusterserviceplans", "clusterservicebrokers", "serviceinstances", "servicebindings"]
      verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["servicecatalog.k8s.io"]
      resources:  ["clusterservicebrokers/status", "clusterserviceclasses/status", "clusterserviceplans/status", "serviceinstances/status", "serviceinstances/reference", "servicebindings/status",]
      verbs: ["update"]
    - apiGroups: ["alicloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["policy"]
      resources:  ["poddisruptionbudgets"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["networking.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["config.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["rbac.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["istio.alibabacloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["authentication.istio.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["log.alibabacloud.com"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["monitoring.kiali.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["kiali.io"]
      resources:  ["*"]
      verbs: ["create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"]
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["serving.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["eventing.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["messaging.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["sources.eventing.knative.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["tekton.dev"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]
    - apiGroups: ["alert.alibabacloud.com"]
      resources: ["*"]
      verbs: ["get", "list", "create", "watch", "patch", "update", "delete", "deletecollection"]

    きめ細かいアクセス制御が必要な場合は、カスタムClusterRoleを作成できます。 詳細は、「RBAC」をご参照ください。 カスタムClusterRoleを作成したら、ACKコンソールの [権限] ページに移動し、[カスタム] を選択し、ドロップダウンリストから作成したClusterRoleを選択します。 詳細については、「RBACロールのカスタマイズ」をご参照ください。

シナリオ3: 権限付与管理者にRAMユーザーとRAMロールの権限を管理する権限を付与する

権限管理者には、他のRAMユーザーとロールのRBAC権限を管理する権限が必要です。 デフォルトでは、RAMユーザーまたはRAMロールを使用して、他のRAMユーザーまたはRAMロールにRBAC権限を付与することはできません。 ACKコンソールコンソールの [承認] ページで、次のメッセージが表示されます。 Alibaba Cloudアカウントの所有者または許可されたRAMユーザーに連絡して、権限を要求してください。 これは、使用するRAMユーザーに必要なRAM権限とRBAC権限がないことを示します。

  1. RAM権限付与

    使用するRAMユーザーまたはRAMロールにアタッチされているポリシーに、次の権限を追加する必要があります。

    • Alibaba Cloudアカウントに属する他のRAMユーザーまたはRAMロールを照会します。

    • 指定したRAMユーザーまたはRAMロールにRAMポリシーをアタッチします。

    • RAMユーザーまたはRAMロールのRBAC権限を照会します。

    • 他のRAMユーザーまたはRAMロールにRBAC権限を付与します。

    RAMコンソールに移動し、カスタムポリシーを作成します。 次に、使用するRAMユーザーまたはRAMロールにポリシーをアタッチします。 詳細については、「カスタムRAMポリシーの作成」をご参照ください。 例:

    {
        "Statement": [{
                "Action": [
                    "ram:Get*",
                    "ram:List*",
                    "cs:GetUserPermissions",
                    "cs:GetSubUsers",
                    "cs:GrantPermission"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "ram:AttachPolicyToUser",
                    "ram:AttachPolicyToRole"
                ],
                "Effect": "Allow",
                "Resource":  [
                    "acs:ram:*:*:policy/xxxxxx", # Replace xxxxxx with the name of the RAM policy that you want to attach. If you replace xxxxxx with an asterisk (*), the RAM user or RAM role is authorized to attach all RAM policies to other RAM users or RAM roles. 
                    "acs:*:*:*:user/*"
                ]
            }
        ],
        "Version": "1"
    }
  2. RBAC権限付与

    RAMユーザーまたはRAMロールにAdministrator権限またはcluster-admin権限を付与し、ロールが適用されるクラスターと名前空間を指定する必要があります。

    説明

    デフォルトでは、Alibaba Cloudアカウントとクラスター所有者にはcluster-adminロールが割り当てられているため、クラスター内のすべてのKubernetesリソースにフルアクセスできます。

    cluster-admin

RAMユーザーまたはRAMロールに対してRAM権限付与およびRBAC権限付与を実行した後、RAMユーザーまたはRAMロールを使用して、指定したスコープ内で有効になる他のRAMユーザーまたはRAMロールにRBAC権限を付与できます。 詳細については、「RAMユーザーまたはRAMロールへのRBAC権限の付与」をご参照ください。