当前位置: 首页 > news >正文

kubernetes(9)集群安全机制

概述

访问k8s集群时候,需要经过三个步骤完成具体操作

  1. 第一步:认证
  2. 第二步:鉴权(授权)
  3. 第三步:准入控制

进行访问的时候,这个过程都需要结果apiserver,apiserver做统一协调(如门卫)

  1. 访问过程中需要证书、token、或者用户名+密码
  2. 如果想要访问Pod,还需要serverAccount

在这里插入图片描述
图例说明:

  1. 传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443
  2. 认证:客户端身份认证常用方式如下:
    • https证书认证,基于ca证书
    • http token认证,通过token识别用户
    • http基本认证,用户名+密码认证(这种认证方式使用的比较少)
  3. 鉴权(授权)
    • 基于RBAC进行鉴权操作(基于角色访问控制)
  4. 准入控制:实际上就是一个准入控制器的一个列表,对发送到apiserver上的请求过滤,在列表中就通过,没有就不通过
    • 进行注入控制器的列表,如果列表中对应请求内容,便通过,没有便拒绝

RBAC

概述

RBAC(Role-Based Access Control,基于角色的访问控制)

相对于其他访问控制方式,新的 RBAC 具有如下优势

  1. 对集群中的资源和非资源权限均有完整的覆盖
  2. 整个 RBAC 完全由几个 API 对象完成,同其他 API 对象一样,可以用 kubectl 或 API进行操作
  3. 可以在运行时进行调整,无需重启 API Server要使用 RBAC 授权模式,需要在 API Server 的启动参数中加上--authorization-mode=RBAC

图例说明:有一个用户lucy,其拥有一个sale的角色,sale角色可以对资源进行create和get操作,那么lucy也可以对资源进行create和get操作
在这里插入图片描述

RBAC 的 API 资源对象说明

RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。

同其他 API 资源对象一样,用户可以使用 kubectl 或者 API 调用等方式操作这些资源对象

角色(Role)

role:特定命名空间访问权限
ClusterRole:对所有命名空间访问权限

一个角色就是一组权限的集合,这里的权限都是许可形式的,不存在拒绝的规则。

在一个命名空间中,可以用角色来定义一个角色,

如果是集群级别的,就需要使用 ClusterRole了。

角色只能对命名空间内的资源进行授权

查看和创建命名空间,操作如下:
在这里插入图片描述

集群角色(ClusterRole)

集群角色除了具有和角色一致的命名空间内资源的管理能力 ,因其集群级别的范围,还可以用于以下特殊元素的授权。

  • 集群范围的资源,例如 Node
  • 非资源型的路径,例如/healthz
  • 包含全部命名空间的资源,例如 pods

角色绑定(RoleBinding) 和 集群角色绑定(ClusterRoleBinding)

角色绑定或集群角色绑定用来把一个角色绑定到一个目标上,绑定目标可以是 User、Group 或者 Service Account。

  1. 使用 RoleBinding 为某个命名空间授权,
  2. ClusterRoleBinding 为集群范围内授权。

主体

有以下三种:

  1. user:用户
  2. group:用户组
  3. serviceAccount:服务账号

RBAC实现鉴权

第一步:创建命名空间

查看命名空间
在这里插入图片描述
创建新的命名空间:roledemo
在这里插入图片描述

第二步:在创建的命名空间下创建pod

创建
在这里插入图片描述
查看pod
在这里插入图片描述

第三步:创建角色

创建如下的yaml文件(rbac-role.yaml)

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: roledemo
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

创建并执行文件
在这里插入图片描述
查看指定名称空间角色
在这里插入图片描述

第四步:创建角色绑定

创建如下的yaml文件

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: roledemo
subjects:
- kind: User
  name: mary # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

创建并执行该yaml文件
在这里插入图片描述
查看
在这里插入图片描述

第五步:使用证书识别身份

创建如下的脚本文件sh

cat > mary-csr.json <<EOF
{
  "CN": "mary",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing"
    }
  ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes mary-csr.json | cfssljson -bare mary 

kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=https://192.168.44.147:6443 \
  --kubeconfig=mary-kubeconfig
  
kubectl config set-credentials mary \
  --client-key=mary-key.pem \
  --client-certificate=mary.pem \
  --embed-certs=true \
  --kubeconfig=mary-kubeconfig

kubectl config set-context default \
  --cluster=kubernetes \
  --user=mary \
  --kubeconfig=mary-kubeconfig

kubectl config use-context default --kubeconfig=mary-kubeconfig


创建mary目录,创建rbac-user.sh脚本
在这里插入图片描述
将证书文件进行复制
在这里插入图片描述

执行sh脚本
在这里插入图片描述
查看证书文件
在这里插入图片描述
在这里插入图片描述

第六步:测试

查看pod功能
在这里插入图片描述
查看svc,是没有权限的
在这里插入图片描述

相关文章:

  • Google Earth Engine (GEE) ——加载2015年乌干达MODIS的LST并绘制时序图
  • 【Linux初阶】Linux下用户的新建和删除 | 查看服务器用户数、在线数、当前用户
  • 2022华为杯研究生数学建模赛题思路分析
  • PTA 3+2 转段考试 数据库mysql(3篇)
  • 【C语言进阶】函数栈帧的创建和销毁(内功修炼)
  • 结构体数组与结构体指针
  • PTA 3+2 转段考试 数据库 mysql(3篇)
  • 技术创新助力港口自动化与智能化
  • 【Day22】力扣LeetCode算法刷题[811. 子域名访问计数]
  • LinkedList - 链表
  • 【MySQL从入门到精通】【高级篇】(二十四)EXPLAIN中select_type,partition,type,key,key_len字段的剖析
  • C | 函数指针数组妙用
  • springboot:生成excel并且通过邮件发送
  • 【自然语言处理】【文本生成】使用Transformers中的BART进行文本摘要
  • 【Vue】Vue中的计算属性computed
  • 【面试系列】之二:关于js原型
  • Cumulo 的 ClojureScript 模块已经成型
  • java8-模拟hadoop
  • js
  • Linux gpio口使用方法
  • python学习笔记-类对象的信息
  • rabbitmq延迟消息示例
  • React系列之 Redux 架构模式
  • Shadow DOM 内部构造及如何构建独立组件
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 力扣(LeetCode)965
  • 算法-插入排序
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 移动端高清、多屏适配方案
  • ​业务双活的数据切换思路设计(下)
  • (4)(4.6) Triducer
  • (4)STL算法之比较
  • (黑马C++)L06 重载与继承
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十) 初识 Docker file
  • (转)【Hibernate总结系列】使用举例
  • ***监测系统的构建(chkrootkit )
  • .htaccess 强制https 单独排除某个目录
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /dev/sda2 is mounted; will not make a filesystem here!
  • :“Failed to access IIS metabase”解决方法
  • @ComponentScan比较
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [\u4e00-\u9fa5] //匹配中文字符
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [C#] 如何调用Python脚本程序
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++进阶篇]STL中vector的使用
  • [CERC2017]Cumulative Code
  • [CSS] 点击事件触发的动画
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [IE技巧] 如何让IE 启动的时候不加载任何插件