はじめに
KubernetesではRBAC(Role Based Access Control)という機構で権限を制御しています。
本記事では、DockerDesktopでデフォルトで用意されるdocker-desktopの証明書情報を確認することでdocker-desktopユーザがなぜadmin権限を持っているのか?についても解説します。
環境情報
- Docker Desktop 2.4(DE 19.03, K8s 1.18)
kubeconfigを作成する流れ
事前知識としてKubenetesを手動でインストールするKubernetesHardwayの手順にもあるようにadmin権限でクラスターを接続するために下記の情報を入れたadminユーザ用のcsr/key/pemを作成し
"names": [ { "C": "US", "L": "Portland", "O": "system:masters", "OU": "Kubernetes The Hard Way", "ST": "Oregon" }
下記でconfigファイルを作成して
kubectl config set-credentials admin \ --client-certificate=admin.pem \ --client-key=admin-key.pem \ --embed-certs=true \ --kubeconfig=admin.kubeconfig
操作する端末の.kube/configに配置します。
それによってユーザはsystem:mastersというグループに属しているという情報を持つのでそれに対応した権限を持つわけです。
DockerDesktopの場合
インストールが行われると自動的に.kube/configには以下のように証明書情報が作成されclient-certificate-data
に文字列として格納されています。
users: - name: docker-desktop user: client-certificate-data: LS0.... client-key-data: LS0...
この文字列をbase64でデコードすれば改行付きの以下のような形式となるので
-----BEGIN CERTIFICATE----- MIIC9D.. ... I+Aobq.. -----END CERTIFICATE-----
このファイルをopensslコマンドで表示させると
Certificate: Data: Version: 3 (0x2) Serial Number: ... Signature Algorithm: sha256WithRSAEncryption Issuer: CN = kubernetes Validity Not Before: xx Not After : xx Subject: O = system:masters, CN = docker-for-desktop ...
とsystem:mastersに所属していることや証明書の期限(Not After)が分かります。
尚、デコードする前に改行なしの文字列を読み込むと以下のエラーとなりますのでご注意ください。
$ openssl x509 -text < hoge.crt unable to load certificate 34359969584:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
終わりに
system:mastersグループに属しているため、以下記事にあるようにdocker-desktopはcluster-admin権限を持ちます。
cluster-adminは以下の権限があるためdocker-desktopでは全操作が可能となっています。
PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- *.* [] [] [*] [*] [] [*]
以上、ご参考になれば幸いです。