kubernetes RBAC実戦kubernetesユーザーロールアクセス制御,dashboardアクセス,kubectl構成生成


kubernetes RBAC実戦
環境準備
まずkubeadmでkubernetesクラスタをインストールして、kubernetes 1.8.2インストールパッケージ|kubernetes 1.9.2インストールパッケージは使いやすくて便利で、サービスは周到で、子供はいじめません
本明細書の目的は、devuserという名前のユーザーが特定のnamespaceのpodにアクセスできるようにすることです.
コマンドラインkubectlアクセス
cfsslのインストール
このツールは証明書を生成するのに非常に便利で、pem証明書とcrt証明書、符号化が一致して直接使用することができます
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /bin/cfssl-certinfo

クライアント証明書の発行
Ca証明書と鍵に基づいてユーザー証明書を発行したルート証明書は、/etc/kubernetes/pkiディレクトリの下にあります.
[root@master1 ~]# ls /etc/kubernetes/pki/
apiserver.crt                 ca-config.json  devuser-csr.json    front-proxy-ca.key      sa.pub
apiserver.key                 ca.crt          devuser-key.pem     front-proxy-client.crt
apiserver-kubelet-client.crt  ca.key          devuser.pem         front-proxy-client.key
apiserver-kubelet-client.key  devuser.csr     front-proxy-ca.crt  sa.key

次のファイルに注意してください:ca.crt ca.key ca-config.json devuser-csr.jsonca-config.jsonファイルの作成
cat > ca-config.json <

devuser-csr.jsonファイルの作成:k 8 sのユーザー名はCNから取得されます.グループはOから取得した.このユーザーまたはグループは、後続のロールバインドで使用されます.
cat > devuser-csr.json <

userの証明書を生成するには:
$ cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser

次のファイルが生成されます.
devuser.csr  devuser-key.pem  devuser.pem

証明書の検証
# cfssl-certinfo -cert kubernetes.pem

configファイルの生成
kubeadmはadmin.confを生成しました.私たちはこのファイルを直接利用して、自分でクラスタパラメータを構成することができます.
$  cp /etc/kubernetes/admin.conf devuser.kubeconfig

クライアント認証パラメータを設定するには、次の手順に従います.
kubectl config set-credentials devuser \
--client-certificate=/etc/kubernetes/ssl/devuser.pem \
--client-key=/etc/kubernetes/ssl/devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig

コンテキストパラメータを設定するには、次の手順に従います.
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=kube-system \
--kubeconfig=devuser.kubeconfig

否定コンテキストを設定するには、次の手順に従います.
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig

以上の手順を1つ実行するとdevuser.kubeconfigの変化を見ることができます.中の最も主要な3つのもの
  • cluster:クラスタアドレスと公開鍵
  • を含むクラスタ情報.
  • user:ユーザー情報、クライアント証明書と秘密鍵、本物の情報は証明書から読み込まれ、人が見ることができるのは人に見せるだけです.
  • context:namespace clusterとuser
  • の3元グループを維持する
    ロールの作成
    pod-readerというロールを作成
    [root@master1 ~]# cat pod-reader.yaml
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: kube-system
      name: pod-reader
    rules:
    - apiGroups: [""] # "" indicates the core API group
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    kubectl create -f pod-reader.yaml

    ユーザーのバインド
    ロールバインドを作成しpod-readerロールをdevuserにバインド
    [root@master1 ~]# cat devuser-role-bind.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: read-pods
      namespace: kube-system
    subjects:
    - kind: User
      name: devuser   #     
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader  #     
      apiGroup: rbac.authorization.k8s.io
    kubectl create -f devuser-role-bind.yaml

    新しいconfigファイルの使用
    $ rm .kube/config && cp devuser.kubeconfig .kube/config

    効果は、他のnamespaceの権限もなく、node情報にもアクセスできません.
    [root@master1 ~]# kubectl get node
    Error from server (Forbidden): nodes is forbidden: User "devuser" cannot list nodes at the cluster scope
    
    [root@master1 ~]# kubectl get pod -n kube-system
    NAME                                       READY     STATUS    RESTARTS   AGE
    calico-kube-controllers-55449f8d88-74x8f   1/1       Running   0          8d
    calico-node-clpqr                          2/2       Running   0          8d
    kube-apiserver-master1                     1/1       Running   2          8d
    kube-controller-manager-master1            1/1       Running   1          8d
    kube-dns-545bc4bfd4-p6trj                  3/3       Running   0          8d
    kube-proxy-tln54                           1/1       Running   0          8d
    kube-scheduler-master1                     1/1       Running   1          8d
    
    [root@master1 ~]# kubectl get pod -n default
    Error from server (Forbidden): pods is forbidden: User "devuser" cannot list pods in the namespace "default": role.rbac.authorization.k8s.io "pod-reader" not found

    dashboardアクセス
    Serviceaccountの原理
    k 8 sには2つのユーザーがいます.1つはUserです.1つはservice accountです.Userは人に使います.service accountはプロセスに使います.プロセスに関連する権限を持たせます.
    dasboardがプロセスである場合、サービスaccountを作成してk 8 sにアクセスさせることができます.
    admin権限をdashboardに付与する方法を見てみましょう.
    ╰─➤  cat dashboard-admin.yaml
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: kubernetes-dashboard
      labels:
        k8s-app: kubernetes-dashboard
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: kubernetes-dashboard
      namespace: kube-system

    kubernetes-dashboardというServiceAccountをcluster-adminというClusterRoleにバインドします.このcluster roleはとてもすごいです.どんな権限もあります.
    [root@master1 ~]# kubectl describe clusterrole cluster-admin -n kube-system
    Name:         cluster-admin
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate=true
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
                 [*]                []              [*]
      *.*        []                 []              [*]

    dashboardの作成時にこのサービスaccountが作成されました.
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kube-system

    そしてdeploymentでservice accountを指定します
          volumes:
          - name: kubernetes-dashboard-certs
            secret:
              secretName: kubernetes-dashboard-certs
          - name: tmp-volume
            emptyDir: {}
          serviceAccountName: kubernetes-dashboard

    より安全な方法
    [root@master1 ~]# cat admin-token.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: admin
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      name: admin
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    [root@master1 ~]# kubectl get secret -n kube-system|grep admin
    admin-token-7rdhf                        kubernetes.io/service-account-token   3         14m
    [root@master1 ~]# kubectl describe secret admin-token-7rdhf -n kube-system
    Name:         admin-token-7rdhf
    Namespace:    kube-system
    Labels:       
    Annotations:  kubernetes.io/service-account.name=admin
                  kubernetes.io/service-account.uid=affe82d4-d10b-11e7-ad03-00163e01d684
    
    Type:  kubernetes.io/service-account-token
    
    Data
    ====
    ca.crt:     1025 bytes
    namespace:  11 bytes
    token:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi03cmRoZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFmZmU4MmQ0LWQxMGItMTFlNy1hZDAzLTAwMTYzZTAxZDY4NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.jSfQhFsY7V0ZmfqxM8lM_UUOoUhI86axDSeyVVtldSUY-BeP2Nw4q-ooKGJTBBsrOWvMiQePcQxJTKR1K4EIfnA2FOnVm4IjMa40pr7-oRVY37YnR_1LMalG9vrWmqFiqIsKe9hjkoFDuCaP7UIuv16RsV7hRlL4IToqmJMyJ1xj2qb1oW4P1pdaRr4Pw02XBz9yBpD1fs-lbwheu1UKcEnbHS_0S3zlmAgCrpwDFl2UYOmgUKQVpJhX4wBRRQbwo1Sn4rEFVI1NIa9l_lM7Mf6YEquLHRu3BCZTdu9YfY9pevQz4OfHE0NOvDIqmGRL8Z9kPADAXbljWzcD1m1xCQ

    このtokenでインタフェースにログインすればいいです