首页 > 其他分享 >3、k8s集群安全-授权

3、k8s集群安全-授权

时间:2024-05-10 10:37:15浏览次数:14  
标签:name -- 集群 user 授权 k8s 资源

3、k8s集群安全-授权

授权模式/机制/策略

通过API Server的启动参数 --authorization-mode 来设置。
可以指定多个授权模式 --authorization-mode=Node,RBCA,Webhook
多个模式按指定顺序对请求进行授权,每当一个模式拒绝请求时,请求会被转至下一个模式,直至用户授权完成,不再执行之后的授权模式

NODE授权:节点授权,用于kubelet向api server汇报节点状况使用 System Node组 只处理节点请求?

ABAC(Attribute-Based Access Control):基于属性的访问控制,将一个用户或一组用户与权限相关联,只要有新用户就要关联权限

RBAC(Role-Based Access Control):基于角色的访问控制,将角色与一组权限向关联,用户和角色相关联,即用户属于这个角色

Webhook,通过于第三方工具,将k8s的用户和权限的请求传给第三方工具,让其决定是否赋予权限。通过调用外部REST服务对用户进行授权

AlwaysDeny:拒绝所有请求,一般用于测试

AlwayAllow:允许所有请求,而不执行授权检查

RBAC资源对象说明

Role
* 一个角色就是一组权限的集合,这里的权限都是许可形式的,不存在拒绝的规则。
* 角色(Role)的授权范围是名称空间(namespace)。

ClusterRole
* 集群角色除了具有和角色一致的命名空间内资源的管理能力,因其集群级别的范围,还可以用于以下特殊元素的授权。
    * 集群范围的资源,例如Node。
    * 非资源型的路径,例如“/healthz”。
    * 包含全部命名空间的资源,例如pods(用于kubectl get pods --all-namespaces这样的操作授权)。
* 集群角色(ClusterRole)授权范围是整个kubernetes集群(即所有的名称空间)。

RoleBinding 和 ClusterRoleBinding
* 角色绑定(RoleBinding)或集群角色绑定(ClusterRoleBinding)用来把一个角色绑定到一个目标上,绑定目标可以是User(用户)、Group(组)或Service Account。
    * 使用RoleBinding为某个命名空间授权。
    * 使用ClusterRoleBinding为集群范围内授权。
    * User(用户)和Group(组)是对kubenetes使用者(即是对人的)进行授权,Service Account是对pod进行授权。

语法:
kubectl create rolebinding NAME --clusterrole=NAME|--role=NAME [--user=username] [--group=groupname] [--serviceaccount=namespace:serviceaccountname]
    #--group=证书签署请求中O的值
    #--user=证书签署请求中CN的值(如果多个user属于同一个group,绑定(rolebinding)group的时候,其组内的所有user都会被授权)

* RoleBinding可以引用Role,只对一个名称空间生效。
* RoleBinding也可以引用ClusterRole,对属于同一命名空间内ClusterRole定义的资源主体进行授权。一种常见的做法是集群管理员为集群范围预先定义好一组ClusterRole,然后在多个命名空间中重复使用这些ClusterRole。
* ClusterRoleBinding只能引用ClusterRole,用于进行集群级别或者对所有命名空间都生效的授权。

resource、role、rolebinding之间的关系

Image.png

kubectl get roles
kubectl get rolebingings

查看用户是否可以访问特定资源
kubectl auth can-i create deployments --as dev-user
kubectl auth can-i delete nodes --as dev-user
kubectl auth can-i delete pods --as dev-user --namespace test

kubectl create role developer --verb=list,create,delete --resource=pods

创建Role

developer-role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: developer    # 角色命名,为开发人员创建的角色
  namespace: default
rules:
- apiGroups: [""]       # 支持的API组列表,空白表示核心组
  resources: ["pods"]   # 支持的资源对象列表角色可以访问的资源是pod
  verbs: ["get", "watch", "list"]  # 对资源对象的操作方法列表,例如get、watch、list、delete、replace、patch等
  resourceNames: [ "blue","orange" ]   # 指定某个具体的资源名称
- apiGroups: [""]
  resources: ["ConfigMap"]
  verbs: ["create"]

创建ClusterRole

cluser和cluserrolebingding作用于集群资源
可以为命名空间资源创建cluster角色,用户可以访问所有命名空间中的这些资源

cluster-admin-role.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: cluser-administrator
rules:
- apiGroups: [""]    # 表示核心组
  resources: ["nodes"]
  verbs: ["get", "create", "list"]

RoleBinding引用Role进行授权

* 下面的例子中的RoleBinding将在default命名空间中把pods_role角色授予用户user_name,这一操作可以让user_name读取default命名空间中的Pod:

]# kubectl create rolebinding rolebinding-pods_role --role=pods_role --user=user_name -n default --dry-run=client -o yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: rolebinding-pods_role
  namespace: default
roleRef:
#"roleRef"指定与某Role或ClusterRole的绑定关系
  apiGroup: rbac.authorization.k8s.io
  kind: Role           #此字段必须是Role或ClusterRole
  name: pods_role      #此字段必须与你要绑定的Role或ClusterRole的名称匹配
subjects:
#你可以指定不止一个“subject(主体)”
#Subjects可以是user、group、service account
#user和group可以是数字、字符串、email,前缀为  system: 的是系统保留,创建时避免使用
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: user_name      #"user_name"是区分大小写的

RoleBinding引用ClusterRole进行授权

* 例如,在下面的例子中,虽然secrets_clusterrole是一个集群角色,但是因为使用了RoleBinding,所以user_name只能读取default命名空间中的secret:

]# kubectl create rolebinding rolebinding-secrets_clusterrole --clusterrole=secrets_clusterrole --user=user_name -n default --dry-run=client -o yaml

apiVersion: rbac.authorization.k8s.io/v1
#此角色绑定使得用户"user_name"能够读取"default"名字空间中的Secrets
kind: RoleBinding
metadata:
  name: rolebinding-secrets_clusterrole
  #RoleBinding的名称空间决定了访问权限的授予范围。
  #这里隐含授权仅在"default"名字空间内的访问权限。
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: secrets_clusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: user_name     #'user_name'是区分大小写的

ClusterRoleBinding引用ClusterRole进行授权

* 下面的例子允许用户user_name读取任意Namespace中的secret:

]# kubectl create clusterrolebinding clusterrolebinding-secrets_clusterrole --clusterrole=secrets_clusterrole --user=user_name -n default --dry-run=client -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: clusterrolebinding-secrets_clusterrole
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: secrets_clusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: user_name

命名空间资源&集群资源

命名空间资源
pods rs jobs deployments services secrets roles rolebingdings configmaps pvc

集群资源
nodes pv clusterroles clusterrolebindings certificatesigningrequests namespaces

查看某资源是否是命名空间资源
kubectl api-resources --namespaced=ture
kubectl api-resources --namespaced=false

对资源的引用方式

resources对一类资源进行授权
* 在Kubernetes API中,大多数资源都是使用对象名称的字符串表示来呈现与访问的,例如,对于Pod应使用"pods"。但有一些Kubernetes API涉及子资源(subresource),例如Pod的log,对Pod日志的请求url是GET /api/v1/namespaces/{namespace}/pods/{name}/log。

* 在RBAC角色表达资源时,使用对应API端点的URL中的名字来引用资源。
* 在RBAC角色表达子资源时,使用斜线(/)来分隔资源和子资源("资源/子资源")。

示例:
* pods对应名称空间的Pod资源,而log是pods的子资源。允许某主体能同时够读取Pod和Pod log。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]    #!
  verbs: ["get", "list"]

ResourceName对某个资源实例进行授权
* 资源还可以通过资源名字(ResourceName)进行引用。在指定ResourceName后,使用get、delete、update和patch动词的请求,就会被限制在这个资源实例范围内。

* 注意:
    * 不能使用资源名字(ResourceName)来限制create或者deletecollection请求。对于create请求而言,这是因为在鉴权时可能还不知道新对象的名字。
    * 如果使用资源名字(ResourceName)来限制list或者watch请求,客户端必须在它们的list或者watch请求里包含一个与指定的resourceName匹配的metadata.name字段选择器。例如,kubectl get configmaps --field-selector=metadata.name=my-configmap

示例:
* 某主体只能对一个ConFigmap进行get和update操作。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: configmap-updater
rules:
- apiGroups: [""]
  # 在HTT 层面,用来访问ConfigMap的资源的名称为"configmaps"
  resources: ["configmaps"]
  resourceNames: ["my-configmap"]    #!
  verbs: ["update", "get"]

查看集群角色(clusterrole)admin
* 包含所有的资源
kubectl get clusterrole admin -o yaml

标签:name,--,集群,user,授权,k8s,资源
From: https://www.cnblogs.com/lixunblogs/p/18167056

相关文章

  • 2、k8s集群安全-认证
    2、k8s集群安全-认证K8S的三种级别的客户端认证方式HTTPS证书认证基于CA根证书签名的客户端身份认证方式,最严格的认证方式HTTPToken认证通过一个token来识别合法用户,token是一个很长很复杂的字符串,每个token对应一个用户名存储在APIServer能访问的文件中。当客户端发起API......
  • 1-k8s集群安全-Role_RoleBinding
    1.k8s集群安全-RoleRoleBinding认证(Authentication)、鉴权(Authoriaztion)、准入控制(AdmissionContorl)三步来保障其安全Authentication(认证)1.由一到多个认证插件完成。收到请求后,APIServer依次调用为其配置的认证插件来认证客户端身份,直到其中的一个插件可以识别出请求者的身份......
  • docker安全_k8s安全
    docker安全&k8s安全同一个进程,在docker中的进程ID和主机的进程ID不同docker默认并不能运行主机中的所有命名docker中的root并不是主机中的rootdocker中关于安全规则的命令以主机指定用户运行容器dockerrun--user=1000centos添加/删除容器中的某功能并运行dockerrun......
  • 集群备份、升级、扩容
    集群备份、升级、扩容哪些内容需要备份1.集群中各种资源和应用程序,例如:podservicedeployment等等2.集群本身、集群内其他资源的信息如何备份1.如果是以声明式的方式创建资源,可以将其保存到代码库(如github)。如果是以命令式的方式创建的资源,使用下面的命令,将群集上创建的所......
  • apisix~helm方式的部署到k8s
    什么是apisixApacheAPISIX是一个高性能、轻量级的开源API网关,基于Nginx和OpenResty构建。APISIX提供了丰富的功能和灵活的配置,适用于构建现代的微服务架构和云原生应用。以下是ApacheAPISIX的一些主要特点和功能:动态路由:APISIX支持基于请求路径、方法、头部等条......
  • k8s-Pod的概念和存在的意义
    1.Pod的概念pod是k8s中部署的最小单元包含多个容器(也就是说pod是一组容器的集合)一个pod中容器共享网络命名空间pod是短暂的  2.Pod存在的意思2.1创建容器使用docker,一个docker对应是一个容器,一个容器有进程,一个容器运行一个应用程序2.2Pod是多进程设计,运动多个......
  • 20240509xxx集群xx节点PLEG超时问题
    20240509xxx集群xx节点PLEG超时问题//20240509写在前面xxx集群xx节点又又又又又卡住了,经过一系列排查,终于解决了问题,由于这次找到了通用解法,所以在此记录下ps:国内的搜索引擎是真的shi。。搜出来的帖子都是抄来抄去的,还不解决问题,还得是google/大拇指问题起因:偷得浮生半日......
  • k8s资源编排-yml介绍
    yaml文件:叫做“资源清单文件”,通过kubecl命令直接使用yaml文件就可以实现对大量的资源对象进行编排部署了。    2.Yaml的组成部分yaml由2个部分组成:2.1控制器定义2.2被控制对象 yaml文件自己写比较繁琐,还好有自动生成yml格式文件的方式:1.使用kubectlcreate......
  • redis三主三从集群快速搭建
    redis集群快速搭建 1本文以redis6.2.6版本为例,快速搭建一套三主三从的redis集群,已经提前将脚本写好,只需要在节点上面进行执行即可安装#!/bin/bashinstall_redis(){#解压Redis源码包tar-zxvfredis-6.2.6.tar.gz......
  • mysql8.0数据库添加用户和授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户createuser'username'@'host'identifiedby'password';其中username为自定义的用户名;host为登录域名,host为'%'时表示为任意IP,为localhost时表示本机,或者填写指......