一、kubernetes安全框架

k8s安全控制框架主要由下面三个阶段进行控制,每一个阶段都支持插件方式,通过api server配置来启用插件。

1、鉴权:Authentication

2、授权:Authorization

3、准入控制:Admission Control

客户端要想访问k8s集群api server,一般需要证书、token或用户名+密码;如果Pod访问,需要ServiceAccount。

二、认证、授权、准入控制

2.1 鉴权:Authentication

三种客户端身份认证:

a、HTTPS证书认证: 基于CA证书签名的数字证书认证

b、HTTP Token认证:通过一个Token来识别用户

c、HTTP Base认证:用户名+密码的方式认证

2.2、授权:Authorization

RBAC(Role-BasedAccess Control,基于角色的访问控制):负责完成授权(Authorization)工作。

RBAC根据API请求属性,决定允许还是拒绝

比较常见的授权维度:

a、user:用户名

b、group:用户分组

c、资源,如pod、deployment

d、资源操作方法:get, list, create, update, patch, watch, delete

e、命名空间

f、API组

2.3 准入控制:Admission Control

实际上是一个准入控制插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。

准入控制插件列表:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

三、基于角色的权限访问控制:RBAC

RBAC(Roke-Based Access Control,基于角色的访问控制),允许通过kubernetes API动态配置策略(立即生效)。

3.1 角色:

1、Role:授权特定命名空间的访问权限

2、ClusterRole:授权所有命名空间的访问权限

3.2 角色绑定:

1、RoleBinding:将角色绑定到主体(即subject)

2、ClusterRoleBinding:将集群角色绑定到主体

3.3 主体:

1、User: 用户

2、Group: 用户组

3、 ServiceAccount:服务账号

四、案例:为指定用户授权访问不同命名空间权限

示例:为qj用户授权default命名空间pod读取权限

4.1、用k8s CA签发客户端证书

CA指的是k8s的根证书。

kubeadmin部署,目录是:/etc/kubernetes/pki/ca.crt  和 ca.key

二进制部署,一般会放到一个单独的目录:TLS/kubernetes/ca.pem或者其他后缀 和 ca-key.pem

需要单独安装cfssl、 cfssl-certinfo、cfssljson等 命令

vi 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 > qj-csr.json <<EOF

{

  "CN": "qj",

  "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 qj-csr.json | cfssljson -bare qj

注:

CN字段代表用户名

O字段代表用户组名

# bash cert.sh

会生成qj-key.pem和qj.pem两个文件

4.2、生成kubeconfig授权文件

# vi  kubeconfig.sh

kubectl config set-cluster kubernetes \

  --certificate-authority=/etc/kubernetes/pki/ca.crt \

  --embed-certs=true \

  --server=https://192.168.2.153:6443 \

  --kubeconfig=qj.kubeconfig

#设置客户端认证

kubectl config set-credentials qj \

  --client-key=qj-key.pem \

  --client-certificate=qj.pem \

  --embed-certs=true \

  --kubeconfig=qj.kubeconfig

#设置默认上下文

kubectl config set-context kubernetes \

  --cluster=kubernetes \

  --user=qj \

  --kubeconfig=qj.kubeconfig

#设置当前使用配置

kubectl config use-context kubernetes --kubeconfig=qj.kubeconfig

# bash  kubeconfig.sh

会生成qj.kubeconfig文件。

4.3、创建RBAC权限策略

拷贝qj.kubeconfig文件到远程主机。

# scp qj.kubeconfig root@x.x.x.x:~

在远程主机执行kubectl命令:

# kubectl get pods  --kubeconfig=qj.kubeconfig   此时会报qj账户无法列出默认命名空间pods,即没有权限

创建RBAC权限策略

# vi rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

namespace: default

name: pod-server

rule:

- apiGroups: [""] #API组

  resources: ["pods"] #资源

  verbs: ["get","watch","list"] #操作方法

---

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

name: read-pods

namespace: default

subjects:

- kind: User #主体

  name: qj #用户名

  apiGroup: rbac.authorization.k8s.io

roleRef:

kind: Role #绑定角色

name: pod-reader #绑定的角色名称

apiGroup: rbac.authorization.k8s.io

# kubectl apply -f rbac.yaml

4.4、# 指定kubeconfig文件测试:

# kubectl get pods --kubeconfig=./qj.kubeconfig

4.5、# 添加service权限,修改此配置:

# kubectl apply -f rbac.yaml

4.6、# 添加apps和deployment权限

# kubectl apply -f rbac.yaml

4.7、# 官方示例参考:

https://kubernetes.io/docs/reference/access-authn-authz/rbac/

4.8、查看所有API接口:

# kubectl api-resources   《红框重表示API组,只有v1的表示为核心组,留空 。如apps/v1表示组为apps组》

4.9、不添加kubeconfig文件直接执行kubectl命令

放在家目录如:/root

# mkdir /root/.kube

# mv qj.kubeconfig /root/.kube/config

# kubectl get pod,svc

五、授权一个应用程序(pod)访问apiserver流程

1、创建一个serviceaccount

2、创建role规则

3、role绑定serviceaccount

subjects:

- king: ServiceAccount

name: nfs-client-provisioner

六、获取token

# kubectl get sa

#kubectl get secret

七、管理员权限组

获取权限组:

获取管理员权限组,默认的管理员权限组:

赋管理员权限,可以直接使用:

# kubectl create serviceaccount dashboard-admin -n kube-system

# kubectl create clusterrolebinding dashboard-admin --cluserrrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

#kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret |awk '/dashboard-admin/{print $1}')

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐