アクセス制御およびKubernetesエンジン(OKE)について
Kubernetes Engine (OKE)を使用して作成したクラスタにアクセスするために必要な権限を確認します。
Kubernetesクラスタで操作を実行するには、クラスタにアクセスするための適切な権限が必要です。
Kubernetes Engineによって作成および管理されるKubernetesクラスタ上でのほとんどの操作では、Oracle Cloud Infrastructure Identity and Access Management (IAM)はアクセス制御を提供します。クラスタにアクセスする権限は、ユーザーが属しているIAMグループ(動的グループを含む)から取得されます。グループの権限は、ポリシーによって定義されます。ポリシーは、グループのメンバーが実行できるアクションとそのコンパートメントを定義します。ユーザーは、自分がメンバーに含まれているグループに設定されたポリシーに基づいてクラスタにアクセスし、操作を実行できます。
IAMは、次のことを制御します:
- ユーザーがクラスタを作成または削除できるかどうか
- ユーザーがノード・プールを追加、削除または変更できるかどうか
- ユーザーがコンパートメントまたはテナンシ内のすべてのクラスタに対して実行できるKubernetesオブジェクトの作成/削除/表示操作
クラスタの作成とデプロイメントのためのポリシー構成を参照してください。
IAMに加えて、Kubernetes RBAC Authorizerは、Kubernetes RBACロールやclusterroleを介して、特定のクラスタのユーザーに対して、追加のファイングレイン・アクセス制御を実施できます。Kubernetes RBACロールは権限のコレクションです。たとえば、ロールにはポッドの読取り権限やポッドのリスト権限が含まれる場合があります。Kubernetes RBAC clusterroleはロールと似ていますが、クラスタ内のどこでも使用できます。Kubernetes RBACロールバインディングは、ロールをユーザーまたはグループにマップし、そのネームスペース内のリソースのユーザーまたはグループにそのロールの権限を付与します。同様に、Kubernetes RBAC clusterrolebindingは、clusterroleをユーザーまたはグループにマップし、そのclusterroleの権限をクラスタ全体のユーザーまたはグループに付与します。
IAMとKubernetes RBAC Authorizerは連携して機能することで、少なくとも1人によって正常に認可されたユーザーは、リクエストされたKubernetes操作を完了できます。OCIDsを使用して、Kubernetes RBACロールバインディングおよびclusterrolebindingsをIAMユーザーおよびグループ(動的グループを含む)にマップできます。
ユーザーがクラスタで操作(ロールの作成およびクラスタ・ロールの作成操作を除く)を実行しようとすると、IAMはまず、ユーザーが属するグループ(または動的グループ)に適切で十分な権限があるかどうかを判断します。権限がある場合、操作は成功します。試行した操作に、Kubernetes RBACロールまたはclusterroleを介して付与された追加の権限も必要な場合、Kubernetes RBAC Authorizerは、ユーザーまたはグループに適切なKubernetesロールまたはclusterroleが付与されているかどうかを判断します。
通常、Kubernetesクラスタのデプロイ時に、独自のKubernetes RBACロールとclusterroleを定義して、追加のファイングレイン制御を提供します。ロール作成操作またはclusterrole作成操作を実行しようとすると、Kubernetes RBAC Authorizerは、まず、Kubernetes権限が十分かどうかを判断します。ロールまたはclusterroleを作成するには、作成しようとしている新しいロール(またはclusterrole)と同じまたはそれ以上の権限を持つ既存のKubernetes RBACロール(またはclusterrole)が割り当てられている必要があります。
デフォルトでは、ユーザーにKubernetes RBACロール(またはclusterrole)は割り当てられていません。したがって、新しいロール(またはclusterrole)を作成する前に、適切な権限を持つロール(またはclusterrole)を割り当てる必要があります。cluster-admin clusterroleを含む、このような多数のロールおよびclusterroleが、常にデフォルトで作成されます(詳細なリストは、Kubernetesのドキュメントのデフォルト・ロールおよびロール・バインディングに関する項を参照)。cluster-admin clusterroleは、基本的にスーパーユーザー権限を付与します。cluster-admin clusterroleを付与されたユーザーは、特定のクラスタ内のすべてのネームスペースで任意の操作を実行できます。
Oracle Cloud Infrastructureテナンシ管理者にはすでに十分な権限があり、cluster-admin clusterroleは必要ありません。
後述の手順は、次のことを前提としています:
- テナンシの管理者グループに属しているか、Kubernetes RBAC cluster-admin clusterroleを持っているため、Kubernetes RBACロールおよびclusterroleを作成するために必要なアクセス権があります。
- RBAC cluster-admin clusterroleを付与するユーザーは、OCIテナンシ管理者ではありません。OCIテナンシ管理者である場合、Kubernetes RBAC cluster-admin clusterroleは必要ありません。
次のステップに従って、テナンシ管理者ではないユーザーに、Oracle Cloud Infrastructureにデプロイされているクラスタ上のKubernetes RBAC cluster-admin clusterroleを付与します:
-
まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
-
ターミナル・ウィンドウで、次のように入力して、Kubernetes RBAC cluster-admin clusterroleをユーザーに付与します:
kubectl create clusterrolebinding <my-cluster-admin-binding> --clusterrole=cluster-admin --user=<user_OCID>
ここでは:
<my-cluster-admin-binding>
は、ユーザーとKubernetes RBAC cluster-admin clusterrole間のバインディングの名前として使用される選択した文字列です。たとえば、jdoe_clst_adm
です<user_OCID>
は、ユーザーのOCIDです(コンソールから取得)。たとえば、ocid1.user.oc1..aaaaa...zutq
(読みやすさのために省略)です。
例:
kubectl create clusterrolebinding jdoe_clst_adm --clusterrole=cluster-admin --user=ocid1.user.oc1..aaaaa...zutq
次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限を管理者以外のユーザーに付与します。この例では、管理者以外のユーザーに、(グループのメンバーとしてではなく)クラスタへの明示的なアクセス権が付与されます。
テナンシ管理者として:
次の手順は、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーを作成するために必要な権限を持っていることを前提としています。
- 管理者以外のユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウントを作成します(たとえば、jdoe@acme.com)。ユーザーを作成するにはを参照してください。
- 新しいIAMユーザー・アカウントのOCIDをノートにとります(たとえば、読みやすくするために省略された
ocid1.user.oc1..aa______tx5a
)。 - 新しいOracle Cloud Infrastructure IAMグループ(
acme-developer-group
など)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。 - 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
Allow group acme-developer-group to use clusters in <location>
前述のポリシー・ステートメントで、
<location>
を、tenancy
(テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name>
(個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。グループがデフォルトのアイデンティティ・ドメインにない場合は、
group '<identity-domain-name>'/'group-name'
の形式で、グループ名の前にアイデンティティ・ドメイン名を追加します。group id <group-ocid>
の形式で、そのOCIDを使用してグループを指定することもできます。
クラスタ管理者は、次の作業を行います。
次の手順では、クラスタを作成および管理するために必要な権限と、Kubernetes RBACロールおよびclusterroleを作成するために必要なアクセス権を持っていることを前提としています。
- テキスト・エディタで、次のマニフェスト(
pod-reader-user.yaml
など)を作成し、Kubernetes RBACロールおよびロール・バインディングを定義して、新しいIAMユーザー・アカウントがkube-systemネームスペース内のポッドをリストできるようにします:kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader-ks namespace: kube-system rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader-ks-role-binding namespace: kube-system subjects: - kind: User name: <user-ocid> apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader-ks apiGroup: rbac.authorization.k8s.io
name: <user-ocid>
は、以前に作成した新しいIAMユーザー・アカウントのOCIDを指定します。たとえば、name: ocid1.user.oc1..aa______tx5a
です。 - 次のように入力して、新しいロールおよびロール・バインディングを作成します。
kubectl apply -f pod-reader-user.yml
管理者以外のユーザーとして:
次の手順は、前に作成した新しいIAMユーザー・アカウントの資格証明を持っていることを前提としています。そのため、テナンシまたはコンパートメントでKubernetesクラスタを使用するために必要な権限があります。
- 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
- クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
- 次のように入力して、kube-systemネームスペースのポッドをリストします:
kubectl get pods -n kube-system
次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限をグループ内の管理者以外のユーザーに付与します。この例では、管理者以外のユーザーにIAMグループのメンバーとしてクラスタへのアクセス権が付与されます(かわりに動的グループを指定できます)。
テナンシ管理者として:
次の手順は、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーを作成するために必要な権限を持っていることを前提としています。
- 管理者以外のユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウントを作成します(たとえば、jsmith@acme.com)。ユーザーを作成するにはを参照してください。
- 新しいOracle Cloud Infrastructure IAMグループ(
acme-developer-group
など)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。 - 新しいIAMグループのOCIDをノートにとります(たとえば、読みやすくするために省略された
ocid1.group.oc1..aa______m7dt
)。 - 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
Allow group acme-developer-group to use clusters in <location>
前述のポリシー・ステートメントで、
<location>
を、tenancy
(テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name>
(個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。グループがデフォルトのアイデンティティ・ドメインにない場合は、
group '<identity-domain-name>'/'group-name'
の形式で、グループ名の前にアイデンティティ・ドメイン名を追加します。group id <group-ocid>
の形式で、そのOCIDを使用してグループを指定することもできます。
クラスタ管理者は、次の作業を行います。
次の手順では、クラスタを作成および管理するために必要な権限と、Kubernetes RBACロールおよびclusterroleを作成するために必要なアクセス権を持っていることを前提としています。
- テキスト・エディタで、次のマニフェスト(
pod-reader-group.yaml
など)を作成し、Kubernetes RBACロールおよびロール・バインディングを定義して、新しいIAMグループのユーザーがkube-systemネームスペースのポッドをリストできるようにします:kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader-ks namespace: kube-system rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader-ks-role-binding namespace: kube-system subjects: - kind: Group name: <group-ocid> apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader-ks apiGroup: rbac.authorization.k8s.io
name: <group-ocid>
は、以前に作成した新しいIAMグループのOCIDを指定します。たとえば、name: ocid1.group.oc1..aa______m7dt
です。 - 次のように入力して、新しいロールおよびロール・バインディングを作成します。
kubectl apply -f pod-reader-group.yml
管理者以外のユーザーとして:
次の手順では、新しいIAMグループのメンバーとして以前に作成された新しいIAMユーザー・アカウントの資格証明を持っていることを前提としています。そのため、テナンシまたはコンパートメントでKubernetesクラスタを使用するために必要な権限があります。
- 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
- クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
- 次のように入力して、kube-systemネームスペースのポッドをリストします:
kubectl get pods -n kube-system
次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限をグループ内の管理者以外のユーザーに付与します。この例では、管理者以外のユーザーに、明示的に、またはIAMグループのメンバーとしてクラスタへのアクセス権が付与されます(かわりに動的グループを指定できます)。
テナンシ管理者として:
次の手順は、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーを作成するために必要な権限を持っていることを前提としています。
- 管理者以外のユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウントを作成します(たとえば、jjones@acme.com)。ユーザーを作成するにはを参照してください。
- このユーザーのみがシークレットをリストできるようにする場合は、新しいIAMユーザー・アカウントのOCIDをノートにとります(たとえば、読みやすくするために省略された
ocid1.user.oc1..aa______4gs6
)。 - 新しいOracle Cloud Infrastructure IAMグループ(
acme-developer-group
など)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。 - このグループ内のすべてのユーザーがシークレットをリストできるようにする場合は、新しいIAMグループのOCIDをノートにとります(たとえば、
ocid1.group.oc1..aa______e26f
は可読性のために省略されています)。 - 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
Allow group acme-developer-group to use clusters in <location>
前述のポリシー・ステートメントで、
<location>
を、tenancy
(テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name>
(個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。グループがデフォルトのアイデンティティ・ドメインにない場合は、
group '<identity-domain-name>'/'group-name'
の形式で、グループ名の前にアイデンティティ・ドメイン名を追加します。group id <group-ocid>
の形式で、そのOCIDを使用してグループを指定することもできます。
クラスタ管理者は、次の作業を行います。
次の手順では、クラスタを作成および管理するために必要な権限と、Kubernetes RBACロールおよびclusterroleを作成するために必要なアクセス権を持っていることを前提としています。
- テキスト・エディタで、新しいIAMユーザーのみを有効にするか、新しいIAMグループ内のすべてのユーザーのみを有効にしてKubernetesクラスタ内のシークレットをリストするかに応じて、次のいずれかを実行します:
- 新しいIAMユーザーのみがKubernetesクラスタ内のシークレットをリストできるようにする場合は、次のマニフェスト(
secrets-reader.yaml
など)を作成します:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: read-secrets-global subjects: - kind: User name: <user-ocid> apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
name: <user-ocid>
は、以前に作成した新しいIAMユーザーのOCIDを指定します。たとえば、name: ocid1.user.oc1..aa______4gs6
です。 - 新しいIAMグループ内のすべてのユーザーがKubernetesクラスタ内のシークレットをリストできるようにする場合は、次のマニフェスト(
secrets-reader.yaml
など)を作成します:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: read-secrets-global subjects: - kind: Group name: <group-ocid> apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
name: <group-ocid>
は、以前に作成した新しいIAMグループのOCIDです。たとえば、ocid1.group.oc1..aa______e26f
です。
- 新しいIAMユーザーのみがKubernetesクラスタ内のシークレットをリストできるようにする場合は、次のマニフェスト(
- 次のように入力して、新しいclusterroleおよびclusterrolebindingを作成します:
kubectl apply -f secret-reader.yml
管理者以外のユーザーとして:
次の手順では、新しいIAMグループのメンバーとして以前に作成された新しいIAMユーザー・アカウントの資格証明を持っていることを前提としています。そのため、テナンシまたはコンパートメント内のKubernetesクラスタを明示的に、またはグループのメンバーとして使用するために必要な権限があります。
- 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
- クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
- 次のように入力して、すべてのネームスペース内のシークレットをリストします:
kubectl get secrets --all-namespaces