Kubernetes · 3 min read · Dec 08, 2025

Kubernetesにおけるロールベースのアクセス制御(RBAC)

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

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

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

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

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

RBACを詳細に理解するには、こちらのKubernetesの公式ドキュメントを訪れてください。

注意: コマンドを実行する前に混乱を避けるためにスクリーンショットを参照してください。( ubuntu@master = masterノードおよび ubuntu@ip-172-31-25-70 = ユーザー機械)

前提条件

  1. 少なくとも1つのワーカーノードを持つKubernetesクラスター。 Kubernetesクラスターの作成方法を学びたい場合は、こちらをクリックしてください。このガイドでは、AWS Ubuntu EC2インスタンス上に1つのマスターと2つのノードを持つKubernetesクラスターを作成する方法を説明します。

何をしますか?

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

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

「default」名前空間内でポッドへのget、watch、listアクセスを付与するために使用できるRoleを作成するファイルを作成します。

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"]

my-role

「default」名前空間内で「pod-reader」Roleをユーザー「jane」に付与する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

my-role-binding

特定の名前空間内またはすべての名前空間にわたってsecretsへのget、watch、listアクセスを付与するために使用できる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"]

my-cluster-role

任意の名前空間で「manager」グループのすべてのユーザーがsecretsを読み取ることを許可するClusterRoleBindingを作成するための新しいファイルを作成します。

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

my-cluster-role-binding

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

クラスターから既存のRolesおよびClusterRolesのリストを取得します。

kubectl get roles
kubectl get clusterroles

get-default-role-clusterrole

クラスターから既存のRoleBindingsおよびClusterRoleBindingsのリストを取得します。

kubectl get rolebinding
kubectl get clusterrolebinding

get-default-role-binding-clusterrole-binding

次に、上記のステップで作成したファイルを使用して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

create-role-and-binding-objects

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

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

get-role-and-binding-objects

上記のスクリーンショットでは、Role、RoleBinding、およびClusterRole、ClusterRoleBindingが作成されたことが確認できます。

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

このセクションでは、ユーザーと共有できるconfigファイルを作成します。ここでは、このシナリオをテストするために、Linuxサーバー上に「bob」というユーザーを作成し、このconfigファイルを「bob」ユーザーと共有します。その後、そのユーザーに許可された操作と許可されていない操作を実行しようとします。「bob」ユーザーにadmin 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 '
'

上記のステップで生成した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 '
'
  usages:
  - client auth
cat k8s-csr.yaml

create-key-and-create-certificate-signing-request-object-file

上記のステップで生成した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

approve-certificate-signing-request

上記のスクリーンショットでは、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

retrieve-the-certificate

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

get-cluster-CA-certificate

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

set-up-the-cluster-configuration-for-bob

Bobのキーと証明書をconfigファイルにインポートするユーザーを設定します。

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

set-up-the-user-bob-configuration

次のコマンドを使用して「Bob」のconfigファイルのコンテキストを作成します。

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

set-up-the-contex-for-bob-configuration

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

create-a-namespace-and-label-it

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

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

set-current-context

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

vim .kube/config #マスターノードで実行した「cat bob-k8s-config」コマンドのすべての出力をユーザー機械の/home/bob/.kube/configに保存します。
kubectl version #ユーザー機械で実行します

share-the-config-file-with-bob-user

ユーザー機械から以下のコマンドを実行して権限をテストします。

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

上記のスクリーンショットでは、「Bob」ユーザーが何の操作も実行できないことが確認できます。アクセスが付与されていないためです。

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

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

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」名前空間にデフォルトの名前空間として設定されたPodを作成します。

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

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

kubectl config get-contexts

create-pod-in-allowed-namespace

上記のスクリーンショットでは、「Bob」が「bob」名前空間にPodを作成できることが確認できます。なぜなら、私たちが「Bob」ユーザーに「admin」役割をバインドしたからです。

Bobが権限を持たない「default」名前空間にPodを作成しようとします。私たちは「Bob」ユーザーが「bob」名前空間以外の名前空間にオブジェクトを作成できるように許可したため、Bobユーザーは他の名前空間にリソースを作成できません。

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

kubeconfigファイルでデフォルトの名前空間が設定されているか確認します。これにより、「bob」名前空間がconfigファイルでデフォルトの名前空間として設定されていることが示されます。

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. ユーザーのconfigファイルを使用して権限をテストします。
  14. ユーザーに役割を割り当てます。
  15. ユーザーのconfigファイルを使用して権限を再度テストします。

結論

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

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。