kubernetes-12 访问控制ServiceAccount、UserAccount、RBAC和服务账户的自动化_kubernetes查看有多少用户-程序员宅基地

1 .kubernetes API 访问控制

访问控制流程如下: 认证、授权和准入控制。

在这里插入图片描述

在这里插入图片描述

具体流程如下:

Authentication(认证)
认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。
通常启用X509 Client Certs和Service Accout Tokens两种认证方式。

Kubernetes集群有两类用户:由Kubernetes管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。
k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。

Authorization(授权)
必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。
授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC。

Admission Control(准入控制)
用于拦截请求的一种方式,运行在认证、授权之后,是权限认证链上的最后一环,对请求API资源对象进行修改和校验。

访问k8s的API Server的客户端主要分为两类:
kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。
pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。

2、ServiceAccount

如果将一个镜像放入私有仓库内,那么拉取镜像就会失败,为了解决这个问题可以用命令创建一个secret,其中指定了仓库的名字和账号密码,然后我们编写yaml文件,在其中写入secret,包括了仓库的名字和账号密码,这样就可以拉取镜像。但是我们将账号密码写入yaml文件中就会有安全风险,该如何解决这个问题?

创建一个服务账户ServiceAccount,它会用户自动生成认证信息,但是没有进行授权
在这里插入图片描述在这里插入图片描述

使用此命令将secrets添加到admin服务账户内

kubectl patch serviceaccount admin -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

可以看到myregistrykey已经和admin绑定成功,如果现在有pod使用admin服务账户就可以调用myregistrykey,但无法破解其真实密码。
在这里插入图片描述
编辑文件

[root@server2 configmap]# cat registry.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: game2048
    image: reg.westos.org/westos/game2048:latest        拉取镜像
  serviceAccountName: admin                           使用admin这个sa

在这里插入图片描述
应用文件创建pod成功
应该要注意的是,在yaml文件里使用sa添加认证信息,要比在yaml文件里让pod直接指定imagePullSecrets安全的多。

在这里插入图片描述

kubectl get pod mypod -o yaml 查看mypod这个pod的yaml信息

可以看到,mypod在创建时调用了admin的sa
在这里插入图片描述

3、UserAccount

创建test用户,进入/etc/kubernetes/pki/目录

  openssl genrsa -out test.key 2048 创建认证密钥
  openssl req -new -key test.key -out test.csr -subj "/CN=test"  提交证书申请请求
  openssl  x509 -req -in test.csr -CA ca.crt -CAkey ca.key  -CAcreateserial -out test.crt -days 365 生成x509证书
  openssl x509 -in test.crt -text -noout 查看证书

test.key:认证密钥
test.csr:证书申请请求
test.vrt:证书
在这里插入图片描述

kubectl config set-credentials test --client-certificate=/etc/kubernetes/pki/test.crt --client-key=/etc/kubernetes/pki/test.key --embed-certs=true 为test用户添加认证

在这里插入图片描述

kubectl  config view 查看配置

当前使用的是admin账户,需要切换
在这里插入图片描述

 kubectl config set-context test@kubernetes --cluster=kubernetes --user=test 创建test UserAccount

在这里插入图片描述

kubectl config use-context test@kubernetes	切换到test用户

切换成功,但是因为test是普通用户并且没有设置任何权限,所以无法查看pod
在这里插入图片描述
在这里插入图片描述切换回admin超户,进行授权
在这里插入图片描述

4、RBAC基于角色访问控制授权

RBAC(Role Based Access Control):基于角色访问控制授权。
允许管理员通过Kubernetes API动态配置授权策略。RBAC就是用户通过角色与权限进行关联。
RBAC只有授权,没有拒绝授权,所以只需要定义允许该用户做什么即可。
RBAC包括四种类型:Role、ClusterRole、RoleBinding、ClusterRoleBinding。

在这里插入图片描述

RBAC的三个基本概念:

(1)Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
(2)Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
(3)RoleBinding:定义了“被作用者”和“角色”的绑定关系。

Role 和 ClusterRole

Role是一系列的权限的集合,Role只能授予单个namespace 中资源的访问权限。
ClusterRole 跟 Role 类似,但是可以在集群中全局使用。

RoleBinding和ClusterRoleBinding

RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role。
RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

创建一个目录,编辑文件

[root@server2 ~]# mkdir roles
[root@server2 ~]# cd roles/
[root@server2 roles]# vim role.yaml
[root@server2 roles]# cat role.yaml 
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: myrole
rules:
- apiGroups: [""] 
  resources: ["pods"]    可以对pod进行操作
  verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]     可以执行的操作种类
[root@server2 roles]# 

创建该角色,发现我们允许执行的操作种类已经写入
在这里插入图片描述
编写另一个文件

[root@server2 roles]# vim rolebinding.yaml
[root@server2 roles]# cat rolebinding.yaml 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-read-pods
  namespace: default     授权作用与default这个命名空间内
subjects:                              
- kind: User
  name: test            授权对象是test用户
  apiGroup: rbac.authorization.k8s.io
roleRef:                             
  kind: Role                        授权角色是myrole 其中myrole已经列出了可以执行的操作
  name: myrole
  apiGroup: rbac.authorization.k8s.io
[root@server2 roles]# 

应用rolebinding.yaml文件发现用户test已经和角色myrole绑定,subjects是被作用者,而Role则是作用者

在这里插入图片描述
切换回test用户,可以执行pod命令,但是查看其他ns的pod被拒绝,这是因为默认查看pod属于ns中的default,查看别的ns则还需要集群角色授权。查看default中的控制器也被拒绝了,这是因为只授权了pod,没有授权deployment
在这里插入图片描述所有ns
在这里插入图片描述
创建集群角色ClusterRole
编辑文件

[root@server2 roles]# vim clusterrole.yaml
[root@server2 roles]# cat clusterrole.yaml 
kind: ClusterRole               集群角色
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myclusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]                     对pod可以操作      
  verbs: ["get", "watch", "list", "delete", "create", "update"]   可以操作的种类                      
- apiGroups: ["extensions", "apps"]
  resources: ["deployments"]             对deployments控制器可以操作
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 可以操作的种类      

切换回超级用户,查看clusterrole,我们的集群角色myclusterrole已经添加成功
在这里插入图片描述编辑文件

[root@server2 roles]# vim rolebinding.yaml 
[root@server2 roles]# cat rolebinding.yaml 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-read-pods
  namespace: default    
subjects:                              
- kind: User
  name: test
  apiGroup: rbac.authorization.k8s.io
roleRef:                             
  kind: Role
  name: myrole
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rolebind-myclusterrole
  namespace:  default
roleRef:                      
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole        角色来源为Clusterrole
  name: myclusterrole
subjects:                      
- apiGroup: rbac.authorization.k8s.io
  kind: User             作用对象是test
  name: test

切换到test用户,可以对pod和deployments控制器进行操作

在这里插入图片描述
集群角色也有集群绑定方法,可以作用所有ns

编辑文件

[root@server2 roles]# cat clusterbinding.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding       集群绑定
metadata:
  name: clusterrolebinding-myclusterrole
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: test

在超级用户下应用该文件,可以看到clusterbinding集群绑定成功
在这里插入图片描述应用后切换到test用户,可以作用其他ns

在这里插入图片描述

5 .服务账户的自动化

服务账户准入控制器(Service account admission controller)

如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为 default。
保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的 ImagePullSecrets 信息添加到 pod 中。
将一个包含用于 API 访问的 token 的 volume 添加到 pod 中。
将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到 pod 下的每个容器中。

Token 控制器(Token controller)

检测服务账户的创建,并且创建相应的 Secret 以支持 API 访问。
检测服务账户的删除,并且删除所有相应的服务账户 Token Secret。
检测 Secret 的增加,保证相应的服务账户存在,如有需要,为 Secret 增加 token。
检测 Secret 的删除,如有需要,从相应的服务账户中移除引用。

服务账户控制器(Service account controller)

服务账户管理器管理各命名空间下的服务账户,并且保证每个活跃的命名空间下存在一个名为 “default” 的服务账户
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ma_JunSSR/article/details/119492656

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签