一  了解认证机制

  

  1.1   API的服务器在接收来自客户端的请求的时候会对发起的用户进行几个步骤

    • 认证插件进行认证,确认发起的用户是外部用户,还是集群中的某个命名空间里面的pod
    • 确认用户属于哪个组,这个组被赋予对集群资源的哪些权限,是否有对这些资源的增删改查的权限
    • 最后才确认能否成功的对资源进行修改

  1.2  介绍serviceaccount

    serviceaccount属于一种集群资源,可以在命名空间里面创建,并且每个命名空间里面都有一个默认的accountservice,在命名空间创建pod的时候,会将这个serviceaccount里面的token,ca.cart以及namespace渲染到容器里面的挂载路径  /var/run/secrets/kubernetes.io/serviceaccount/

    并且可以自己自定义serviceaccount,定义serviceaccount里面挂载的secrets列表,在默认情况下,集群里面的pod可以挂载任意多的secrets卷,但是当将ServiceAccount里面包含这个注解的时候kubernets.io/enforce-moutable-secrets="true"的时候,pod只要挂载了这个SA那么就只能挂载这个SA下面定义的secrets

二  介绍RBAC授权插件

  2.1  RBAC这样的一个插件,授权在集群中的一个客户端是否允许在集群资源中执行的一系列动作

  2.2  RBAC的核心思想是将用户与一系列的角色相关联,这个用户可以是serviceaccount或者是其他用户将可以关联很多角色,每个角色同时有对集群内部的一些资源的增删改查的权限,用户可以关联多个角色,并享有所有相关联的权限,没有与用户关联的角色的权限,用户自然也没有相关的任何权限

  2.3 介绍RBAC资源

    RBAC授权规则是通过四种资源进行配置的,他们分为2个组

    • Role以及ClusterRole,他们决定了可以在资源上执行哪些动作
    • RoleBinding以及ClusterRoleBinding,它们将上述角色绑定到特定的用户,组或者ServiceAccount上面

  详细内容如图所示

    

    2.4  值得一提的是,角色,与角色绑定属于命名空间级别的资源,集群角色与集群角色绑定属于集群级别的资源,他们之间的关系除了一一对应之外,还有其他的关系

    • 可以看到在同一个命名空间里面可以有多个角色绑定,同样也可以有多个角色
    • 单个命名空间里面的角色只能绑定其命名空间里面的角色
    • 但是对于任意的命名空间的角色绑定是可以将集群的角色绑定到其命名空间的用户上面的,这点需要注意

    

三  练习RBAC资源如何限制集群中各个pod对集群资源的访问

  3.1  在集群中开启RBAC鉴权

k delete clusterrolebinding permissive-binding

  3.2 分别创建2个命名空间以及在2个命名空间里面创建pod

[root@node01 wxm]# k create ns wxm
namespace/wxm created [root@node01 wxm]# k run test --image=luksa/kubectl-proxy -n wxm
pod/test created [root@node01 wxm]# k create ns wdm
namespace/wdm created [root@node01 wxm]# k run test --image=luksa/kubectl-proxy -n wdm
pod/test created

  3.3 之后进入一个命名空间里面的pod里面执行查询资源的命名

/ # curl localhost:8001/api/v1/namespaces/wdm/services
{
"kind": "Status",
"apiVersion": "v1",
"metadata": { },
"status": "Failure",
"message": "services is forbidden: User \"system:serviceaccount:wxm:default\" cannot list resource \"services\" in API group \"\" in the namespace \"wdm\"",
"reason": "Forbidden",
"details": {
"kind": "services"
},
"code": 403
/ # curl localhost:8001/api/v1/namespaces/default/services
{
"kind": "Status",
"apiVersion": "v1",
"metadata": { },
"status": "Failure",
"message": "services is forbidden: User \"system:serviceaccount:wxm:default\" cannot list resource \"services\" in API group \"\" in the namespace \"default\"",
"reason": "Forbidden",
"details": {
"kind": "services"
},
"code": 403
  • 可以看到在开启了RBAC的时候,由于默认的pod挂载的是集群中的默认的SA,但是没有给它赋予任何权限
  • 所以无论访问API服务器的任何资源都会被拒绝

    

  3.4  在wxm这个命名空间创建一个角色,这个角色的作用是支持查询wxm这个命名空间的所有资源,有两种形式来创建资源

    3.4.1 yaml形式创建这个Role

[root@node01 Chapter12]# cat service-reader.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: wxm
name: wxm
rules:
- apiGroups: [""]
verbs: ["get", "list"]
resources: ["services"]
  • role这个资源它属于rbac.authorization.k8s.io/v1资源组
  • 它区别于其他资源没有spec选项(笔者在创建的时候没发现)
  • rules里面可以定义对哪些资源有着什么样子的操作权限以及资源属于什么API组的

    3.4.2 以命令行的形式创建role

k create role service-reader --verb=get --verb=list --resource=services -n wdm

  3.5  以命令行的形式创建角色绑定

k create rolebinding --name=test --role=service-reader --serviceaccount=wdm:default-n wdm

通过上面的命令将命名空间wdm的SA绑定了service-reader的role,至此我们就可以在wdm的pod里面去通过API服务器来访问wdm命名空间的services的清单了

[root@node01 Chapter12]# k exec -it test -n wdm sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # curl localhost:8001/api/v1/namespaces/wdm/services
{
"kind": "ServiceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/wdm/services",
"resourceVersion": "3474903"
},
"items": []

 

   3.6 还有一点,当我们想在wxm这个命名空间里面的pod去访问wdm的service或者其他列表的时候仅仅需要在rolebinding里面添加wxm这个命名空间的SA,操作如下

[root@node01 Chapter12]# k get rolebinding test -o yaml -n wdm
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
creationTimestamp: "2021-01-14T08:44:08Z"
name: test
namespace: wdm
resourceVersion: "3473068"
selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/wdm/rolebindings/test
uid: aa8972d6-5644-11eb-ae9a-5254002a5691
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: service-reader
subjects:
- kind: ServiceAccount
name: default
namespace: wdm
- kind: ServiceAccount
name: default
namespace: wxm
  • 红色字体为添加的部分

  3.7 我们再试试在wxm这个命名空间的pod能否去访问wdm这个命名空间的service资源

/ # curl localhost:8001/api/v1/namespaces/wdm/services
{
"kind": "ServiceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/wdm/services",
"resourceVersion": "3473158"
},
"items": [] / # curl localhost:8001/api/v1/namespaces/wxm/services
{
"kind": "Status",
"apiVersion": "v1",
"metadata": { },
"status": "Failure",
"message": "services is forbidden: User \"system:serviceaccount:wxm:default\" cannot list resource \"services\" in API group \"\" in the namespace \"wxm\"",
"reason": "Forbidden",
"details": {
"kind": "services"
},
"code": 403
/ # curl localhost:8001/api/v1/namespaces/wdm/services
{
"kind": "ServiceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/wdm/services",
"resourceVersion": "3475403"
},
"items": []
}/ #
  • 结果显而易见,wxm这个命名空间的pod无法访问自己的service
  • 但是wxm这个命名空间pod却能访问wdm这个命名空间的service
  • 这就是RBAC权限的神奇作用

3.8 下面来把演示的内容做成一幅图来更直观的看一下

kubernets集群的安全防护(上)的更多相关文章

  1. kubernets集群的安全防护(下)

    一   集群角色以及集群角色绑定 1.1  前面我们提到过角色以及角色绑定,那么现在为什么会出现集群级别的角色以及角色绑定,作用有如下所示 我们如果需要在所有的命名的空间创建某个角色或者角色绑定的时候 ...

  2. Redis源码阅读(五)集群-故障迁移(上)

    Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...

  3. zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。

    zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的.

  4. 搭建集群后再namenode上查看进程发现除了三个基本进程还可能有别的进程,例如本来在子节点出现的进程出现在了主节点上

    搭建集群后再namenode上查看进程发现除了三个基本进程还可能有别的进程,例如本来在子节点出现的进程出现在了主节点上,namenode按正常来说是有三个进程的:namenode,resourcema ...

  5. Window Server 2019 配置篇(3)- 建立hyper-v集群并在其上运行win10 pro虚拟机

    上次讲到我们的域里有了网关跟DHCP,这次我们要在域中建立hyper-v集群并在其上运行win10 pro虚拟机 那么什么是hyper-v集群呢? 就是两个及两个以上的运行hyper-v服务的服务器建 ...

  6. Ceph集群搭建及Kubernetes上实现动态存储(StorageClass)

    集群准备 ceph集群配置说明   节点名称 IP地址 配置 作用 ceph-moni-0 10.10.3.150 centos7.5 4C,16G,200Disk 管理节点,监视器 monitor ...

  7. 使用kubeadm创建kubernets集群

    参考:  http://docs.kubernetes.org.cn/459.html   https://blog.csdn.net/gui951753/article/details/833169 ...

  8. k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船

    非常非常抱歉,新年上班第一天, 在今天阿里云上气候突变情况下,由于我们开船技术差,在今天 10:15~12:00 左右的访问高峰,我们竟然把船给开翻了,造成近2个小时整个博客站点无法访问,由此给您带来 ...

  9. 手把手教你:将 ClickHouse 集群迁至云上

    前言 随着云上 ClickHouse 服务完善,越来越多的用户将自建 ClickHouse 服务迁移至云上.对于不同数据规模,我们选择不同的方案: 对于数据量比较小的表,通常小于10GB 情况下,可以 ...

随机推荐

  1. selenium 浏览器的操作

    一.浏览器的最大化 #coding=utf-8 from selneium import wbedriver driver = wbedriver.Firefox() #将webdriver 的Fir ...

  2. [日常摸鱼]poj1151Atlantis-扫描线

    题意:给一堆长宽平行于坐标轴的长方形求并的面积 我个沙茶快写了一晚上- 大概思想就是先根据$y$坐标排个序,把$y$坐标离散化一下,放到线段树里面维护,这里的写法是让线段树的节点储存这个点对应的整段线 ...

  3. mini-web框架-元类-总结(5.4.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 python中万物都是对象 使用python中自带的globals函数返回一个字典 通过这个可以调取当前py文件中的所有东西 当定义一个函数,类,全局 ...

  4. Nebula Graph 在微众银行数据治理业务的实践

    本文为微众银行大数据平台:周可在 nMeetup 深圳场的演讲这里文字稿,演讲视频参见:B站 自我介绍下,我是微众银行大数据平台的工程师:周可,今天给大家分享一下 Nebula Graph 在微众银行 ...

  5. MySQL如何计算统计redo log大小

      在MySQL中如何计算.统计重做日志(redo log)的生成情况呢? 例如10分钟内,生成了多少M的redo log呢?30分钟内又生成了多少M的redo log......MySQL没有像Or ...

  6. [leetcode]118,119PascalsTriangle,杨辉三角1,2

    杨辉三角1Given numRows, generate the first numRows of Pascal's triangle.For example, given numRows = 5,R ...

  7. 图解SparkStreaming与Kafka的整合,这些细节大家要注意!

    前言 老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望帮助更多自学的小伙伴.由于老刘是自学大数据开发,肯定会存在一些不足,还希望大家能够批评指正,让我们一起进步! ...

  8. MyArray框架搭建与实现

    #include<iostream> using namespace std; template<class T> class MyArray { public: //构造函数 ...

  9. 一行 CSS 代码的魅力

    之前在知乎看到一个很有意思的讨论 一行代码可以做什么? 那么,一行 CSS 代码又能不能搞点事情呢? CSS Battle 首先,这让我想到了,年初的时候沉迷的一个网站 CSS Battle .这个网 ...

  10. 如何在Elasticsearch中解析未分配的分片(unassigned shards)

    一.精确定位到有问题的shards 1.查看哪些分片未被分配 curl -XGET localhost:9200/_cat/shards?h=index,shard,prirep,state,unas ...