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操作のために名前空間レベルまたはクラスター全体の権限を付与するために使用されます。 |
|
RAMユーザーまたはRAMロールを使用してクラスターとクラスター内のアプリケーションを管理する場合は、RAMユーザーまたはRAMロールに対してRAM権限付与とRBAC権限付与の両方を実行する必要があります。 RBAC認証を実行する前に、RAM認証を完了する必要があります。 さまざまなシナリオで承認を完了するには、次のトピックを参照してください。
O&Mエンジニアに権限を付与するには、「シナリオ1: O&Mエンジニアにクラスターとアプリケーションを管理する権限を付与する」をご参照ください。
開発者に権限を付与するには、「シナリオ2: 開発者にクラスターとアプリケーションを管理する権限を付与する」をご参照ください。
権限管理者に権限を付与するには、「シナリオ3: 権限管理者にRAMユーザーとRAMロールの権限を管理する権限を付与する」をご参照ください。
RAMユーザーまたはRAMロールを削除しても、RAMユーザーまたはRAMロールのRBAC権限はACKクラスターのkubeconfigファイルから削除されません。 したがって、ユーザーのRAMユーザーまたはRAMロールを削除する前に、ユーザーのkubeconfigファイルを取り消す必要があります。 詳細については、「KubeConfig資格情報の取り消し」をご参照ください。
シナリオ1: O&Mエンジニアにクラスターとアプリケーションを管理する権限を付与する
O&Mエンジニアには、クラスターとアプリケーションを管理および保守するための権限が必要です。 RAM認証とRBAC認証の両方を実行する必要があります。
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によるユーザー認証の強化」および「関数別の操作のリスト」をご参照ください。
RBAC権限付与
RAM権限付与を実行した後、RAMユーザーまたはRAMロールに対してRBAC権限付与を実行する必要があります。 次の表に、ACKによって提供される事前定義されたRBACロールを示します。
ロール
クラスターリソースへのアクセス許可
管理者
すべての名前空間のリソースに対する読み取りおよび書き込み権限。
O&Mエンジニア
すべての名前空間のコンソールに表示されているKubernetesリソースに対する読み取りおよび書き込み権限、およびノード、永続ボリューム (PV) 、名前空間、クォータに対する読み取り専用権限。
開発者
すべての名前空間または指定された名前空間のコンソールで表示されるリソースに対する読み取りおよび書き込み権限。
Restricted user
すべての名前空間または指定された名前空間のコンソールに表示されるリソースに対する読み取り専用の権限。
ACKコンソールの [権限付与] ページで、RAMユーザーまたはRAMロールにO&M Engineer権限を付与し、ロールが適用されるクラスターと名前空間を指定します。
定義済みのロールを割り当てると、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ポリシーをアタッチする必要があります。
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
ポリシーをアタッチします。RBAC権限付与
ACKコンソールの [権限付与] ページで、RAMユーザーまたはRAMロールに開発者権限を付与し、ロールが適用されるクラスターと名前空間を指定します。
定義済みのロールを割り当てると、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権限がないことを示します。
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" }
RBAC権限付与
RAMユーザーまたはRAMロールにAdministrator権限またはcluster-admin権限を付与し、ロールが適用されるクラスターと名前空間を指定する必要があります。
説明デフォルトでは、Alibaba Cloudアカウントとクラスター所有者にはcluster-adminロールが割り当てられているため、クラスター内のすべてのKubernetesリソースにフルアクセスできます。
RAMユーザーまたはRAMロールに対してRAM権限付与およびRBAC権限付与を実行した後、RAMユーザーまたはRAMロールを使用して、指定したスコープ内で有効になる他のRAMユーザーまたはRAMロールにRBAC権限を付与できます。 詳細については、「RAMユーザーまたはRAMロールへのRBAC権限の付与」をご参照ください。