kubernetes集群的认证、授权、准入控制

一、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)放到同一个目录下执行以下脚本:

[[email protected] 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

[[email protected] 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 绑定用户

[[email protected] 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对象。

[[email protected] 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这个命名中间下的。

原文地址:https://www.cnblogs.com/Dev0ps/p/10852445.html

时间: 2024-07-28 23:02:23

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

kubernetes集群 CA认证

一.设备kube-apiserver的CA正式相关的文件和启动参数 openssl genrsa -out ca.key 2048 openssl req x509 -new nodes -key ca.key -subj "/CN=yourcompany.com" -days 5000 -out ca.crt opensll genrsa -out server.key 2048 二.准备master_ssl.conf文件 该文件用于x509 v3版本的证书 [req] req_ex

在kubernetes 集群内访问k8s API服务

所有的 kubernetes 集群中账户分为两类,Kubernetes 管理的 serviceaccount(服务账户) 和 useraccount(用户账户).基于角色的访问控制(“RBAC”)使用“rbac.authorization.k8s.io”API 组来实现授权控制,允许管理员通过Kubernetes API动态配置策略. API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节.在 kubernetes 集群中

《二》Kubernetes集群部署(master)-搭建单集群v1.0

搭建单集群平台的环境规划 多master环境规划 官方提供的三种部署方式 minikubeMinikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用.部署地址:https://kubernetes.io/docs/setup/minikube/ kubeadmKubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群.部署地址:https://kubernetes.

二进制部署 Kubernetes 集群

二进制部署 Kubernetes 集群 提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. kubeadm Kubeadm也是一个工具,提供kubeadm init和kubeadm join指令,用于快速部署Kubernetes集群. 二进制包 从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群. 小结:生产环境中部署Kub

CentOS7部署Kubernetes集群

CentOS7部署Kubernetes集群 简介 Kubernetes是什么? Kubernetes一个用于容器集群的自动化部署.扩容以及运维的开源平台. 通过Kubernetes,你可以快速有效地响应用户需求: a.快速而有预期地部署你的应用 b.极速地扩展你的应用 c.无缝对接新的应用功能 d.节省资源,优化硬件资源的使用 我们希望培育出一个组件及工具的生态,帮助大家减轻在公有云及私有云上运行应用的负担. Kubernetes特点: a.可移植: 支持公有云,私有云,混合云,多重云(mult

在Kubernetes集群上部署和管理JFrog Artifactory

JFrog Artifactory是一个artifacts仓库管理平台,它支持所有的主流打包格式.构建工具和持续集成(CI)服务器.它将所有二进制内容保存在一个单一位置并提供一个接口,这使得用户在整个应用程序开发和交付过程中,能更易于上传.查找和使用二进制文件. 在本文中我们将介绍如何使用Rancher在Kubernetes集群上部署和管理JFrog Artifactory.在看完本文后,你将会系统地了解JFrog Artifactory OSS的安装设置,并且能够按照同样的步骤在任何Kuber

Kubernetes集群

Kubernetes已经成为当下最火热的一门技术,未来一定也会有更好的发展,围绕着云原生的周边产物也越来越多,使得上云更加便利更加有意义,本文主要讲解一些蔚来汽车从传统应用落地到Kubernetes集群的一些实践经验,提供给大家在落地之前的一些思考和注意点,并且让大家在实施的时候能够有一些借鉴,提供一些使用过程中的注意事项.项目背景 Docker诞生于2013年初,随着时间的推移Docker项目也逐渐火热起来,也形成了自己的生态,为了能够灵活调度容器,编排技术也变得非常重要,Swarm,Meso

安装部署Kubernetes集群实战

kubernetes概述: Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制.Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本. 通过kubernetes可以实现的功能: 快速部署应用 快速扩展应用 无缝对接新的应用功能 节省资源,优化硬件资源的使用 我们的目

Shell脚本快速部署Kubernetes集群系统

本文紧跟上节所讲的手动部署Kubernetes管理Docker篇所写,本篇主要内容利用Shell脚本完成快速部署Kubernetes集群.上节博文看过的朋友也能感觉到部署过程相对比较简单,那么,出于简化工作流程,推进运维自动化角度来说,于是花了2/3天时间写这个部署Kubernetes脚本. 运维工作中,常常会遇到部署各种各样的服务,建议:常规部署都应该尽量使用脚本完成,一方面提高自身脚本编写能力,另一方面推进运维自动化. 详细部署说明文档:http://lizhenliang.blog.51c