アクセス制御およびContainer Engine for Kubernetesについて

Kubernetesクラスタで操作を実行するには、クラスタにアクセスするための適切な権限が必要です。

Container Engine for Kubernetesによって作成および管理されるKubernetesクラスタ上でのほとんどの操作では、Oracle Cloud Infrastructure Identity and Access Management (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操作を完了できます。OCIDを使用して、Kubernetes RBACのロールバインディングおよびclusterrolebindingをIAMのユーザーおよびグループにマップできます。

ユーザーがクラスタで操作(ロールの作成およびclusterroleの作成操作を除く)を実行しようとすると、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は必要ありません。

例1: Kubernetes RBAC 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を付与します:

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. ターミナル・ウィンドウで、次のように入力して、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
例2:非管理者ユーザーがクラスタ内のポッドを読み取れるようにするためのKubernetesロールおよびロール・バインディングの作成

次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限を非管理者ユーザーに付与します。この例では、非管理者ユーザーに(グループのメンバーとしてではなく)クラスタへの明示的なアクセス権が付与されます。

テナンシ管理者として:

ノート

次の手順では、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーの作成に必要な権限があることを前提としています。
  1. 非管理者ユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウント(たとえば、jdoe@acme.com)を作成します。ユーザーを作成するにはを参照してください。
  2. 新しいIAMユーザー・アカウントのOCID (たとえば、読みやすくするために省略したocid1.user.oc1..aa______tx5a)をノートにとります。
  3. 新しいOracle Cloud Infrastructure IAMグループ(acme-developer-groupなど)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。
  4. 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
    Allow group acme-developer-group to use clusters in <location>

    前述のポリシー・ステートメントで、<location>を、tenancy (テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name> (個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。

クラスタ管理者として、次の作業を行います。

:次の

手順では、クラスタを作成および管理するために必要なアクセス権と、Kubernetes RBACの役割およびclusterroleを作成するために必要なアクセス権があることを前提としています。
  1. テキスト・エディタで、次のマニフェスト(たとえば、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です。

  2. 次のように入力して、新しいロールおよびロール・バインディングを作成します。
    kubectl apply -f pod-reader-user.yml

管理者以外のユーザーの場合:

ノート

の手順では、以前に作成した新しいIAMユーザー・アカウントの資格証明があることを前提としています。そのため、テナンシまたはコンパートメントでKubernetesクラスタを使用するために必要な権限があります。
  1. 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
  2. クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
  3. 次のように入力して、kube - systemネームスペースのポッドをリストします。
    kubectl get pods -n kube-system
例3:グループがクラスタ内のポッドを読み取れるようにするためのKubernetesロールおよびロール・バインディングの作成

次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限をグループ内の非管理者ユーザーに付与します。この例では、管理者以外のユーザーにグループのメンバーとしてクラスタへのアクセス権が付与されます。

テナンシ管理者として:

ノート

次の手順では、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーの作成に必要な権限があることを前提としています。
  1. 非管理者ユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウントを作成します(例: jsmith@acme.com)。ユーザーを作成するにはを参照してください。
  2. 新しいOracle Cloud Infrastructure IAMグループ(acme-developer-groupなど)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。
  3. 新しいIAMグループのOCID (たとえば、読みやすくするために省略したocid1.group.oc1..aa______m7dt)をノートにとります。
  4. 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
    Allow group acme-developer-group to use clusters in <location>

    前述のポリシー・ステートメントで、<location>を、tenancy (テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name> (個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。

クラスタ管理者として、次の作業を行います。

:次の

手順では、クラスタを作成および管理するために必要なアクセス権と、Kubernetes RBACの役割およびclusterroleを作成するために必要なアクセス権があることを前提としています。
  1. テキスト・エディタで、次のマニフェスト(pod-reader-group.yamlなど)を作成して、新しいIAMグループのユーザーがkube - systemネームスペースのポッドをリストできるようにKubernetes RBACロールおよびロール・バインディングを定義します。
    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です。

  2. 次のように入力して、新しいロールおよびロール・バインディングを作成します。
    kubectl apply -f pod-reader-group.yml

管理者以外のユーザーの場合:

ノート

次の手順では、以前に新しいIAMグループのメンバーとして作成した新しいIAMユーザー・アカウントの資格証明があることを前提としています。そのため、テナンシまたはコンパートメントでKubernetesクラスタを使用するために必要な権限があります。
  1. 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
  2. クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
  3. 次のように入力して、kube - systemネームスペースのポッドをリストします。
    kubectl get pods -n kube-system
例4:ユーザーおよびグループがクラスタ内のシークレットをリストできるようにするためのKubernetes clusterroleおよびclusterrolebindingの作成

次のステップに従って、Kubernetesクラスタで実行されるポッドを表示するために必要なOracle Cloud InfrastructureおよびKubernetes RBAC権限をグループ内の非管理者ユーザーに付与します。この例では、非管理者ユーザーにクラスタへのアクセス権が明示的に、またはグループのメンバーとして付与されます。

テナンシ管理者として:

ノート

次の手順では、テナンシの管理者グループに属しているため、ユーザー、グループおよびIAMポリシーの作成に必要な権限があることを前提としています。
  1. 非管理者ユーザーの新しいOracle Cloud Infrastructure IAMユーザー・アカウントを作成します(例: jjones@acme.com)。ユーザーを作成するにはを参照してください。
  2. このユーザーのみがシークレットをリストできるようにする場合は、新しいIAMユーザー・アカウントのOCID (たとえば、読みやすくするために省略したocid1.user.oc1..aa______4gs6)をノートにとります。
  3. 新しいOracle Cloud Infrastructure IAMグループ(acme-developer-groupなど)を作成し、新しいIAMユーザー・アカウントをグループに追加します。グループを作成するにはを参照してください。
  4. このグループのすべてのユーザーがシークレットをリストできるようにする場合は、新しいIAMグループのOCID (たとえば、読みやすくするために省略したocid1.group.oc1..aa______e26f)をノートにとります。
  5. 次のようなポリシー・ステートメントでクラスタのCLUSTER_USE権限を新規グループに付与する新しいOracle Cloud Infrastructureポリシーを作成します:
    Allow group acme-developer-group to use clusters in <location>

    前述のポリシー・ステートメントで、<location>を、tenancy (テナンシのルート・コンパートメントにポリシーを作成している場合)またはcompartment <compartment-name> (個々のコンパートメントにポリシーを作成している場合)に置換します。ポリシーを作成するにはを参照してください。

クラスタ管理者として、次の作業を行います。

:次の

手順では、クラスタを作成および管理するために必要なアクセス権と、Kubernetes RBACの役割およびclusterroleを作成するために必要なアクセス権があることを前提としています。
  1. テキスト・エディタで、新しい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です。

  2. 次のように入力して、新しいclusterroleおよびclusterrolebindingを作成します。
    kubectl apply -f secret-reader.yml

管理者以外のユーザーの場合:

ノート

次の手順では、以前に新しいIAMグループのメンバーとして作成した新しいIAMユーザー・アカウントの資格証明があることを前提としています。そのため、テナンシまたはコンパートメント内のKubernetesクラスタを明示的に使用するか、グループのメンバーとして使用するために必要な権限があります。
  1. 新しいIAMユーザー・アカウントの資格証明を使用してコンソールにサインインします。
  2. クラスタ・アクセスの設定の手順に従って、クラスタ・アクセスを構成します。
  3. 次のように入力して、すべてのネームスペースのシークレットをリストします。
    kubectl get secrets --all-namespaces