zoukankan      html  css  js  c++  java
  • k8s 案例为指定用户授权访问不同命名空间权限

    k8s-案例为指定用户授权访问不同命名空间权限

    1. 示例

    • 示例:为zhangsan用户授权default命名空间Pod读取权限

      1. 用K8S CA签发客户端证书
      2. 生成kubeconfig授权文件
      3. 创建RBAC权限策略
    • 安装cfssl证书生成工具

      [root@k8s-master rbac]# vim cfssl.sh 
      [root@k8s-master rbac]# cat cfssl.sh 
      #!/bin/bash
      wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
      chmod +x cfssl*
      mv cfssl_linux-amd64 /usr/bin/cfssl
      mv cfssljson_linux-amd64 /usr/bin/cfssljson
      mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
      
    • 用K8S CA签发客户端证书

      [root@k8s-master rbac]# vim cert.sh 
      [root@k8s-master rbac]# cat cert.sh 
      
      cat > ca-config.json <<EOF
      {
        "signing": {
          "default": {
            "expiry": "87600h"
          },
          "profiles": {
            "kubernetes": {
              "usages": [
                  "signing",
                  "key encipherment",
                  "server auth",
                  "client auth"
              ],
              "expiry": "87600h"
            }
          }
        }
      }
      EOF
      
      cat > zhangsan-csr.json <<EOF
      {
        "CN": "zhangsan",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
      
      cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes zhangsan-csr.json | cfssljson -bare zhangsan
      
    • 为指定用户授权访问不同命名空间权限

      [root@k8s-master rbac]# vim kubeconfig.sh 
      [root@k8s-master rbac]# cat kubeconfig.sh 
      
      kubectl config set-cluster kubernetes \
        --certificate-authority=/etc/kubernetes/pki/ca.crt \
        --embed-certs=true \
        --server=https://172.17.0.2:6443 \
        --kubeconfig=zhangsan.kubeconfig
       
      # 设置客户端认证
      kubectl config set-credentials zhangsan \
        --client-key=zhangsan-key.pem \
        --client-certificate=zhangsan.pem \
        --embed-certs=true \
        --kubeconfig=zhangsan.kubeconfig
      
      # 设置默认上下文
      kubectl config set-context kubernetes \
        --cluster=kubernetes \
        --user=zhangsan \
        --kubeconfig=zhangsan.kubeconfig
      
      # 设置当前使用配置
      kubectl config use-context kubernetes --kubeconfig=zhangsan.kubeconfig
      
    • 为指定用户授权访问不同命名空间权限

      [root@k8s-master rbac]# vim rbac.yaml 
      [root@k8s-master rbac]# cat rbac.yaml 
      kind: Role
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        namespace: default
        name: pod-reader
      rules:
      - apiGroups: [""]     # api组
        resources: ["pods"]      # 资源
        verbs: ["get", "watch", "list"]  # 资源操作方案
      
      ---
      
      kind: RoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: read-pods         # 调用上面集合名称
        namespace: default
      subjects:
      - kind: User
        name: zhangsan      # 授权访问的用户
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role      # 授权特定命名空间的访问权限
        name: pod-reader
        apiGroup: rbac.authorization.k8s.io
      
    • 认证流程图
      image

    2. 案例操作

    • 执行cfssl工具安装

      [root@k8s-master rbac]# vim cfssl.sh 
      [root@k8s-master rbac]# sh cfssl.sh 
      --2021-08-27 15:58:44--  https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
      Resolving pkg.cfssl.org (pkg.cfssl.org)... 104.18.22.229, 104.18.23.229, 2606:4700::6812:17e5, ...
      Connecting to pkg.cfssl.org (pkg.cfssl.org)|104.18.22.229|:443... connected.
      HTTP request sent, awaiting response... 301 Moved Permanently
      Location: https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl_linux-amd64 [following]
      --2021-08-27 15:58:45--  https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl_linux-amd64
      Resolving github.com (github.com)... 20.205.243.166
      Connecting to github.com (github.com)|20.205.243.166|:443... connected.
      HTTP request sent, awaiting response... 302 Found
      Location: https://github-releases.githubusercontent.com/21591001/6deaa080-9ebe-11eb-919d-cbab8a7bb20b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T075826Z&X-Amz-Expires=300&X-Amz-Signature=ba13061928bac86e9aa4e37155c23b3b1ec2ed273d252773f2754f0180dd497f&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssl_linux-amd64&response-content-type=application%2Foctet-stream [following]
      --2021-08-27 15:58:45--  https://github-releases.githubusercontent.com/21591001/6deaa080-9ebe-11eb-919d-cbab8a7bb20b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T075826Z&X-Amz-Expires=300&X-Amz-Signature=ba13061928bac86e9aa4e37155c23b3b1ec2ed273d252773f2754f0180dd497f&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssl_linux-amd64&response-content-type=application%2Foctet-stream
      Resolving github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.111.154, 185.199.109.154, 185.199.108.154, ...
      Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.111.154|:443... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 10376657 (9.9M) [application/octet-stream]
      Saving to: ‘cfssl_linux-amd64’
      
      100%[==============================================================>] 10,376,657  1.54MB/s   in 2m 23s 
      
      2021-08-27 16:01:09 (70.8 KB/s) - ‘cfssl_linux-amd64’ saved [10376657/10376657]
      
      --2021-08-27 16:01:09--  https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
      Resolving pkg.cfssl.org (pkg.cfssl.org)... 104.18.22.229, 104.18.23.229, 2606:4700::6812:17e5, ...
      Connecting to pkg.cfssl.org (pkg.cfssl.org)|104.18.22.229|:443... connected.
      HTTP request sent, awaiting response... 301 Moved Permanently
      Location: https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssljson_linux-amd64 [following]
      --2021-08-27 16:01:10--  https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssljson_linux-amd64
      Resolving github.com (github.com)... 20.205.243.166
      Connecting to github.com (github.com)|20.205.243.166|:443... connected.
      HTTP request sent, awaiting response... 302 Found
      Location: https://github-releases.githubusercontent.com/21591001/8a86d880-9ebe-11eb-9d16-2fd0c4fe9f34?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T080110Z&X-Amz-Expires=300&X-Amz-Signature=16d0c382b735e876b99cdc07efbd6572ac9c7b0cbe00a244773de81a72b069b7&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssljson_linux-amd64&response-content-type=application%2Foctet-stream [following]
      --2021-08-27 16:01:11--  https://github-releases.githubusercontent.com/21591001/8a86d880-9ebe-11eb-9d16-2fd0c4fe9f34?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T080110Z&X-Amz-Expires=300&X-Amz-Signature=16d0c382b735e876b99cdc07efbd6572ac9c7b0cbe00a244773de81a72b069b7&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssljson_linux-amd64&response-content-type=application%2Foctet-stream
      Resolving github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.109.154, 185.199.110.154, 185.199.111.154, ...
      Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.109.154|:443... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 2277873 (2.2M) [application/octet-stream]
      Saving to: ‘cfssljson_linux-amd64’
      
      100%[==============================================================>] 2,277,873    408KB/s   in 5.5s   
      
      2021-08-27 16:01:18 (401 KB/s) - ‘cfssljson_linux-amd64’ saved [2277873/2277873]
      
      --2021-08-27 16:01:18--  https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
      Resolving pkg.cfssl.org (pkg.cfssl.org)... 104.18.22.229, 104.18.23.229, 2606:4700::6812:17e5, ...
      Connecting to pkg.cfssl.org (pkg.cfssl.org)|104.18.22.229|:443... connected.
      HTTP request sent, awaiting response... 301 Moved Permanently
      Location: https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl-certinfo_linux-amd64 [following]
      --2021-08-27 16:01:18--  https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl-certinfo_linux-amd64
      Resolving github.com (github.com)... 20.205.243.166
      Connecting to github.com (github.com)|20.205.243.166|:443... connected.
      HTTP request sent, awaiting response... 302 Found
      Location: https://github-releases.githubusercontent.com/21591001/7b078f80-9ebe-11eb-8422-7005df0eb28f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T080053Z&X-Amz-Expires=300&X-Amz-Signature=29c27a564c53e2b1cc5b7bd74f2ff78414d64cb633c27f8114f491d71670ea51&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssl-certinfo_linux-amd64&response-content-type=application%2Foctet-stream [following]
      --2021-08-27 16:01:19--  https://github-releases.githubusercontent.com/21591001/7b078f80-9ebe-11eb-8422-7005df0eb28f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210827%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210827T080053Z&X-Amz-Expires=300&X-Amz-Signature=29c27a564c53e2b1cc5b7bd74f2ff78414d64cb633c27f8114f491d71670ea51&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=21591001&response-content-disposition=attachment%3B%20filename%3Dcfssl-certinfo_linux-amd64&response-content-type=application%2Foctet-stream
      Resolving github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.110.154, 185.199.111.154, 185.199.108.154, ...
      Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.110.154|:443... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 6595195 (6.3M) [application/octet-stream]
      Saving to: ‘cfssl-certinfo_linux-amd64’
      
      100%[==============================================================>] 6,595,195    178KB/s   in 22s    
      
      2021-08-27 16:01:42 (287 KB/s) - ‘cfssl-certinfo_linux-amd64’ saved [6595195/6595195]
      
      
    • 用K8S CA签发客户端证书

      [root@k8s-master rbac]# vim cert.sh 
      [root@k8s-master rbac]# cat cert.sh 
      
      cat > ca-config.json <<EOF
      {
        "signing": {
          "default": {
            "expiry": "87600h"
          },
          "profiles": {
            "kubernetes": {
              "usages": [
                  "signing",
                  "key encipherment",
                  "server auth",
                  "client auth"
              ],
              "expiry": "87600h"
            }
          }
        }
      }
      EOF
      
      cat > zhangsan-csr.json <<EOF
      {
        "CN": "zhangsan",
        "hosts": [],
        "key": {
          "algo": "rsa",
          "size": 2048
        },
        "names": [
          {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
          }
        ]
      }
      EOF
      
      cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes zhangsan-csr.json | cfssljson -bare zhangsan
      [root@k8s-master rbac]# sh cert.sh 
      2021/08/27 16:33:32 [INFO] generate received request
      2021/08/27 16:33:32 [INFO] received CSR
      2021/08/27 16:33:32 [INFO] generating key: rsa-2048
      2021/08/27 16:33:32 [INFO] encoded CSR
      2021/08/27 16:33:32 [INFO] signed certificate with serial number 163143268857299429625748078038132938378015415460
      2021/08/27 16:33:32 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
      websites. For more information see the Baseline Requirements for the Issuance and Management
      of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
      specifically, section 10.2.3 ("Information Requirements").
      
    • 执行生成kubeconfig文件

      [root@k8s-master rbac]# vim kubeconfig.sh 
      [root@k8s-master rbac]# cat kubeconfig.sh 
      
      kubectl config set-cluster kubernetes \
        --certificate-authority=/etc/kubernetes/pki/ca.crt \
        --embed-certs=true \
        --server=https://172.17.0.2:6443 \
        --kubeconfig=zhangsan.kubeconfig
       
      # 设置客户端认证
      kubectl config set-credentials zhangsan \
        --client-key=zhangsan-key.pem \
        --client-certificate=zhangsan.pem \
        --embed-certs=true \
        --kubeconfig=zhangsan.kubeconfig
      
      # 设置默认上下文
      kubectl config set-context kubernetes \
        --cluster=kubernetes \
        --user=zhangsan \
        --kubeconfig=zhangsan.kubeconfig
      
      # 设置当前使用配置
      kubectl config use-context kubernetes --kubeconfig=zhangsan.kubeconfig
      
      
      [root@k8s-master rbac]# sh kubeconfig.sh 
      Cluster "kubernetes" set.
      User "zhangsan" set.
      Context "kubernetes" created.
      Switched to context "kubernetes".
      
    • 没有授权访问测试一下

      [root@k8s-master rbac]# kubectl --kubeconfig=zhangsan.kubeconfig  get pods
      Error from server (Forbidden): pods is forbidden: User "zhangsan" cannot list resource "pods" in API group "" in the namespace "default"
      
    • 执行授权配置

      [root@k8s-master rbac]# vim rbac.yaml 
      [root@k8s-master rbac]# cat rbac.yaml 
      kind: Role
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        namespace: default
        name: pod-reader
      rules:
      - apiGroups: [""]     # api组
        resources: ["pods"]      # 资源
        verbs: ["get", "watch", "list"]  # 资源操作方案
      
      ---
      
      kind: RoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: read-pods         # 调用上面集合名称
        namespace: default
      subjects:
      - kind: User
        name: zhangsan      # 授权访问的用户
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role      # 授权特定命名空间的访问权限
        name: pod-reader
        apiGroup: rbac.authorization.k8s.io
      [root@k8s-master rbac]# kubectl apply -f rbac.yaml 
      role.rbac.authorization.k8s.io/pod-reader created
      rolebinding.rbac.authorization.k8s.io/read-pods created
      
    • 测试

      [root@k8s-master rbac]# kubectl --kubeconfig=zhangsan.kubeconfig get pods
      NAME                                     READY   STATUS    RESTARTS   AGE
      nfs-client-provisioner-ff6b5d864-sbcqq   1/1     Running   0          3d7h
      web-7d87d686d6-54txq                     1/1     Running   0          20h
      [root@k8s-master rbac]# kubectl --kubeconfig=zhangsan.kubeconfig get svc
      Error from server (Forbidden): services is forbidden: User "zhangsan" cannot list resource "services" in API group "" in the namespace "default"
      
  • 相关阅读:
    $("").append无反应
    go 客户端、服务端
    go mysql insert变量到数据库
    .gvfs: Permission denied
    go笔记
    java socket通信笔记
    (转)linux中top命令下显示出的PRNIRESSHRS\%MEM TIME+都代表什么
    adb Android Debug Bridge 安卓调试桥
    一阶段冲刺(四)
    一阶段冲刺(三)
  • 原文地址:https://www.cnblogs.com/scajy/p/15667342.html
Copyright © 2011-2022 走看看