Kubernetes 认证与授权

Kubernetes 认证与授权

  • serviceaccounts
    • 创建并使用 serviceaccount
  • 认证
    • 创建用户并使其能够访问指定集群
  • 授权
    • 为指定用户赋权

serviceaccounts

  • 资源对象 5 要素:
    • NAME:serviceaccounts
    • SHORTNAMES:sa
    • APIVERSION:v1
    • NAMESPACED:true
  • 所有 Pods 都有相对应的用户,被称为 serviceaccount。类似于 Linux 中的所有进程都有对应用户
  • 每一个命名空间下都会自动生成一个默认 serviceaccout,名为 default
  • 可通过命令 kubectl get serviceaccounts,查看所有的 serviceaccounts
NAMESPACE         NAME                                 SECRETS   AGE
default           default                              0         47d
ingress-nginx     default                              0         11d
kube-node-lease   default                              0         47d
kube-public       default                              0         47d
kube-system       default                              0         47d
  • 若启动 Pods 时未指定 serviceaccount,则默认使用 default
  • serviceaccount 的认证由 token 完成。token 无法人为指定,由 Kubernetes 集群自动生成,且每 2 小时更新一次

创建并使用 serviceaccount

  1. 创建 serviceaccount
# 由于 serviceaccount 为 Namespace 级别资源对象,所以需在创建时指定 Namespace
kubectl serviceaccount create test -n test
  1. 通过指定的 serviceaccount 创建 Pods
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: webserver
  name: webserver
  namespace: test
spec:
	serviceName: webserver
  replicas: 1
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
    spec:

      # 指定 Pods 启动时所使用的 serviceaccount
      serviceAccountName: test

      containers:
	    - name: nginx
		    image: nginx:1.25.2
  1. 创建 Pods
kubectl apply -f nginx-test.yaml

认证

  • 任何已安装 kubectl 工具且能够与 Kubernetes 集群的 Master 节点通讯的节点。只需要在指定目录(/root/.kube)下存放指定的配置文件(config),就能够管理 Master 节点所对应的 Kubernetes 集群
  • 同一个管理节点能够通过一个配置文件,管理任意多个 Kubernetes 集群
  • 对于 Kubernetes 集群而言,并没有用户概念,取而代之的是密钥对(公钥与私钥)或 token
  • Kubernetes 集群认证方式:
    • 账户密码:Kubernetes 1.29 版本后,已弃用
    • 证书认证:基于 Kubernetes 集群的自签名 CA 进行证书认证
    • token 认证:基于 serviceaccount 的 token 进行认证
  • Kubernetes 集群 CA 密钥和证书存放路径:/etc/kuberntes/pki
  • Kubernetes 集群超级用户 admin 的认证配置文件路径:/etc/kuberntes/admin.conf
  • Kubernetes 集群认证配置文件默认路径为:/root/.kube/config
  • /root/.kube/config 解释:
apiVersion: v1
kind: Config

# 集群信息
clusters:

# 集群名称
# 用于标识集群,而非此集群实际名称
- name: kubernetes

  cluster:

    # 自签名证书
    # 此处所看到的证书是已被 base64 转译的证书
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJSE91K0Z0Qzh3Wk13RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1EY3dORFEzTURaYUZ3MHpNekV5TURRd05EVXlNRFphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUNmV0htRmVTRExWMjFENW1ocDFremk1ZWI4REh3S1dKQjN6RU5ZTFZXNHhWZ1BETlIrSXJJWks5NGgKenZkLzJYWTZLSmRCdVFyNHhqbUtvWk9CR1N3WkQ0UXlOclIxbUZqbXVnT2NyWWF0ck5KdnNCYklFZUlueXMrKwptS3FhWU5DVzN6NS9DU1NLSER3RDJHbW11R3Y5cUhGUExsTVc0eWNxcGNsd1FwL2l3T1lsajU4WWZCTUJJNkkrCklZNDBzUTJQenp6N0NrTWxvb2lrcWNFeHcxY3I4SGxzTStGREhkVDZaMFlyNVJWaEJoMlVwL2J3WjMvL1NtclMKQmVDbnhNZjRrcFRPRE9QKzcyaE5admU4ZG9WYm5sN2hKZXExakM0YUdVcHV0SW1jZFlrZ2R5SjcyRkhuSSsvcQpQeWg4SW5JRzdhZkJPc0Mwa2lpK21NRmxjT09YQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSQUpHQVpmMENTSlprUlNmMkdJRWJhejRSazFEQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQnFMclB2b3dqcAo1RmUwZm1CRlNOdXE2OHBsU1hKT00xaDl0aWpDdEVxRDRYcGsyTmxqemg4ZHk0YWpjVHlpbkpXUENZNjBKNHJTCjdSVEVGdDdlTUJ1L3pVaGdDNHFEM0YwVHE2R1lpWEdwOGVFeWIyRGRqYktmYzhPWW9ZZ1E0bSsrbGpvSVc3WlMKZjI5R3R6UEdqK0REMnZURHBZNWxuZGg5VDdFUkszaGdZNG0yMitHVDJUNmtlZUxjYnJpLzNNVWgvTFA2a1pnZApnYmhJN0hEQlJ1ZlNFN01hMThhZGI0ckN6NmExWlBRTjNJek9yUkl3SE1DVnZQNElDTnFWY2pDSnVzejg3MS9MCnIrd2Y5Qis0RE51d1FLbDJqRFVYYkVwK1Y3dWF4NUJzd3RtU3lSSkMraWRLTWtkRzA4Y21XaytjdEJNbDVvQnMKY0dxd2pYMmxzZ0dtCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    
    # 集群连接地址 & kube-apiserver 连接地址
    server: https://10.10.10.22:6443

# 用户信息
users:

# 用户名称
# 用于标识用户,而非此用户实际名称
- name: kubernetes-admin

  user:

    # 用户公钥
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJUkJOMHRmZUM5ZkV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeU1EY3dORFEzTURaYUZ3MHlOREV5TURZd05EVXlNVEJhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXdTRm9ZOWJ1Q2RJc2VYb3AKMkx3Wm1KZHlYSEVZWi94KzFNOW1nVWZLUmNHbWtiTDlJNTJobWtUekFYZ0NTNHNJRnFjZ1dKbTZacWI0TjBWUgpvWCtCOWMwakVyZnVjei9IN29WVUYvdzYrSTBOSnRxaWZpdFM1MUNnQVIxdWxySW4wMFJHQUwrb1hRTjRxQ2hxCkpqTnlYaks4YVVpU3BxU0JIQ3QrZHIvZzdSTTRvK3lLZzFYM2twcDlPcTN0YlMxVXk1aUpqbk9uQzRiWStmcU4KL1BSeEFzRnJBZEFPZVN2bnArTlQ3K29FaXlyWGRXemNNRldJN0Jiam5Ra0kvRU5Sc09BWGlzdWFkOXZ4QjNITwovMzRncllScHo2MVJ1enk3ZTFmMDE5OG8waytVZmppbCs2cURyckhHV3gvNGJBK1c1azViL09DTkV4U25icERMCmZaWlFRd0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSQUpHQVpmMENTSlprUlNmMkdJRWJhejRSawoxREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBR1RLbkYrR2hzWk1rWDVXVDFkZmJQMWYzY1oxbVlML0U4QlQ4CnpybTNTQllaWHR2cDh5MVgzREJmN0RsK1pxMExDSHpwQXk2VkRKOWI2MlhjTE9IK05OSmZTUjhwUTkyUEtha1IKRGFYcFNCR0orSkpWZitIWG92YWd2cXhGQURxK2paLzBQN0RnT3pMWTZiNllvcElDSndMSnBYYWRHVW42YUhUdgpRV1lMcEp1STd1d0s4bzU2NTVIYnhmQmpjT2tXQ1pKZ2swYjYweUxwd0ZnR1ErVFkrRFZzd2tseWpoNHVaZnZHCkU0M1h6azZyNHYwM3VhWUtMdmV0M2l1ejlGVVhSenlmVmNhOTM1YmtVSFNtbUw0RE0rMldOTXAyOTJUdTkyRnUKNGF5VTF6cHNOS3NEa2ZuQU5BTHh2N3RQeTNFRVdrNER3c2pSQjRGQnhHQTJsZlVmNHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    
    # 用户私钥
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBd1NGb1k5YnVDZElzZVhvcDJMd1ptSmR5WEhFWVoveCsxTTltZ1VmS1JjR21rYkw5Ckk1Mmhta1R6QVhnQ1M0c0lGcWNnV0ptNlpxYjROMFZSb1grQjljMGpFcmZ1Y3ovSDdvVlVGL3c2K0kwTkp0cWkKZml0UzUxQ2dBUjF1bHJJbjAwUkdBTCtvWFFONHFDaHFKak55WGpLOGFVaVNwcVNCSEN0K2RyL2c3Uk00byt5SwpnMVgza3BwOU9xM3RiUzFVeTVpSmpuT25DNGJZK2ZxTi9QUnhBc0ZyQWRBT2VTdm5wK05UNytvRWl5clhkV3pjCk1GV0k3QmJqblFrSS9FTlJzT0FYaXN1YWQ5dnhCM0hPLzM0Z3JZUnB6NjFSdXp5N2UxZjAxOThvMGsrVWZqaWwKKzZxRHJySEdXeC80YkErVzVrNWIvT0NORXhTbmJwRExmWlpRUXdJREFRQUJBb0lCQUg2NDV3QXJ0UUVvc1JuOApPSjBIdjF2S2M3V0lWOVZUYmYxQklTZE83Y0Fic3FvRFllb09za3pCVlJudm5zSG10aVgyLzFoamRsV0kxWEdlCndGTlJrUHF4NFlPVXdKZEtrR3RIZk1oSUxvR01POGIweW80eTZ6RHdUQ3l2SFRNd0xzV0hGTS9FOGpvbDN2T24Kb1E3enp1VlVNU0I4Q0Ezai92dDI1b0lRb1F1czN2NUx2S1I0YnBiYkY4VGFEMjVyTnV4dEJIck9yTStYUUxkWQp3Mm5zNERGWFIwMWNJbUJDMGFXWjhJOUV5LzVPOTVIUm1JSUlONjVCY0VyTzlocXhrK0kvMFRjZzNBLzExYVZJCnVDT0Q3WmRCK0Y4RVN0Y3A3SDYrTldHcXR3RE45NFZOREVYRWJVS1Qwc0c4VHVsaHVYZmZtb1BNWDFwMDJ6MmwKamlsSktaRUNnWUVBNThscm9oZXRiRC9FWGZiVG56Nm5xUjhzaXdmdTRoVTI1SWlkYVVNWDBpaEMvbUlvSE0yNQpKc1dWQ0FUYU9iNGxRVVlJV2FZZFpvSG9tOWl0L2NrOGhMTk5pRStTMWZ5REFwR3c5eHJRYnltcDVrdEx4NGRkCnpDcWo4dGVHSVJKVVFiVnNKKzJva1pvMUJ0VTlxdEI1aTVkdThuK3ByZWVJYzVIQm8wU3Z5bTBDZ1lFQTFVNDMKdk1JcC94Z09hWGRaVzI1RDZsUEhaUHMwNURjRitublBBQU94R2hKZnM3QjFsK1NYaTNzdjBLMzJOYTJoZW1vbgo0V2FPSXVCVlhhbFZIdTRwWmJvbDhMMURaSklaNXJiUjJXRlRrUzZiTDRrRlJCTzRET3dzVERQekczaEdoYngrCi92d0pZWXEvVWljNHVsL3hhOENrNDhKK0Z0RFg0YkY5S0tKTTEyOENnWUVBZ0ZEd2hoNm5na3JXOGRIb0c3dDYKNDlSL08wU2NDWXNIQllOZjZWc2NQOXJNSTduQlRSalNqRlZMaU5IdTRaS1RXMHhpNlFaZU5sWnFxSVJPNWpWVwpqSHdheXdDS1lHNVhOTC9sQVJkV0ZvUXhLMjI1dU84R2pUVjU1OEZLM3RvZnpQU2J1SXNJQy9zYnFmbTVGdXdzCnJZdWEveUtQazllZW9hUXFWN0Y1eEEwQ2dZQlpTbGJXczBpMU9qSytQM0d1Ym1nTHJXcG9nU2ZRNkorZURHTjAKbEJjTTNPZ201aFV6c2tNbDVqbEwxNmFiTGNYTTRxY3pHYVVpUUZvN3pPaU8vQTlrUUJvbHZuUjVveGNvbHhzZApManEzS1pWWXZyanZtSG1SSDBRajJoTklTbjdxK004SW1pU3JLbE9RWms2KzVlNi90bkxQek5qUFlEa2VoeGZuCmJKbFNEUUtCZ0U2ZnUxeE53WTludjFyVjhhOW9tUnFXREtialJQcG1ONWlwWFZwSHI3MjREQVBsK042Skc3eGoKVUhZTU40L0NIWnBKL3cyWWNhSWRsNGtoNlFsYkh2MmNnc0RsOXBxNHRHQ3NvRHNuY29RSEo1WkRMU0lqR0wxYQpvNU04SEFqQVYxSzVHdi9mOS9yaUtLMEs0YzFYSDQ4RzM1NWZmWjIrb2o2eVRsaVRIZjRVCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

# 上下文
# 用于绑定集群和用户
contexts:
  
# 绑定名称
- name: kubernetes-admin@kubernetes

  context:

    # 所绑定的集群名称
    cluster: kubernetes

    # 所绑定的用户名称
    user: kubernetes-admin

# 当前上下文
# 用于指定此配置文件所使用的绑定信息,即通过此配置文件,所访问的集群和所使用的用户
# 可通过命令:kubectl config use-context ${context_name} 进行切换
current-context: kubernetes-admin@kubernetes

preferences: {}

创建用户并使其能够访问指定集群

  • Kubernetes Master 节点名称:k8s-master
  • Kubernetes 管理节点名称:k8s-control
  • 管理用户:test
  1. 在 k8s-control 上,创建集群认证配置路径
mkdir -p /root/.kube
  1. 在 k8s-control 上,生成密钥
# genrsa: 生成 RSA 密钥。必须是此密钥格式,否则 Kubernetes 集群将无法认证
# -out /root/test.key: 指定生成的密钥文件的输出路径和文件名
# 2048: 指定密钥的长度
openssl genrsa -out /root/.kube/test.key 2048
  1. 在 k8s-control 上,基于密钥生成证书签名请求
# -subj "/CN=test/O=dfrt": 指定主题 (Subject) 的字段信息。"CN" 表示 Common Name。Kubernetes CA 识别此字段为用户,后续授权中的用户需要填写此处信息;"O" 表示 Organization
openssl req -new -key /root/.kube/test.key -out /root/.kube/test.csr -subj "/CN=test/O=dfrt"
  1. 将证书签名请求传入 Kubernetes Master 节点后,在 Kubernetes Master 节点,基于证书签名请求,由 Kubernetes 集群的 CA 签发指定有效期的证书
# 将 csr 上传至 Kubernetes Master 节点
scp /root/.kube/test.csr root@k8s-master:/root/

# 由 Kubernetes 集群 CA 签发指定有效期的证书
# x509: X.509 证书
# -req -in /root/test.csr: 指定所输入的证书签名请求
# -CA /etc/kubernetes/pki/ca.crt: 指定 CA (Certificate Authority) 的证书文件路径
# -CAkey /etc/kubernetes/pki/ca.key: 指定 CA 的私钥文件路径
# -CAcreateserial: 在生成的证书上添加序列号,保存在 CA 的序列号文件中
# -out test.crt: 指定输出的证书文件路径和文件名
# -days 500: 指定证书的有效期为 500 天。若不写此参数,则表示证书永不过期
openssl x509 -req -in /root/test.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out test.crt -days 500
  1. 将签发的证书和 Kubernetes 集群的证书提供给 k8s-control
scp /root/test.crt /etc/kubernetes/pki/ca.crt root@k8s-control:/root/.kube
  1. 在 k8s-control 上,编写集群认证配置文件
apiVersion: v1
kind: Config
clusters:
- name: kubernetes
  cluster:

    # 指定文件
    certificate-authority: /root/.kube/ca.crt

    server: https://10.10.10.22:6443
users:
- name: k8s-contorl
  user:

    # 指定文件
    client-certificate: /root/.kube/test.crt

    # 指定文件
    client-key: /root/.kube/test.key

contexts:
- name: k8s-contorl@kubernetes
  context:
    cluster: kubernetes
    user: k8s-contorl
current-context: k8s-contorl@kubernetes
  1. 在 k8s-control 上,查看已配置的上下文,发现已显示所配置上下文
kubectl config get-contexts

# 输出结果
# 星号行为当前所使用上下文
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         k8s-contorl@kubernetes        kubernetes   k8s-contorl        
  1. 在 k8s-control 上,运行 kubectl 命令
kubectl get nodes 

# 输出结果
# 报错为无法进行指定操作
# 证明已能够与指定集群的 kube-apiserver 通讯
Error from server (Forbidden): nodes is forbidden: User "test" cannot list resource "nodes" in API group "" at the cluster scope

授权

  • Kubernetes 集群的授权是 RBAC (role-base account control) 模式
  • RBAC 模式默认拒绝所有操作请求。即只接受被允许的请求
  • 一组规则的集合,被称为角色(role);将角色与用户或 serviceaccount 绑定,被称为授权
  • 角色级别:
    • 全局级:可绑定任意命名空间下的用户或 serviceaccount。资源对象为 ClusterRole
      • 常见角色有:
        • cluster-admin:超级管理员权限
        • admin:管理员权限
        • edit:修改权限
        • view:查看权限
    • 命名空间级:只可绑定角色所在命名空间下的用户或 serviceaccount。资源对象为 Role
  • 常用权限类型:
    • 增:create
    • 删:delete
    • 改:update
    • 查:get
    • 列出:list
    • 监视:watch
  • 授权规则:
    • role + rolebinding + 用户或 serviceaccount:role 和 rolebinding 须位于相同的命名空间。用户或 serviceaccount 只在 role 所在命名空间有相应权限
    • role + clusterrolebinding + 用户或 serviceaccount:无效配置
    • clusterrole + clusterrolebinding + 用户或 serviceaccount:全局有效
    • clusterrole + rolebinding + 用户或 serviceaccount:用户或 serviceaccount 只在 rolebinding 所指定的命名空间有相应权限

为指定用户赋权

  1. 创建角色
apiVersion: rbac.authorization.k8s.io/v1

# 全局及角色
kind: ClusterRole

metadata:
  name: test

rules:

# API 组
# 可通过 kubectl api-resources 命令查看
- apiGroups:
  
  # 表示为空,即只有版本,没有组,例如资源对象 namespaces
  - ""

  # 资源对象
  resources:
  - nodes
  - namespaces
  - pods
  
  # 动作
  # 即权限类别
  verbs:
  - get
  - list
  1. 绑定角色和用户
# clusterrolebinding:全局角色绑定
# k8s-contorl@kubernetes:绑定名称
# --user=test:用户为 test,此处所配置用户,需与创建证书签名请求中的 CN 值一致
# --clusterrole=test:全局级角色为 test
kubectl create clusterrolebinding k8s-contorl@kubernetes --user=test --clusterrole=test
  1. 在 k8s-control 上,再次运行 kubectl 命令
kubectl get nodes

# 输出结果
NAME          STATUS   ROLES           AGE   VERSION
k8s-master    Ready    control-plane   47d   v1.28.2
k8s-worker1   Ready    <none>          47d   v1.28.2
k8s-worker2   Ready    <none>          47d   v1.28.2

你可能感兴趣的:(Kubernetes,kubernetes,容器,云原生)