一、kubernetes集群安全架构

用户使用kubectl、客户机或通过REST请求访问API。可以授权用户和Kubernetes服务帐户进行API访问。当一个请求到达API时,它会经历几个阶段,如下图所示:

1.访问K8S集群的资源需要过三关:认证、鉴权、准入控制;

2.普通用户若要安全访问集群API Server,往往需要证书、Token或者用户名+密码;

3.Pod访问,需要ServiceAccountK8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件。

  • 1. Authentication
  • 2. Authorization
  • 3. Admission Contro

二、认证

API Server处理请求的过程中,认证插件负责鉴定⽤户⾝份,授权插件⽤于操作权限许可鉴别,⽽准⼊控制则⽤于在资源对象的创建、删除、更新或连接(proxy)操作时实现更精细的许可检查。Kubernetes使⽤⾝份验证插件对API请求进⾏⾝份验证,⽀持的认证⽅式包括客户端证书、承载令牌(bearer tokens)、⾝份验证代理(authenticating proxy)或HTTP basic认证等。

下面我们基于客户端证书来做认证:

1.将apiserver的根证书(ca.pem,ca-key.pem,ca-config.json)放到同一个目录下执行以下脚本:

[root@master hejianlai]# cat rbac-user.sh
cat > hejianlai-csr.json <<EOF
{
"CN": "hejianlai",
"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 hejianlai-csr.json | cfssljson -bare hejianlai kubectl config set-cluster kubernetes \
--certificate-authority=ca.pem \
--embed-certs=true \
--server=https://172.31.182.140:6443 \ #Master ip
--kubeconfig=hejianlai-kubeconfig kubectl config set-credentials hejianlai \
--client-key=hejianlai-key.pem \
--client-certificate=hejianlai.pem \
--embed-certs=true \
--kubeconfig=hejianlai-kubeconfig kubectl config set-context default \
--cluster=kubernetes \
--user=hejianlai \
--kubeconfig=hejianlai-kubeconfig kubectl config use-context default --kubeconfig=hejianlai-kubeconfig

三、RBAC授权

官方地址:https://kubernetes.io/docs/reference/access-authn-authz/rbac/

RBAC是⼀种操作授权机制,⽤于界定“谁”(subject)能够或不能够“操作”(verb)哪个或哪类“对象”(object)。动作的发出者即“主体”,通常以“账号”为载体,它既可以是常规⽤户(User Account),也可以是服务账号(Service Account)。“操作”(verb)⽤于表明要执⾏的具体操作,包括创建、删除、修改和查看等,对应于kubectl来说,它通常由create、apply、delete、update、patch、edit和get等⼦命令来给出。⽽“客体”则是指操作施加于的⽬标实体,对Kubernetes API来说主要是指各类的资源对象以及⾮资源型URL。

Kubernetes 使用 API ​​服务器授权 API 请求。它根据所有策略评估所有请求属性来决定允许或拒绝请求。 一个API请求的所有部分必须被某些策略允许才能继续。这意味着默认情况下拒绝权限。

(尽管 Kubernetes 使用 API ​​服务器,但是依赖于特定种类对象的特定字段的访问控制和策略由准入控制器处理。)

配置多个授权模块时,将按顺序检查每个模块。 如果任何授权模块批准或拒绝请求,则立即返回该决定,并且不会与其他授权模块协商。 如果所有模块对请求没有意见,则拒绝该请求。一个拒绝响应返回 HTTP 状态代码 403 。

Kubernetes仅审查以下API请求属性:

  • user - 身份验证期间提供的user字符串。
  • group - 经过身份验证的用户所属的组名列表。
  • extra - 由身份验证层提供的任意字符串键到字符串值的映射。
  • API - 指示请求是否针对 API 资源。
  • Request path - 各种非资源端点的路径,如/api/healthz
  • API request verb - API 动词getlistcreateupdatepatchwatchproxyredirectdeletedeletecollection用于资源请求。要确定资源API端点的请求动词,请参阅确定请求动词
  • HTTP request verb - HTTP 动词getpostputdelete用于非资源请求。
  • Resource - 正在访问的资源的 ID 或名称(仅限资源请求) - 对于使用getupdatepatchdelete动词的资源请求,您必须提供资源名称。
  • Subresource - 正在访问的子资源(仅限资源请求)。
  • Namespace - 正在访问的对象的名称空间(仅适用于命名空间资源请求)。
  • API group - 正在访问的 API 组(仅限资源请求)。空字符串表示核心API组

1、创建role其权限只有简单的查看pod,我这里指定命名空间pci

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

2.创建rolebinding 绑定用户

[root@master rbac]# cat role-binding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: pci
subjects:
- kind: User
name: hejianlai # 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

三、准入控制

Kubernetes系统通过三个独⽴的组件间的相互协作来实现服务账户的⾃动化,三个组件具体为:Service Account准⼊控制器、令牌控制器(token controller)和Service Account账户控制器。Service Account控制器负责为名称空间管理相应的资源,并确保每个名称空间中都存在⼀个名为“default”的Service Account对象。

[root@master hejianlai]# cat sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader
namespace: pci --- kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: sa-read-pods
namespace: pci
subjects:
- kind: ServiceAccount
name: pod-reader
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

这时我们可以看见在pci这个命名中间下有一个默认的defaul和刚创建的pod-reader

这时我们验证下权限是否有效:

上图我们可以看到除了该命名空间下除了pod可以访问,其他的权限都是被拒绝的。

通过查看这个pod-reader生成的token我们就可以访问:

kubectl describe secret pod-reader -n pci

记住这个token要复制到记事本里取消自动换行!!!

然后我们用这个token去访问UI时也是只能看到pci这个命名中间下的。

kubernetes集群的认证、授权、准入控制的更多相关文章

  1. 033.Kubernetes集群安全-API Server认证及授权

    一 Kubernetes集群安全 1.1 安全机制 Kubernetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群 ...

  2. linux运维、架构之路-Kubernetes集群部署TLS双向认证

    一.kubernetes的认证授权       Kubernetes集群的所有操作基本上都是通过kube-apiserver这个组件进行的,它提供HTTP RESTful形式的API供集群内外客户端调 ...

  3. Kubernetes集群部署--kubernetes1.10.1

    参考博客:https://mritd.me/2018/04/19/set-up-kubernetes-1.10.1-cluster-by-hyperkube/ 一.环境 (1)系统环境 IP 操作系统 ...

  4. 在kubernetes 集群内访问k8s API服务

    所有的 kubernetes 集群中账户分为两类,Kubernetes 管理的 serviceaccount(服务账户) 和 useraccount(用户账户).基于角色的访问控制(“RBAC”)使用 ...

  5. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

  6. 在Openstack上创建并访问Kubernetes集群

    第一部分:创建集群 在Openstack部署Kubernetes集群运行Nginx容器的步骤,其中包括: 利用Murano部署Kubernetes集群 配置Openstack的安全性使Kubernet ...

  7. 二进制部署 Kubernetes 集群

    二进制部署 Kubernetes 集群   提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernet ...

  8. CentOS上手工部署kubernetes集群

    本文完全是根据二进制部署kubernets集群的所有步骤,同时开启了集群的TLS安全认证. 环境说明 在下面的步骤中,我们将在三台CentOS系统的物理机上部署具有三个节点的kubernetes1.7 ...

  9. K8S学习笔记之二进制的方式创建一个Kubernetes集群

    0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...

随机推荐

  1. git - 3.分支

    分支介绍 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线, 在Git里,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向mas ...

  2. Redis和Memcached的异同

    Memcached 可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS: 只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型. 无法进行持久化,数据不能备份,只能用于缓 ...

  3. OpenShift环境中手工模式添加etcd server

    模拟备份和恢复,在现有的集群环境,单master(etcd), infra和node上面添加另外一台机器作为etcd Server. 基于OpenShift 3.11版本,详情可以参考 https:/ ...

  4. vue前端项目中excel文件下载

    模仿 https://github.com/PanJiaChen/vue-element-admin/ 的下载 创建文件夹vendor 创建文件 Export2Excel.js 内容: /* esli ...

  5. [LeetCode] 303. Range Sum Query - Immutable 区域和检索 - 不可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  6. 自定义电脑IP地址

    一台电脑有了ip地址才能上网,ip就是电脑的标识,在互联网中就是其中的一份子. 默认情况下电脑会自动获取IP地址,当无法自动获取或与网络IP地址相冲突时,就要自行设置电脑静态IP地址. 如下图步骤:

  7. python jieba

    https://www.cnblogs.com/jiayongji/p/7119065.html 安装 pip install jieba 简单用法 结巴分词分为三种模式:精确模式(默认).全模式和搜 ...

  8. Hadoop+Hbase+Zookeeper分布式存储构建

    目录: 软件准备 Hadoop安装配置 zookeeper安装配置 Hbase安装配置 Hadoop+Hbase+zookeeper分布式存储构建 前言* Hadoop是Apache开源组织的一个分布 ...

  9. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  10. maven环境搭建教程

    1.下载和解压 访问   maven.apache.org   .点击download 下载对应系统的文件,window下载bin的zip文件. maven需要java1.7jdk支持,如果jdk没有 ...