Kubernetes での役割ベースのアクセス制御 (RBAC)
このページでは
- 前提条件
- どうする?
- ロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクト ファイルを作成します。
- Role、Role Binding、Cluster Role、Cluster Role Binding オブジェクトを作成します。
- kubeconfig(config) ファイルを使用してユーザーにアクセスを提供します。
- Kubeconfig ファイル作成の概要
役割ベースのアクセス制御(RBAC)は、Kubernetes クラスタ内のコンピュータまたはネットワーク リソースへのアクセスを割り当てるために使用されます。
この記事では、RBAC の基本を理解し、Role、ClusterRole、RoleBinding、ClusterRoleBinding オブジェクトを作成します。
次に、kubeconfig ファイルを作成して、選択した名前空間で特定のユーザーに制限付きアクセスを付与します。
ただし、先に進む前に、まず基本を理解しましょう。
- Role または ClusterRole には一連の権限が含まれています。
- 役割は特定の名前空間内で権限を設定し、ClusterRole は名前空間のないリソースです。
- ロール バインディングは、ロールで定義された権限をユーザーまたは一連のユーザーに付与しますが、ClusterRoleBinding はクラスタ全体にアクセスする権限を付与します
- RoleBinding は、同じ名前空間内の任意の Role を参照できます。または、RoleBinding は ClusterRole を参照し、その ClusterRole を RoleBindin の名前空間にバインドできます。
- kubeconfig ファイルは、kubectl コマンドライン ツールから Kubernetes へのアクセスを構成するために使用されるファイルです。
RBAC を詳しく理解するには、こちらの Kubernetes の公式ドキュメントにアクセスしてください。
Note: Refer screenshots to avoid any confusion before executing the commands. ( = user machine)
前提条件
- 少なくとも 1 つのワーカー ノードを含む Kubernetes クラスタ。
Kubernetes クラスタの作成方法を学習するには、ここをクリックしてください。このガイドは、AWS Ubuntu EC2 インスタンスで 1 つのマスターと 2 つのノードを持つ Kubernetes クラスターを作成するのに役立ちます。
何をしたらいいでしょう?
- ロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクト ファイルを作成します。
- クラスタ内にロール、ロール バインディング、クラスタ ロール、クラスタ ロール バインディング オブジェクトを作成します。
- kubeconfig ファイルを使用してユーザーにアクセスを提供します。
- 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 ファイル作成の概要
- openssl を使用して鍵と証明書署名要求 (CSR) を作成します。
- CertificateSigningRequest オブジェクト定義ファイルを作成します。
- CertificateSigningRequest オブジェクトを作成します。
- CSR (CertificateSigningRequest) を承認します。
- CSR オブジェクトの証明書を取得します。
- クラスタ CA 証明書を取得します。
- kubeconfig ファイルでクラスタ構成を設定します。
- ユーザーを設定します。
- コンテキストを作成します。
- ユーザーの名前空間を作成します。
- kubeconfig ファイルでコンテキストを指定します。
- kubeconfig をユーザーに渡します。
- ユーザー構成ファイルを使用して権限をテストする
- ユーザーに役割を割り当てる
- ユーザー構成ファイルを使用して、権限を再度テストします。
結論
この記事では、Role、RoleBinding と ClusterRole、ClusterRoleBinding の基本について説明し、これらのオブジェクトもクラスター内に作成しました。次に、特定のユーザーが特定の名前空間で操作を実行できるようにする構成ファイルを作成しました。 RBAC が Kubernetes クラスタへのアクセスを制限するのにどのように役立つかを見てきました。