文章目录

  • 一、K8s安全框架
    • 1.1 鉴权
      • 1.1.1 HTTPS证书认证
      • 1.1.2 HTTP Token认证
    • 1.2 授权
    • 1.3 准入控制
    • 1.4 集群四大角色
  • 二、RBAC给用户授权(TLS)
    • 2.1 签发客户端证书
    • 2.2 生成kubeconfig授权文件
      • 2.2.1 手动生成
      • 2.2.2 脚本生成
      • 2.2.3 切换操作集群
    • 2.3 定义RBAC权限策略
      • 2.3.1 创建角色、绑定角色
      • 2.3.2 给新员工授权文件
    • 2.4 RBAC权限定义法则
  • 三、RBAC给用户组授权(TLS)
  • 四、RBAC给程序授权(SA)
    • 4.1 命令创建
    • 4.2 yaml文件创建
    • 4.3 例一
    • 4.4 例二

一、K8s安全框架

K8s安全控制作用:

  • 保证容器与其所在宿主机的隔离。
  • 限制容器给基础设施或其他容器带来的干扰。
  • 最小权限原则,即合理限制所有组件的权限,确保组件只执行它被授权的行为,通过限制单个组件的能力来限制它的权限范围。
  • 明确组件间边界的划分。
  • 划分普通用户和管理员的角色。
  • 在必要时允许将管理员权限赋给普通用户。
  • 允许拥有Secret数据(Keys、Certs、Passwords)的应用在集群中运行。

安全控制框架3个阶段:

  1. 3个阶段包括鉴权(验证用户身份)、授权(判断用户访问资源的权限)、准入控制(验证用户的额外权限)。
  2. 每个阶段都支持插件方式,通过API Server配置来启用插件。

第一阶段Authentication(鉴权):判断你的身份是否是可靠的。

  • 官方提供的验证方式很多,这里列举常见的:

    • HTTPS 证书认证:基于CA证书签名的数字证书认证(kubeconfig),比如.kube/config文件就是这种认证。
    • HTTP Token认证:通过一个Token来识别用户(serviceaccount),比如我们搭建K8s图形页面登录时就使用到Token认证,但是加入集群时也使用到Token,这个不属于该种认证,只是单纯的加入集群。
    • HTTP Base认证:用户名+密码的方式认证,1.19版本弃用,安全系数低。

第二阶段Authorization(授权):控制你的权限是否可以访问相对应的资源。

  • 官方提供的验证方式很多,这里列举常见的:

    • Node、ABAC、RBAC、Webhook。

第三阶段Admission Control(准入控制):其实就是一张准入控制插件列表,根据需求把K8s的一些高级功能放入列表,哪个功能不用就把对应的控制器插件移除列表。

  • Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
  • 插件形式,方便用户实现检查准入控制,例如i当以操作等等。

1.1 鉴权

1.1.1 HTTPS证书认证

  • CA机构是可信的第三方机构,具备让信任者有追究自己责任的能力,它可以是一个公认的权威企业,也可以是企业自身。企业内部系统一般都用企业自身的认证系统。
  • CA通过证书证实他人的公钥信息,在证书上有CA的签名。在证书中绑定了公钥数据和相应私钥拥有者的身份信息,并带有CA的数字签名;在证书中也包含了CA的名称,以便于依赖方找到CA的公钥,验证证书上的数字签名。

双向CA认证工作流程:

  1. 服务端向CA机构申请证书,CA机构下发根证书、服务端证书、私钥给服务端。
  2. 客户端向CA机构申请证书,CA机构下发根证书、客户端证书、私钥给客户端。
  3. 客户端向服务端发起请求,服务端下发服务端证书给客户端。客户端在接收到服务端证书后,通过私钥解密证书,并利用服务端证书中的公钥认证证书信息比较证书里的消息。例如,比较域名和公钥与服务器刚刚发送的相关消息是否一致,如果一致,则客户端认可这个服务器的合法身份。
  4. 客户端发送客户端证书给服务端,服务端在接收到证书后通过私钥解密证书,获得客户端证书公钥,并用该公钥认证证书的信息,确认客户端是否合法。
  5. 客户端通过随机密钥加密信息,并发送加密后的信息给服务端。在服务端和客户端协商好加密方案后,客户端会产生一个随机的密钥,客户端通过协商好的加密方案加密该随机密钥,并发送该随机密钥到服务端。服务端接收这个密钥后,双方通信的所有内容都通过该随机密钥加密。

注意事项:

  • 双向CA认证要求服务器和用户双方都拥有证书,而单向认证则不需要客户端拥有CA证书。
  • 单项CA认证只需将服务端验证客户证书的过程去掉,之后协商对称密码方案和对称通话密钥时,服务端发送给客户端的密码没被加密即可。

1.1.2 HTTP Token认证

基本了解:

  1. 为验证使用者身份,需要客户端向服务端提供一个可靠的身份信息,称之为Token,这个Token被放在HTTP Header头里,在Token里有信息来表明客户身份。Token通常是一个有一定长度的难以被篡改的字符串,我们用私钥签名一个字符串后的数据也可被当作一个加密的Token。
  2. 在K8s中,每个Bearer Token都对应一个用户名,存储在API Server能访问的一个文件中(Static Token file)。客户端发起API调用请求时,需要在HTTPHeader里放入此Token,这样一来,API Server就能识别合法用户和非法用户了。
  3. sa认证方式也采用了与HTTP Bearer Token相同的实现方式。每个sa都对应一个Secret,在Secret中有一个加密的Token字段,这个Token字段就是Bearer Token。这个Token是用哪个私钥加密的,要取决于API Server的启动参数–service-account-key-file指定的文件,若没有指定该参数,则会采用API Server自己的私钥进行加密。为了方便Pod里的用户进程使用这个Token访问API Server,Secret Token里的内容会被映射到Pod中固定路径和名字的文件中。当API Server设置了启动参数–service-account-lookup=true,API Server就会验证Token是否在etcd中存在,若已从etcd中删除,则将注销容器中Token的有效性。

使用前提:

  1. 要使用这种认证方式,就需要为API Server服务设置一个保存用户信息和Token的文件,通过启动参数–token-auth-file=SOMEFILE指定文件路径。
  2. 该文件为CSV文本文件格式,每行内容都由以下字段组成

1.2 授权

  • 当客户端发起API Server调用时,API Server内部会通过授权策略决定一个API调用是否合法。授权就是授予不同的用户或程序不同的访问权限。

授权策略:

  • ABAC:基于属性的访问控制,表示使用用户配置的授权规则对用户的请求进行匹配和控制。硬伤多,已被RBAC替代。
  • RBAC:基于角色的访问控制。
  • Webhook:通过调用外部的REST服务对用户进行授权。若RBAC仍不满足特定需求,用户可以自行编写授权逻辑通过Webhook方式注册为K8s的授权服务,以实现更加复杂的授权规则。
  • Node:是一种对kubelet进行授权的特殊模式。
  • sa:是给应用程序授权的。

注意事项:

  1. 设置apiserver参数–authorization-mode,配置多种授权策略。
  2. 当设置授权策略为Node,RBAC,API Server在收到请求后,会读取该请求中的数据,生成一个访问策略对象,API Server会将这个访问策略对象和配置的授权模式逐条进行匹配,第一个被满足或拒绝的授权策略决定了该请求的授权结果,若匹配的结果是禁止访问,则API Server会终止API调用流程,并返回客户端的错误调用码。
  3. Node授权策略是限制每个Node访问自身运行的Pod等资源信息,与用户的应用授权无关。只能受限于修改自身Node的一些信息,比如Label,不能操作其他Node上的资源。之前用RBAC这种通用权限模型其实并不能满足Node这种特殊的安全要求,所以将其剥离出来定义为新的Node授权策略。

1.3 准入控制

基本了解:

  • 客户端请求通过前面的鉴权、授权后,还要过一道门槛,Admission Control准入控制。
  • 准入控制过程分为两个阶段。第一阶段,运行变更准入控制器。第二阶段,运行验证准入控制器。 某些控制器既是变更准入控制器又是验证准入控制器。
  • 若两个阶段之一的任何一个控制器拒绝了某请求,则整个请求将立即被拒绝,并向最终用户返回错误。

概念:

  • Admission Control配备了一个准入控制器的插件列表,发送给APIServer的任何请求都需要通过列表中每个准入控制器的检查,检查不通过,API Server就会拒绝此调用请求。
  • 准入控制器插件能够修改请求参数以完成一些自动化任务,比如ServiceAccount这个控制器插件。

注意事项:

  • 一般情况下不需要更改默认配置,需要二次开发时可根据自身需求来更改。
  • 除了使用官方默认配置的准入控制器之外,还可以扩展独立开发,并以运行时所配置的 Webhook 的形式运行。Webhook方式更加灵活,能够在API Server运行时修改和配置动态更新控制策略,但实现步骤较为负责,需要开发一个Admission Webhook Server实现HTTP回调的逻辑程序,还需要创建一个对应的ValidatingWebhookConfiguration配置文件。

1.启用一个准入控制器,以下是启用NamespaceLifecycle 和 LimitRanger 准入控制插件。

kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...

2.关闭一个准入控制器。

kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...

3.查看默认启用插件。

kubectl exec kube-apiserver-k8s-master -n kube-system -- kube-apiserver -h | grep enable-admission-plugins


4.也可以进入apiserver配置文件查看更改。

1.4 集群四大角色

  • k8s预定好了四个集群角色供用户使用。
内置集群角色 描述
cluster-admin 超级管理员,对集群所有权限。
admin 主要用于授权命名空间所有读写权限。
edit 允许对命名空间大多数对象读写操作,不允许查看或者修改角色、角色绑定。
view 允许对命名空间大多数对象只读权限,不允许查看角色、角色绑定和Secre。

1.查看集群所有角色,systemd:开头的为系统内部使用不能删除修改。

2.查看对应角色所赋予的资源权限。

#查看view角色对应的权限。
[root@k8s-master1 manifests]# kubectl  describe clusterrole view

二、RBAC给用户授权(TLS)

概念:

  • RBAC(Role-Based Access Control,基于角色的访问控制),是K8s默认授权策略,并且是动态配置策略,修改即时生效。
  • 很多访问控制系统也是用这个,比如Nacos。

主体(subject):

  • User:用户
  • Group:用户组
  • ServiceAccount:服务账号

角色:

  • Role:授权特定命名空间的访问权限
  • ClusterRole:授权所有命名空间的访问权限

角色绑定:

  • RoleBinding:将角色绑定到主体(即subject)
  • ClusterRoleBinding:将集群角色绑定到主体

注意事项:

  • RoleBinding在指定命名空间中执行授权,ClusterRoleBinding在集群范围执行授权。

概念图:

案例:

  • 为指定用户授权访问不同命名空间权限,例如新入职一个小弟,希望让他先熟悉K8s集群,为了安全性,先不能给他太大权限,因此先给他授权访问default命名空间Pod读取权限。

实施思路:

  1. 用K8S CA签发客户端证书,也就是是用K8s根证书签发一个客户端证书。
  2. 生成kubeconfig授权文件
  3. 创建RBAC权限策略
  4. 把kubeconfig文件给小弟就可以使用了。

生成证书步骤:

  1. 客户端证书都是基于K8s根证书来生成的,根证书在搭建K8s集群时候就被创建了,且创建时生成的ca-config配置文件是被删除了,根证书位置在/etc/kubernetes/pki目录下,一个是在K8s层面上的根证书,一个是etcd是用的。
  2. 生成ca-config配置文件,里面记录的根证书的有效期等信息。因为最后生成客户端证书时需要指定该配置文件。
  3. 生成客户端证书配置文件,里面声明一个CN字段(标识),可信任IP,生成的算法,证书里的设计属性。
  4. 使用cfssl工具指定根证书、根证书的配置文件和指定该文件中使用哪块配置、客户端证书的请求文件来生成。

2.1 签发客户端证书

1.需要先准备好K8s的根证书,我们搭建集群时就已经生成了。

2.生成客户端证书。

[root@k8s-master rbac]# cat cert.sh ##生成K8s根证书配置文件
cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOF##生成客户端证书请求文件
cat > qingjun-csr.json <<EOF
{"CN": "qingjun",       ##指定标识,后面会用到"hosts": [],"key": {"algo": "rsa",        ##生成算法"size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}]
}
EOF##使用cfssl工具来生成客户端证书,再传入到cfssljson中,生成以qingjun为前缀的证书。
## -profile参数代表使用请求文件中的哪块配置。
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes qingjun-csr.json | cfssljson -bare qingjun

2.2 生成kubeconfig授权文件

  • 往kubeconfig文件填充内容,填充出来的内容和.kube/config文件格式一样,是一个yaml文件,上面是集群信息、客户端信息、上下文信息。我这里使用的脚本,也可以分步执行。
  • 填充完后,可以指定生成出来的kubeconfig文件来查询资源测试效果,因为最后就是把这个文件给小弟用,让他指定这个文件来查询集群资源。

2.2.1 手动生成

第一步:填充集群相关信息。

[root@k8s-master rbac]# kubectl config set-cluster kubernetes \   ##set-cluster代表对授权文件中的集群部分内容进行填充。--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \
--server=https://192.168.130.145:6443 \--kubeconfig=qingjun.kubeconfig

第二步:填充客户端相关信息。

[root@k8s-master rbac]# kubectl config set-credentials qingjun \   ##set-credentials代表对授权文件中的客户端部分内容进行填充。
--client-key=qingjun-key.pem \
--client-certificate=qingjun.pem \
--embed-certs=true \
--kubeconfig=qingjun.kubeconfig

第三步:关联上下文,将集群和客户端关联在一起。

[root@k8s-master rbac]# kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=qingjun \
--kubeconfig=qingjun.kubeconfig

第四步:设置当前使用配置,指定使用哪个集群。

##指定当前操作集群名为kubernetes的集群。
[root@k8s-master rbac]# kubectl config use-context kubernetes --kubeconfig=qingjun.kubeconfig

第五步:使用授权文件测试效果。

#使用授权文件查询资源,显示没权限,是因为这个授权文件只是你访问的方式是没问题的,但是没有相关权限去访问资源。
#所以要进行下一步,创建RBAC权限策略。
[root@k8s-master bck]# kubectl  get po --kubeconfig=qingjun.kubeconfig

2.2.2 脚本生成

[root@k8s-master rbac]# cat kubeconfig.sh
# 设置集群信息
kubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/pki/ca.crt \      #指向K8s根证书。--embed-certs=true \                 #将根证书嵌套在这个授权文件里,若为flase,则只写根证书路径。--server=https://192.168.130.145:6443 \        #指定API server所在的服务器地址。--kubeconfig=aliang.kubeconfig           #生成的文件名,是个json格式的。# 设置客户端认证
kubectl config set-credentials qingjun \--client-key=aliang-key.pem \--client-certificate=qingjun.pem \--embed-certs=true \--kubeconfig=qingjun.kubeconfig# 设置默认上下文
kubectl config set-context kubernetes \    ##“kubernetes”为集群名称--cluster=kubernetes \        ##指定K8s集群名称--user=qingjun \              ##指定客户端用户名,也就是我们上步生成的客户端证书配置文件中的CN字段内容。--kubeconfig=qingjun.kubeconfig            ##授权文件。# 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=qingjun.kubeconfig

2.2.3 切换操作集群

  • 上面第四步的命令是指定操作的当前集群,当有多个K8s集群时,一个授权文件要怎么操作呢?
  • 可以生成第二套配置追加到刚刚生成的授权文件中。
  • 将上面生成的kubeconfig授权文件先备份,再生成第二个授权文件,此时第二次生成的文件内容会追加到第一次生成的qingjun.kubeconfig文件中,也就是说这个授权文件里有两套集群配置,此时就可以通过第四步命令来切换集群。
[root@k8s-master rbac]# cat kubeconfig2.sh
kubectl config set-cluster baimu \     #修改成第2个集群名称。--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://192.168.10.11:6443 \    #第二个集群API  server所在机器IP。--kubeconfig=qingjun.kubeconfig# 设置客户端认证
kubectl config set-credentials baimu \     #第二个集群客户端名。--client-key=qingjun-key.pem \       --client-certificate=qingjun.pem \--embed-certs=true \--kubeconfig=qingjun.kubeconfig# 设置默认上下文
kubectl config set-context baimu \     ##修改成第二个集群名称。--cluster=baimu \      #第二个集群名称--user=baimu \     #第二个客户端名。--kubeconfig=qingjun.kubeconfig# 设置当前使用配置
kubectl config use-context baimu --kubeconfig=qingjun.kubeconfig    #指定使用第二个集群。

2.3 定义RBAC权限策略

2.3.1 创建角色、绑定角色

1.编辑yaml文件,创建角色和绑定角色。

[root@k8s-master rbac]# cat rbac.yaml
#创建角色,该角色具备什么操作权限。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: qingjun-role
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]---
#绑定角色,和客户端用户绑定在一起,使客户端拥有该种角色的操作权限。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-podsnamespace: default
subjects:
- kind: Username: qingjunapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: qingjun-roleapiGroup: rbac.authorization.k8s.io

2.导入yaml文件,查看结果。

3.验证。使用生成的授权文件查看pod可以成功,但是查看service会失败是因为我们定义的权限规对该客户端只能查看、列出Pod资源信息。

2.3.2 给新员工授权文件

  • 此时把生成的授权文件给新员工,新员工在自己的虚拟机上安装kubectl工具后,就可以查看我集群相关资源。
  • 新员工的虚拟机是能和K8s集群网络相通的。

1.新员工主机配置阿里云的源,并安装kubelet工具。

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF[root@localhost ~]# yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0

2.将授权文件给新员工,新员工拿着授权文件在自己的虚拟机上查看k8s资源。

2.4 RBAC权限定义法则

定义步骤:

  1. 查看要定义的资源属于哪个API组里。V1前面有值的话,则该值为组名;若V1前面没值,则属于核心组。
  2. 确定角色权限空间,对应管控该空间下的所有资源权限。
  3. 填写资源组,“”代表是核心组。
  4. 填写资源名称,要使用复数形式。
  5. 填写操作资源方法,比如get、create等等。

填写示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: pod-reader
rules:
- apiGroups: [“”]    # api组,例如apps组,空值表示是核心API组,像namespace、pod、service、pv、pvc都在里面resources: [“pods”]    # 资源名称(复数),例如pods、deployments、servicesverbs: [“get”, “watch”, “list”]    # 允许对资源操作方法---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
- kind: User    # 主体。name: jane    # 主体名称。若是用户的话,则是客户端证书里的CN字段。apiGroup: rbac.authorization.k8s.io
roleRef:          # 绑定的角色kind: Rolename: pod-reader        # 角色名称apiGroup: rbac.authorization.k8s.io

认证流程图:

1.先确定资源在哪个组。

  • 斜杠前面有值,则代表在哪个组;若没有值,则代表在核心组。
[root@k8s-master rbac]# kubectl api-resources


2.编辑yaml文件,指定什么用户具备什么权限。比如我这里就添加了qingjun用户能查询pod和deployment资源,能创建deployment。

[root@k8s-master rbac]# cat rbac.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: text
rules:
- apiGroups: ["", "apps"]resources: ["pods", "deployments"]verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]resources: ["deployments"]verbs: ["create"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: rolebinding2namespace: default
subjects:
- kind: Username: qingjunapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: textapiGroup: rbac.authorization.k8s.io


3.验证,可以查询pod,deploy资源,不能查看其他任何资源。

4.验证,可以创建deployment,不能创建其他任何资源。

5.现在我让小弟只能查看deployment资源的同时,还能查看service资源。

6.现在我让小弟只能查看service资源,同时还能查看、删除deployment资源。

三、RBAC给用户组授权(TLS)

基本了解:

  • K8s本身没有组的概念,使用这个功能需要提前定义组,而k8s也就是读取客户端证书中的O字段。
  • 用户组:用户组的好处是无需单独为某个用户创建权限,统一为这个组名进行授权,所有的用户都以组的身份访问资源。

使用思路:

  1. 生成客户端证书时,修改里面的O字段。
  2. 生成授权文件。
  3. 将O字段对应的某某用户组与角色绑定。

1.生成新客户端证书。修改组里的O字段,代表哪个组,CN字段不能少,代表组里哪个用户。

2.根据新客户端证书生成授权文件,需改脚本生成的授权文件名称为qingjun.kubeconfig。

[root@k8s-master1 RBAC2]# sh kubeconfig.sh


3.角色和组进行绑定,指定组名。

4.测试dev组的用户可以删除svc资源。

四、RBAC给程序授权(SA)

基本了解:

  1. ServiceAccount,简称SA,是一种用于让程序访问K8s API的服务账号。也就是后面在绑定角色时,不再写user、group,而是写SA。
  2. 当创建namespace时,会自动创建一个名为default的SA,这个SA没有绑定任何权限。
  3. 当这个default的SA创建时,会自动创建一个default-token-xxx的secret,并自动关联到SA。而在1.24版本之后token的保存机发生变化不再放在secret里保存,新增token命令可以获取token,所以这里并没有看到default-token-xxx的secret。
  4. 当创建Pod时,若没有指定SA,会自动为pod以volume方式挂载这个default SA,在容器目录:/var/run/secrets/kubernetes.io/serviceaccount,任何一个pod都会有这个路径文件。
    • ca.crt文件:k8s根证书。
    • namespace文件:该pod在哪个命名空间下。
    • token文件:该pod拿此文件连接apiserver的凭据。

概念图:

4.1 命令创建

需求:

  • 给一个服务账号分配只能创建deployment、daemonset、statefulset资源的权限。

1.创建服务账号。

#创建一个命名空间,名为app。
[root@k8s-master rbac]# kubectl  create  ns app#在app命名空间里创建一个服务账号,名为qingjun。
[root@k8s-master rbac]# kubectl create serviceaccount qingjun -n app

2.创建集群角色,名为baimu,该角色具备创建deployments、daemonsets、statefulsets资源权限。

[root@k8s-master rbac]# kubectl create clusterrole baimu --verb=create --resource=deployments,daemonsets,statefulsets

3.账号将app命名空间下的qingjun账号和baimu集群角色绑定,名为text。

[root@k8s-master rbac]# kubectl create rolebinding text --serviceaccount=app:qingjun --clusterrole=baimu -n app

4.测试服务账号权限,创建deployment成功,而查看资源失败,正好印证我们只给了创建deployment资源权限。

[root@k8s-master rbac]# kubectl --as=system:serviceaccount:app:qingjun create deployment nginx --image=nginx  -n app

4.2 yaml文件创建

1.编辑yaml文件

[root@k8s-master rbac]# cat rbac1.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: qingjunnamespace: app
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: baimu
rules:- apiGroups: ["apps"]resources: ["deployments","daemonsets","statefulsets"] verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: textnamespace: app
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: baimu
subjects:
- kind: ServiceAccountname: qingjunnamespace: app

2.创建deploy资源,验证查看。

4.3 例一

需求:

  • 授权SA只能查看test命名空间控制器的权限。

1.创建role,定义资源操作权限。

[root@k8s-master1 RBAC]# kubectl create role test-role --verb=get,list --resource=deployments,daemonsets,statefulsets -n test

2.创建SA。

[root@k8s-master1 RBAC]# kubectl  create  sa test-sa -n test

3.SA和角色绑定。

[root@k8s-master1 RBAC]# kubectl  create rolebinding test-rolebinding --serviceaccount=test:test-sa --role=test-role -n test

4.测试效果,可以查看deploy资源,查看pod资源失败。

4.4 例二

需求:

  • 授权容器中Python程序对K8s API访问权限。

思路步骤:

  1. 创建Role,定义资源操作权限。
  2. 创建ServiceAccount。
  3. 将ServiceAccount与Role绑定。
  4. 创建Pod时,指定自定义的SA,也就拥有了对应绑定的角色权限。
  5. 进入pod容器里,执行Python程序测试操作K8s API权限。

1.写了一个python程序去访问apiserver,查看deploy和pod资源权限。

[root@k8s-master1 RBAC]# cat k8s-api-test.py
from kubernetes import client, configwith open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:token = f.read()configuration = client.Configuration()
configuration.host = "https://kubernetes"  # APISERVER地址
configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"  # CA证书
configuration.verify_ssl = True   # 启用证书验证
configuration.api_key = {"authorization": "Bearer " + token}  # 指定Token字符串
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api()
core_api = client.CoreV1Api()
try:print("###### Deployment列表 ######")#列出default命名空间所有deployment名称for dp in apps_api.list_namespaced_deployment("default").items:print(dp.metadata.name)
except:print("没有权限访问Deployment资源!")try:#列出default命名空间所有pod名称print("###### Pod列表 ######")for po in core_api.list_namespaced_pod("default").items:print(po.metadata.name)
except:print("没有权限访问Pod资源!")

2.使用python镜像创建一个pod,把上面这个程序文件放在容器里测试效果,可以看到此时没有访问资源权限,因为使用的是/var/run/secrets/kubernetes.io/serviceaccount/token下的token,默认没有任何权限,所以接下来我们需要手动授权。

#创建一个python环境。
[root@k8s-master1 RBAC]# kubectl  run py3 --image=python:3 -- sleep 24h#把python程序放进python环境里测试连接apiserver,验证是否具备查看deploy和pod资源权限。
[root@k8s-master1 RBAC]# kubectl  cp  k8s-api-test.py py3:/#进入容器测试。
[root@k8s-master1 RBAC]# kubectl  exec  -it  py3 -- /bin/bash
root@py3:/# pip3 install kubernetes -i https://mirrors.aliyun.com/pypi/simple/    ##指定阿里云的源安装kubernetes模块,测试命令依赖该模块。


3.创建一个sa和角色,两者绑定一起。

1、创建一个SA,名为qingjun。
[root@k8s-master1 ~]# kubectl  create  sa qingjun2、创建一个角色pod-reader2具备查看deploy资源权限,并将qingjun和角色绑定在一起。
[root@k8s-master1 RBAC]# cat rbac.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: pod-reader2
rules:
- apiGroups: ["apps"]resources: ["deployments"]verbs: ["get", "watch", "list"]---kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-pods2namespace: default
subjects:
- kind: ServiceAccountname: qingjun
#  apiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-reader2apiGroup: rbac.authorization.k8s.io
[root@k8s-master1 RBAC]# kubectl  apply -f rbac.yaml

4.使用命令测试效果,可以查看deploy资源,不能查看Pod资源,测试无误。

[root@k8s-master1 RBAC]# kubectl --as=system:serviceaccount:default:qingjun get deploy


5.更换默认挂载的default serviceaccount,改成我们创建具有操作权限的qingjun serviceaccount,在创建pod时指定sa。

[root@k8s-master1 RBAC]# cat py3.yaml
apiVersion: v1
kind: Pod
metadata:name: py3
spec:containers:- args:- sleep- 24himage: python:3name: py3serviceAccountName: qingjun    ##指定SA。[root@k8s-master1 RBAC]# kubectl  apply -f py3.yaml

6.容器被重建,需要再安装依赖模块。

[root@k8s-master1 RBAC]# kubectl  cp k8s-api-test.py py3:/
[root@k8s-master1 RBAC]# kubectl  exec -it py3 -- /bin/bash
root@py3:/# pip3 install kubernetes -i https://mirrors.aliyun.com/pypi/simple/

7.测试效果,可以访问到deploy资源,不能访问pod资源,测试无误。

8.外面创建一个deploy,进入容器再测试可以列出刚创建的deploy,测试无误。


9.增加查看pod权限,再次测试,可以查看到deploy、pod资源,测试无误。

k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权相关推荐

  1. 复习最基础的linux 之 创建用户及修改用户组

    把用户添加到root组中,用新建立的用户登陆,再切换回root   Linux管理用户命令参考:http://g.51cto.com/hk/42002   在linux字符界面下,用useradd命令 ...

  2. Windows 下的批处理脚本基础——网络相关命令(用户操作命令、用户组操作命令)

    自从优盘中毒,就开始发现学习批处理脚本的重要性.一起加油冲冲冲!!! 干正事!!! 目录 用户操作命令 查看用户帮助信息 查看用户详细帮助信息 查看用户详细信息 查看用户账户 删除用户 创建用户 用户 ...

  3. android删除微信授权管理员权限,微信小程序授权登录取消授权重新授权处理方法 附可用代码...

    [Asm] 纯文本查看 复制代码//index.js Page({ data: { userInfo: {}, hasUserInfo: false }, //事件处理函数 getinfo: func ...

  4. 小程序授权之支付宝(证书模式)

    最近有点忙,一直没有更新支付宝如何利用证书模式来进行授权的,今天正好有点时间,对支付宝证书模式授权做一下记录,前段时间,我在一篇博文中说明了支付宝普通公钥如何进行授权,在此,一些创建小程序,配置问题不 ...

  5. 10min快速了解k8s基础

    Kubernetes简介 Kubernetes(简称K8S,K和S之间有8个字母)是用于自动部署,扩展和管理容器化应用程序的开源系统.它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现.Kub ...

  6. Kebernetes 学习总结(9)认证-授权-RBAC

    一.概述 Kubernetes集群的所有操作基本上都是通过kube-apiserver这个组件进行的,它提供HTTP RESTful形式的API供集群内外客户端调用.这就引发了安全问题:假如别人知道你 ...

  7. 【云原生之k8s】k8s基础详解

    [云原生之k8s]k8s基础详解 前言 一.kubernetes介绍 (1)kubernetes简介 (2)应用部署方式的演变 二.kubernetes组件 (1)kubernetes架构 (2)ma ...

  8. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  9. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

最新文章

  1. 大新闻!HTC旗舰手机已原生支持BCH
  2. C# Socket Server 收不到数据
  3. hdu-5003 Osu!(水题)
  4. Java NIO使用及原理分析(二)
  5. 一行Python代码制作动态二维码
  6. 企业级 SpringCloud 教程 (七) 高可用的分布式配置中心(Spring Cloud Config)
  7. Golang笔记—文件操作
  8. git 忽略文件提交的几种姿势
  9. ECCV2020 点云处理——A Closer Look at Local Aggregation Operators in Point Cloud Analysis
  10. apple tv 开发_如何在新的Apple TV上重新排列,配置和删除应用程序和游戏
  11. 程序员网站运营手册1
  12. 张亚勤、刘慈欣、周鸿祎、王飞跃新书推荐,《崛起的超级智能:互联网大脑如何影响科技未来》...
  13. 量子计算机、奥数AI……这是2020计算机、数学的重大突破
  14. Java序列化三连问,是什么?为什么需要?如何实现?
  15. 企业服务总线架构介绍
  16. nodejs毕业设计源码大学生心理咨询微信小程序
  17. lamport面包店算法详细讲解及代码实现
  18. 【OpenCV入门到精通之五】视频固定位置叠加图片或者另一个视频
  19. 算法模型是什么意思,算法模型定义介绍
  20. 选择公理可能不成立,否则计算机可以生成真正的随机数

热门文章

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part6(Redis的应用场景、Redis是单线程的速度还快、Redis线程模型:Reactor模式、事件、发布订阅、管道)~整起
  2. android move事件,小程序Android版本touchmove 事件侦听
  3. 超神学院找回服务器,超神学院手游服务器维护,已经一上午了
  4. docker容器监控
  5. CH573 Ibeacon
  6. linux Table is marked as crashed and should be repaired
  7. 北师大计算机作业答案0651,湖南大学考研网信息:2017研究生考试复试分数线
  8. 【006】电脑关机恶搞游戏---goto语句的使用
  9. 微信功能,你知道多少
  10. 如何写好科研论文 撰写技巧(六)