Kubernetes · 3 min read · Dec 08, 2025
Kubernetesにおけるロールベースのアクセス制御(RBAC)

ロールベースのアクセス制御(RBAC)は、Kubernetesクラスター内のコンピュータまたはネットワークリソースへのアクセスを割り当てるために使用されます。
この記事では、RBACの基本を理解し、Role、ClusterRole、RoleBinding、およびClusterRoleBindingオブジェクトを作成します。
次に、特定のユーザーに選択した名前空間への制限付きアクセスを付与するためのkubeconfigファイルを作成します。
しかし、進む前にまず基本を理解しましょう。
- RoleまたはClusterRoleは、一連の権限を含みます。
- Roleは特定の名前空間内で権限を設定し、ClusterRoleは名前空間に依存しないリソースです。
- RoleBindingは、Roleで定義された権限をユーザーまたはユーザーのセットに付与しますが、ClusterRoleBindingはそのアクセスをクラスター全体に付与します。
- RoleBindingは同じ名前空間内の任意のRoleを参照できます。あるいは、RoleBindingはClusterRoleを参照し、そのClusterRoleをRoleBindingの名前空間にバインドできます。
- kubeconfigファイルは、kubectlコマンドラインツールからKubernetesへのアクセスを構成するために使用されるファイルです。
RBACを詳細に理解するには、こちらのKubernetesの公式ドキュメントを訪れてください。
注意: コマンドを実行する前に混乱を避けるためにスクリーンショットを参照してください。( ubuntu@master = masterノードおよび ubuntu@ip-172-31-25-70 = ユーザー機械)前提条件
- 少なくとも1つのワーカーノードを持つKubernetesクラスター。 Kubernetesクラスターの作成方法を学びたい場合は、こちらをクリックしてください。このガイドでは、AWS Ubuntu EC2インスタンス上に1つのマスターと2つのノードを持つKubernetesクラスターを作成する方法を説明します。
何をしますか?
- Role、Role Binding、Cluster Role、Cluster Role Bindingオブジェクトファイルを作成します。
- クラスター内にRole、Role Binding、Cluster Role、Cluster Role Bindingオブジェクトを作成します。
- kubeconfigファイルを使用してユーザーにアクセスを提供します。
- kubeconfigファイル作成の概要。
Role、Role Binding、Cluster Role、Cluster Role Bindingオブジェクトファイルを作成します。
「default」名前空間内でポッドへのget、watch、listアクセスを付与するために使用できるRoleを作成するファイルを作成します。
vim my-role.ymlkind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
「default」名前空間内で「pod-reader」Roleをユーザー「jane」に付与するRoleBindingを作成するための新しいファイルを作成します。
vim my-role-binding.ymlkind: 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
特定の名前空間内またはすべての名前空間にわたってsecretsへのget、watch、listアクセスを付与するために使用できるClusterRoleを作成するファイルを作成します。
vim my-cluster-role.ymlkind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
任意の名前空間で「manager」グループのすべてのユーザーがsecretsを読み取ることを許可するClusterRoleBindingを作成するための新しいファイルを作成します。
vim my-cluster-role-binding.ymlkind: 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オブジェクトを作成します。
クラスターから既存のRolesおよびClusterRolesのリストを取得します。
kubectl get roleskubectl get clusterroles
クラスターから既存のRoleBindingsおよびClusterRoleBindingsのリストを取得します。
kubectl get rolebindingkubectl get clusterrolebinding
次に、上記のステップで作成したファイルを使用してRole、RoleBinding、およびClusterRole ClusterRoleBindingを作成します。
kubectl create -f my-role.ymlkubectl create -f my-role-binding.ymlkubectl create -f my-cluster-role.ymlkubectl create -f my-cluster-role-binding.yml
以下のコマンドを使用して、オブジェクトが作成されたかどうかを確認します。
kubectl get roles | grep pod-readerkubectl get rolebinding | grep read-podskubectl get clusterroles | grep secret-readerkubectl get clusterrolebinding | grep read-secrets-global
上記のスクリーンショットでは、Role、RoleBinding、およびClusterRole、ClusterRoleBindingが作成されたことが確認できます。
kubeconfig(config)ファイルを使用してユーザーにアクセスを提供します。
このセクションでは、ユーザーと共有できるconfigファイルを作成します。ここでは、このシナリオをテストするために、Linuxサーバー上に「bob」というユーザーを作成し、このconfigファイルを「bob」ユーザーと共有します。その後、そのユーザーに許可された操作と許可されていない操作を実行しようとします。「bob」ユーザーにadmin ClusterRoleをバインドし、すべてのオブジェクトに対するアクセスを付与します。
マスターノードで、opensslを使用してキーと証明書署名要求(CSR)を作成します。
pwdmkdir user-bobcd 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.yamlapiVersion: 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 authcat k8s-csr.yaml
上記のステップで生成したCSRを含むCertificateSigningRequestオブジェクトをKubernetes内に作成します。
kubectl get csrkubectl create -f k8s-csr.yamlkubectl get csrCSR(CertificateSigningRequest)オブジェクトを承認したいと思います。
kubectl get csrkubectl certificate approve bob-k8s-accesskubectl get csr
上記のスクリーンショットでは、CSRが承認され、発行されたことが確認できます。
CSRオブジェクトの「status.certificate」フィールドにある証明書を取得します。
ls -ltkubectl get csr bob-k8s-access -o jsonpath='{.status.certificate}' | base64 --decode > bob-k8s-access.crtls -ltcat bob-k8s-access.crt
Bobのkubeconfigファイルに必要な次の要件であるクラスターCA証明書を取得し、「k8s-ca.crt」ファイルに保存します。
ls -ltkubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-ca.crtls -ltcat k8s-ca.crt
Bobのkubeconfigファイルにクラスター構成を設定します。これらの詳細は、以下のコマンドを使用して既存のkubeconfigから取得します。
ls -ltkubectl 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-certsls -ltcat bob-k8s-config
Bobのキーと証明書をconfigファイルにインポートするユーザーを設定します。
ls -ltkubectl config set-credentials bob --client-certificate=bob-k8s-access.crt --client-key=bob-k8s.key --embed-certs --kubeconfig=bob-k8s-configls -ltcat bob-k8s-config
次のコマンドを使用して「Bob」のconfigファイルのコンテキストを作成します。
ls -ltkubectl config set-context bob --cluster=$(kubectl config view -o jsonpath='{.clusters[0].name}') --namespace=bob --user=bob --kubeconfig=bob-k8s-configls -ltcat bob-k8s-config
Bobのための名前空間を作成します。
kubectl get nskubectl create ns bobkubectl get ns -o widekubectl label ns bob user=bob env=sandboxkubectl get ns -o wide
Bobがkubectlコマンドを実行するために使用するコンテキストを指定します。
cat bob-k8s-configkubectl config use-context bob --kubeconfig=bob-k8s-configcat bob-k8s-config
「bob-k8s-config」をマスターノードからBobのホームディレクトリの「.kube/config」ファイルにコピーし、ユーザー機械で「kubectl version」を実行してBobのkubeconfigをテストします。
vim .kube/config #マスターノードで実行した「cat bob-k8s-config」コマンドのすべての出力をユーザー機械の/home/bob/.kube/configに保存します。kubectl version #ユーザー機械で実行します
ユーザー機械から以下のコマンドを実行して権限をテストします。
kubectl get nodeskubectl get podskubectl get nskubectl get deploymentskubectl 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 rolebindingkubectl get clusterrole | grep adminBobに作成された名前空間を取得します。
次に、ユーザー機械から以下のすべてのコマンドを実行します。
kubectl get nskubectl get ns bob上記のスクリーンショットでは、「Bob」ユーザーが「namespace」リソースをリストできないことが確認できます。
「bob」名前空間にデフォルトの名前空間として設定されたPodを作成します。
kubectl run nginx --image=nginxkubectl get podskubectl get pods -o wide現在の名前空間がデフォルトの名前空間として設定されているか確認します。
kubectl config get-contexts
上記のスクリーンショットでは、「Bob」が「bob」名前空間にPodを作成できることが確認できます。なぜなら、私たちが「Bob」ユーザーに「admin」役割をバインドしたからです。
Bobが権限を持たない「default」名前空間にPodを作成しようとします。私たちは「Bob」ユーザーが「bob」名前空間以外の名前空間にオブジェクトを作成できるように許可したため、Bobユーザーは他の名前空間にリソースを作成できません。
kubectl run nginx-2 --image=nginx --namespace=defaultkubeconfigファイルでデフォルトの名前空間が設定されているか確認します。これにより、「bob」名前空間がconfigファイルでデフォルトの名前空間として設定されていることが示されます。
kubectl config view --minify | grep namespace:kubeconfigファイル作成の概要
- opensslを使用してキーと証明書署名要求(CSR)を作成します。
- CertificateSigningRequestオブジェクト定義ファイルを作成します。
- CertificateSigningRequestオブジェクトを作成します。
- CSR(CertificateSigningRequest)を承認します。
- CSRオブジェクトの証明書を取得します。
- クラスターCA証明書を取得します。
- kubeconfigファイルにクラスター構成を設定します。
- ユーザーを設定します。
- コンテキストを作成します。
- ユーザーのための名前空間を作成します。
- kubeconfigファイルにコンテキストを指定します。
- kubeconfigをユーザーに渡します。
- ユーザーのconfigファイルを使用して権限をテストします。
- ユーザーに役割を割り当てます。
- ユーザーのconfigファイルを使用して権限を再度テストします。
結論
この記事では、Role、RoleBinding、ClusterRole、ClusterRoleBindingの基本を見てきました。また、これらのオブジェクトをクラスター内に作成しました。次に、特定のユーザーが特定の名前空間内で操作を実行できるようにするconfigファイルを作成しました。RBACがKubernetesクラスターへのアクセスを制限するのにどのように役立つかを見てきました。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。