ウェブサイト検索

Kubernetes での役割ベースのアクセス制御 (RBAC)


このページでは

  1. 前提条件
  2. どうする?
  3. ロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクト ファイルを作成します。
  4. Role、Role Binding、Cluster Role、Cluster Role Binding オブジェクトを作成します。
  5. kubeconfig(config) ファイルを使用してユーザーにアクセスを提供します。
    1. Kubeconfig ファイル作成の概要

    役割ベースのアクセス制御(RBAC)は、Kubernetes クラスタ内のコンピュータまたはネットワーク リソースへのアクセスを割り当てるために使用されます。

    この記事では、RBAC の基本を理解し、Role、ClusterRole、RoleBinding、ClusterRoleBinding オブジェクトを作成します。

    次に、kubeconfig ファイルを作成して、選択した名前空間で特定のユーザーに制限付きアクセスを付与します。

    ただし、先に進む前に、まず基本を理解しましょう。

    1. Role または ClusterRole には一連の権限が含まれています。
    2. 役割は特定の名前空間内で権限を設定し、ClusterRole は名前空間のないリソースです。
    3. ロール バインディングは、ロールで定義された権限をユーザーまたは一連のユーザーに付与しますが、ClusterRoleBinding はクラスタ全体にアクセスする権限を付与します
    4. RoleBinding は、同じ名前空間内の任意の Role を参照できます。または、RoleBinding は ClusterRole を参照し、その ClusterRole を RoleBindin の名前空間にバインドできます。
    5. kubeconfig ファイルは、kubectl コマンドライン ツールから Kubernetes へのアクセスを構成するために使用されるファイルです。

    RBAC を詳しく理解するには、こちらの Kubernetes の公式ドキュメントにアクセスしてください。

    Note: Refer screenshots to avoid any confusion before executing the commands. (  = user machine)

    前提条件

    1. 少なくとも 1 つのワーカー ノードを含む Kubernetes クラスタ。
      Kubernetes クラスタの作成方法を学習するには、ここをクリックしてください。このガイドは、AWS Ubuntu EC2 インスタンスで 1 つのマスターと 2 つのノードを持つ Kubernetes クラスターを作成するのに役立ちます。

    何をしたらいいでしょう?

    1. ロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクト ファイルを作成します。
    2. クラスタ内にロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクトを作成します。
    3. kubeconfig ファイルを使用してユーザーにアクセスを提供します。
    4. kubeconfig ファイル作成の概要。

    Role、Role Binding、Cluster Role、Cluster Role Binding オブジェクト ファイルを作成します。

    ポッドへの取得、監視、一覧表示アクセスを許可するために使用できる「デフォルト」名前空間にロールを作成するためのファイルを作成します。

    vim my-role.yml
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]

    新しいファイルを作成して、\default\ 名前空間内のユーザー \jane\ に \pod-reader\ ロールを許可する RoleBinding を作成します。

    vim my-role-binding.yml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: jane
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io

    ファイルを作成して、バインド方法に応じて、特定の名前空間内またはすべての名前空間内のシークレットへの取得、監視、リスト アクセスを許可するために使用できる ClusterRole を作成します。

    vim my-cluster-role.yml
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: secret-reader
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]

    新しいファイルを作成して ClusterRoleBinding を作成します。これにより、グループ \manager\ のすべてのユーザーが任意の名前空間のシークレットを読み取ることができます。

    vim my-cluster-role-binding.yml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: read-secrets-global
    subjects:
    - kind: Group
      name: manager
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-reader
      apiGroup: rbac.authorization.k8s.io

    Role、Role Binding、Cluster Role、Cluster Role Binding オブジェクトを作成します。

    クラスタから既存のロールと ClusterRoles のリストを取得します。

    kubectl  get roles
    kubectl  get clusterroles

    クラスターから既存の RoleBinding と ClusterRoleBinding のリストを取得します。

    kubectl  get rolebinding
    kubectl  get clusterrolebinding

    上記の手順で作成したファイルを使用して、Role、RoleBinding、ClusterRole ClusterRoleBinding を作成します。

    kubectl create -f my-role.yml
    kubectl create -f my-role-binding.yml
    kubectl create -f my-cluster-role.yml
    kubectl create -f my-cluster-role-binding.yml

    次のコマンドを使用して、オブジェクトが作成されているかどうかを確認します。

    kubectl  get roles | grep pod-reader
    kubectl  get rolebinding | grep read-pods
    kubectl  get clusterroles | grep secret-reader
    kubectl  get clusterrolebinding | grep read-secrets-global

    上のスクリーンショットでは、Role、RoleBinding および ClusterRole、ClusterRoleBinding が作成されていることがわかります。

    kubeconfig(config) ファイルを使用して、ユーザーにアクセスを提供します。

    このセクションでは、ユーザーと共有できる構成ファイルを作成します。ここでは、このシナリオをテストするために、Linux サーバー上にユーザー「bob」を作成し、この構成ファイルを「bob」ユーザーと共有します。次に、そのユーザーに許可されている操作と許可されていない操作を実行しようとします。 \bob\ 名前空間内のすべてのオブジェクトへのアクセスを許可する \bob\ ユーザーに管理 ClusterRole をバインドします。

    マスター ノードで、openssl を使用してキーと証明書署名要求 (CSR) を作成します。

    pwd
    mkdir user-bob
    cd user-bob/
    openssl req -new -newkey rsa:4096 -nodes -keyout bob-k8s.key -out bob-k8s.csr -subj "/CN=bob/O=devops"
    cat bob-k8s.csr | base64 | tr -d '\n'

    上記の手順で生成した CSR を含む CertificateSigningRequest オブジェクト定義ファイルを作成します。以下のファイルに \cat bob-k8s.csr | base64 | tr -d の出力を追加します。 \ コマンド を \request\ プロパティに送信します。

    vim k8s-csr.yaml
    apiVersion: certificates.k8s.io/v1beta1
    kind: CertificateSigningRequest
    metadata:
      name: bob-k8s-access
    spec:
      groups:
      - system:authenticated
      request: # replace output of: cat bob-k8s.csr | base64 | tr -d '\n'
      usages:
      - client auth
    cat k8s-csr.yaml

    上記の手順で生成した CSR を含む CertificateSigningRequest オブジェクトを Kubernetes 内に作成します。

    kubectl  get csr
    kubectl  create -f k8s-csr.yaml
    kubectl  get csr

    ここで、上記の手順で作成した CSR (CertificateSigningRequest) オブジェクトを承認します。

    kubectl  get csr
    kubectl certificate approve bob-k8s-access
    kubectl  get csr

    上のスクリーンショットでは、CSR が承認され、発行されていることがわかります。

    CSR オブジェクトの「status.certificate」フィールドで利用可能な証明書を取得します。

    ls -lt
    kubectl get csr bob-k8s-access -o jsonpath='{.status.certificate}' | base64 --decode > bob-k8s-access.crt
    ls -lt
    cat bob-k8s-access.crt

    Bob の kubeconfig ファイルの次の要件であるクラスタ CA 証明書を取得し、\k8s-ca.crt\ ファイルに保存します。

    ls -lt
    kubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-ca.crt
    ls -lt
    cat k8s-ca.crt

    Bob の kubeconfig ファイルでクラスター構成をセットアップします。これらの詳細はすべて、以下のコマンドを使用して既存の kubeconfig から取得されます。

    ls -lt
    kubectl config set-cluster $(kubectl config view -o jsonpath='{.clusters[0].name}') --server=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}') --certificate-authority=k8s-ca.crt --kubeconfig=bob-k8s-config --embed-certs
    ls -lt
    cat bob-k8s-config

    Bob のキーと証明書を構成ファイルにインポートするユーザーをセットアップします。

    ls -lt
    kubectl config set-credentials bob --client-certificate=bob-k8s-access.crt --client-key=bob-k8s.key --embed-certs --kubeconfig=bob-k8s-config
    ls -lt
    cat bob-k8s-config

    次のコマンドを使用して、\Bobs\ 構成ファイルのコンテキストを作成します。

    ls -lt
    kubectl config set-context bob --cluster=$(kubectl config view -o jsonpath='{.clusters[0].name}') --namespace=bob --user=bob --kubeconfig=bob-k8s-config
    ls -lt
    cat bob-k8s-config

    Bob の名前空間を作成する

    kubectl  get ns
    kubectl create ns bob
    kubectl  get ns -o wide
    kubectl label ns bob user=bob env=sandbox
    kubectl  get ns -o wide

    Bob が kubectl コマンドに使用するコンテキストを指定します。

    cat bob-k8s-config
    kubectl config use-context bob --kubeconfig=bob-k8s-config
    cat bob-k8s-config

    \bob-k8s-config\ をマスター ノードから Bob のホーム ディレクトリの \.kube/config\ ファイルにコピーし、「kubectl version」を実行して Bob の kubeconfig をテストします。

    vim .kube/config #All the output of "cat bob-k8s-config" command ran on the master node and save it to /home/bob/.kube/config on the user machine.
    kubectl version #Execute this on the user machine

    ユーザーのマシンから次のコマンドを実行して権限をテストします。

    kubectl  get nodes
    kubectl  get pods
    kubectl  get ns
    kubectl  get deployments
    kubectl  get all

    上のスクリーンショットでは、\Bob\ ユーザーにアクセス権が与えられていないため、操作を実行できないことがわかります。

    デフォルトの「管理者」クラスタ ロールを Bob に割り当てて、Bob の名前空間内にほとんどの種類の Kubernetes オブジェクトを作成します。このロール \bob-admin\ は、\admin\ ClusterRole を使用して、\bob\ 名前空間の \Bob\ ユーザーに管理者アクセスを付与します。

    マスター ノードで次のコマンドを実行します。

    kubectl create rolebinding bob-admin --namespace=bob --clusterrole=admin --user=bob 
    kubectl  get rolebinding
    kubectl  get clusterrole | grep  admin

    Bob に対して作成された名前空間を取得します。

    ここで、ユーザー マシンから次のすべてのコマンドを実行します。

    kubectl  get ns
    kubectl  get ns bob

    上のスクリーンショットでは、\Bob\ ユーザー が \namespace\ リソースを一覧表示できないことがわかります。

    Bob の kubeconfig ファイルでデフォルトの名前空間として設定された \bob\ 名前空間に Pod を作成します。

    kubectl  run nginx --image=nginx
    kubectl  get pods
    kubectl  get pods -o wide

    デフォルトの名前空間として設定されている現在の名前空間を確認する

    kubectl config get-contexts

    上のスクリーンショットでは、\bob\ の \Bob\ ユーザーに \admin\ ロールをバインドしているため、\Bob\ が \bob\ 名前空間に Pod を作成できることがわかります。名前空間。

    Bob が権限を持たない \default\ 名前空間にポッドを作成してみてください。 \Bob\ ユーザーが \bob\ 名前空間でのみオブジェクトを作成できるようにしたため、Bob ユーザーは \bob\ 以外の名前空間でリソースを作成できません。

    kubectl  run nginx-2 --image=nginx --namespace=default

    kubeconfig ファイルでデフォルトの名前空間として設定されている名前空間を確認します。これは、構成ファイルで \bob\ 名前空間がデフォルトの名前空間として設定されていることを示しています。

    kubectl config view --minify | grep namespace:

    Kubeconfig ファイル作成の概要

    1. openssl を使用して鍵と証明書署名要求 (CSR) を作成します。
    2. CertificateSigningRequest オブジェクト定義ファイルを作成します。
    3. CertificateSigningRequest オブジェクトを作成します。
    4. CSR (CertificateSigningRequest) を承認します。
    5. CSR オブジェクトの証明書を取得します。
    6. クラスタ CA 証明書を取得します。
    7. kubeconfig ファイルでクラスタ構成を設定します。
    8. ユーザーを設定します。
    9. コンテキストを作成します。
    10. ユーザーの名前空間を作成します。
    11. kubeconfig ファイルでコンテキストを指定します。
    12. kubeconfig をユーザーに渡します。
    13. ユーザー構成ファイルを使用して権限をテストする
    14. ユーザーに役割を割り当てる
    15. ユーザー構成ファイルを使用して、権限を再度テストします。

    結論

    この記事では、Role、RoleBinding と ClusterRole、ClusterRoleBinding の基本について説明し、これらのオブジェクトもクラスター内に作成しました。次に、特定のユーザーが特定の名前空間で操作を実行できるようにする構成ファイルを作成しました。 RBAC が Kubernetes クラスタへのアクセスを制限するのにどのように役立つかを見てきました。