首页 > 其他分享 >七、Kubernetes安全性

七、Kubernetes安全性

时间:2023-04-30 22:33:09浏览次数:40  
标签:Kubernetes get watch list rbac v1 k8s 安全性

官方指导文档 303.png

NFS的动态供应; Pod;pvc---自动创建pv

k8s会认为每个Pod也可以是操作集群的一个用户。给这个用户会给一个ServiceAccount(服务账号)

权限控制流程:

  • 用户携带令牌或者证书给k8s的api-server发送请求要求修改集群资源
  • k8s开始认证。认证通过
  • k8s查询用户的授权(有哪些权限)
  • 用户执行操作。过程中的一些操作(cpu、内存、硬盘、网络等....),利用准入控制来判断是否可以允许这样操作

一、RBAC

什么是RBAC?(基于角色的访问控制) RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding

  • Role:基于名称空间的角色。可以操作名称空间下的资源
  • RoleBinding: 把一个Role。绑定给一个用户
  • ClusterRole:基于集群的角色。可以操作集群资源
  • ClusterRoleBinding: 把一个ClusterRole,绑定给一个用户

api-server是默认安装rbac的

[root@k8s-01 rbac]# cd /etc/kubernetes/manifests/
[root@k8s-01 manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
[root@k8s-01 manifests]# cat kube-apiserver.yaml 

304.png 如果需要手动添加,需要使用以下命令添加: 要启用 RBAC,在启动 API 服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC。

kube-apiserver --authorization-mode=Example,RBAC --<其他选项> --<其他选项>

查询某种资源有什么操作权限

[root@k8s-01 manifests]# kubectl api-resources -owide
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND                             VERBS
bindings                                       v1                                     true         Binding                          [create]
componentstatuses                 cs           v1                                     false        ComponentStatus                  [get list]
configmaps                        cm           v1                                     true         ConfigMap                        [create delete deletecollection get list patch update watch]
endpoints                         ep           v1                                     true         Endpoints                        [create delete deletecollection get list patch update watch]
events                            ev           v1                                     true         Event                            [create delete deletecollection get list patch update watch]
limitranges                       limits       v1                                     true         LimitRange                       [create delete deletecollection get list patch update watch]
namespaces                        ns           v1                                     false        Namespace                        [create delete get list patch update watch]
nodes                             no           v1                                     false        Node                             [create delete deletecollection get list patch update watch]
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim            [create delete deletecollection get list patch update watch]
persistentvolumes                 pv           v1                                     false        PersistentVolume                 [create delete deletecollection get list patch update watch]
pods                              po           v1                                     true         Pod                              [create delete deletecollection get list patch update watch]
podtemplates                                   v1                                     true         PodTemplate                      [create delete deletecollection get list patch update watch]
replicationcontrollers            rc           v1                                     true         ReplicationController            [create delete deletecollection get list patch update watch]

1、Role

定义一个名称空间的角色权限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" 标明 core API 组
  resources: ["pods"]  #能操作所有pod资源
  #resourceNames:指定能操作某个名字的资源
  verbs: ["get", "watch", "list"] #get:能获取资源,list:能拿到资源列表,watch:能监控资源

2、ClusterRole

ClusterRole 同样可以用于授予 Role 能够授予的权限。 因为 ClusterRole 属于集群范围,所以它也可以为以下资源授予访问权限:

  • 集群范围资源(比如节点(Node))
  • 非资源端点(比如 /healthz)
  • 跨名字空间访问的名字空间作用域的资源(如 Pod) 比如,你可以使用 ClusterRole 来允许某特定用户执行 kubectl get pods --all-namespaces 下面是一个 ClusterRole 的示例,可用来为任一特定名字空间中的 Secret 授予读访问权限, 或者跨名字空间的访问权限(取决于该角色是如何绑定的):
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: secret-reader
rules:
- apiGroups: [""]
  # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

DashBoard为什么能操作整个集群 305.png

  • 1、创建一个serviceaccount
kubectl create serviceaccount lori -n default --dry-run=client -oyaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: lori
  namespace: default
[root@k8s-01 rbac]# vim test2.yaml
[root@k8s-01 rbac]# kubectl apply -f test2.yaml 
serviceaccount/lori created
[root@k8s-01 rbac]# kubectl get serviceaccounts 
NAME                     SECRETS   AGE
default                  1         15d
lori                     1         17s
nfs-client-provisioner   1         27h
[root@k8s-01 rbac]# kubectl describe serviceaccounts lori
Name:                lori
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   lori-token-6pjfx
Tokens:              lori-token-6pjfx
Events:              <none>
[root@k8s-01 rbac]# kubectl get secrets 
NAME                                 TYPE                                  DATA   AGE
default-token-r8plt                  kubernetes.io/service-account-token   3      15d
dev-db-secret                        Opaque                                2      2d4h
it666-tls                            kubernetes.io/tls                     2      2d23h
lori-token-6pjfx                     kubernetes.io/service-account-token   3      2m11s
nfs-client-provisioner-token-7vrrj   kubernetes.io/service-account-token   3      27h
[root@k8s-01 rbac]# kubectl describe secrets lori-token-6pjfx 
Name:         lori-token-6pjfx
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: lori
              kubernetes.io/service-account.uid: f4f35db8-02d4-4d24-8524-0605ef2b9cb6

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Il9WTW9ydDRGbnRXRU5HVlozc1FCQzU5eDhkRnowYWkybkp0MlhIVkdySW8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImxvcmktdG9rZW4tNnBqZngiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibG9yaSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY0ZjM1ZGI4LTAyZDQtNGQyNC04NTI0LTA2MDVlZjJiOWNiNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmxvcmkifQ.wDEVQi5oQWcXDq08M7sDNIbbebMVwozgstA7tOWkeIZ6QLo6SEU9cw2COjZuKFfaP-D4Gftz6yd6ml8xzglvByNsfgGLH_NHNItfhYGvF_CQijN8QFwI3ygLobXogCmWFLGY5jjFiJ1TytnpJ-2TnrWACLTMhnEWY0QneLXvoApFW3jd15uQ2LQACKR1JXer3-GKqzw1RQ0SCgbX8NEH0MwJ_q2FGjQusBHEvoEDZKQhbLnVnWsXZttyTbm6E1fcRUE9cvCl7vzqYjeXDmV-OU7YvGvTjO866Og1dGjCJCPDQ_3_U1jpikZZTMjTcmZ48U2nNIhr7224W5G0iJ0C9w
[root@k8s-01 rbac]# 

可以用token登录k8s的ui界面

  • 创建一个角色,赋予权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ns-read
rules:
- apiGroups: [""] # "" 标明 core API 组
  resources: ["namespaces"]  #能操作所有pod资源
  #resourceNames:指定能操作某个名字的资源
  verbs: ["get", "watch", "list"] #get:能获取资源,list:能拿到资源列表,watch:能监控资源

3、ClusterRoleBinding

  • 角色和账号绑定
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 Secret 资源
kind: ClusterRoleBinding
metadata:
  name: read-ns-global
subjects:
- kind: ServiceAccount
  name: lori      # 'name' 是区分大小写的
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: ns-read
  apiGroup: rbac.authorization.k8s.io

4、ServiceAccount

1、创建ServiceAccount

  • 每个名称空间都会有自己默认的服务账号
    • 空的服务账号。
    • 每个Pod都会挂载这个默认服务账号。
    • 每个Pod可以自己声明 serviceAccountName: lori
    • 特殊Pod(比如动态供应等)需要自己创建SA,并绑定相关的集群Role。给Pod挂载。才能操作

集群几个可用的角色

cluster-admin:  整个集群全部全部权限  *.* ** *
admin: 很多资源的crud,不包括 直接给api-server发送http请求。/api
edit: 所有资源的编辑修改创建等权限
view: 集群的查看权限

2、测试基于ServiceAccount的rbac

apiVersion: v1
kind: ServiceAccount
metadata:
  name: lfy
  namespace: default
# ---
# ## 写Role
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # namespace: default  ## 所属的名称空间
  name: ns-reader 
rules: ## 当前角色的规则
- apiGroups: [""] # "" 标明 core API 组
  resources: ["namespaces"] ## 获取集群的所有名称空间
  verbs: ["get", "watch", "list"] # 动词。
---
## 编写角色和账号的绑定关系
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-ns-global
subjects:  ## 主体
- kind: ServiceAccount
  name: lfy # 'name' 是不区分大小写的
  namespace: default
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: ns-reader 
  apiGroup: rbac.authorization.k8s.io

标签:Kubernetes,get,watch,list,rbac,v1,k8s,安全性
From: https://blog.51cto.com/u_15410237/6238333

相关文章

  • Kubernetes从入门到精通 集群安装
    kubernetes集群安装一准备集群镜像从阿里云镜像仓库拉镜像标签改名#在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看[root@master~]#kubeadmconfigimageslist#下载镜像#此镜像kubernetes的仓库中,由于网络......
  • Kubernetes(K8S) kubesphere 介绍
    使用Kubeadm部署Kubernetes(K8S)安装--附K8S架构图Kubernetes(K8S)kubesphere安装官网地址:https://kubesphere.com.cn/KubeSphere是个全栈的Kubernetes容器云PaaS解决方案KubeSphere是在目前主流容器调度平台Kubernetes之上构建的企业级分布式多租户容器平台,提供简单易......
  • Kubernetes从入门到精通 集群安装准备工作
    一、准备环境 master01192.168.117.100docker,kubectl,kubeadm,kubeletnode01192.168.117.101docker,kubectl,kubeadm,kubeletnode02192.168.117.102docker,kubectl,kubeadm,kubelet二、环境初始化1检查操作系统的版本#此方式下安装kuber......
  • Kubernetes从入门到精通 Kubernetes从介绍
    1第一章kubernetes介绍1.1应用部署方式演变在部署应用程序的方式上,主要经历了三个时代:传统部署:互联网早期,会直接将应用程序部署在物理机上优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响虚拟化部......
  • kubernetes api访问权限控制体验之一
    1.简介目前想实现通过python脚本,实时获取k8s的service信息,然后写成nginx.conf脚本,并且也让chatgpt写了代码。运行的时候提示401权限不够:root@gateway-7576bf68bb-cf55t:/usr/local/openresty#python3gen_nginx_conf.pyTraceback(mostrecentcalllast):File"g......
  • Kubernetes——浅聊 Affinity,就这么点东西
    浅聊Affinity,就这么点东西在Kubernetes中,Affinity是指用于控制Pod调度的策略,包括亲和性(Affinity)和反亲和性(Anti-Affinity)2种。亲和性(Affinity)包括NodeAffinity和PodAffinity2种。 一、亲和性(Affinity)表示Pod需要部署在哪些节点上。比如需要部署在某些特定的节点......
  • Kubernetes 之 Prometheus 监控 blackbox_exporter
      下载地址:https://prometheus.io/download/#blackbox_exporter#blackbox_exporter是Prometheus官方提供的一个exporter,可以监控HTTP、HTTPS,、DNS、TCP、ICMP等目标实例,#从而实现对被监控节点进行监控和数据采集。#HTTP/HTPPS:URL/API可用性检测#TCP:端口监......
  • Kubernetes 设置命令行的命名空间
    在较新版本的Kubernetes中,kubectl的默认命名空间已经不再是default,而是用户的当前命名空间。这是因为Kubernetes强烈建议您在不同的命名空间中隔离应用程序和资源,因此kubectl默认使用用户当前的命名空间来提高生产力。您可以使用以下命令来查看当前所在的命名空间:arduin......
  • Kubernetes 1.3 从入门到进阶 安装篇:minikube
    Kubernetes单机运行环境一直是一个没有得到重视的问题。现在我们有了minikube,一个用go语言开发的可以在本地运行kubernetes的利器,不过目前应该只是支持kubernetes1.3。如果你只有一台机器或者虚拟机又想试验一下Kubernetes的新的功能,或者作kubernetes上开发的本地环境,minikube可能......
  • start minikube with Kubernetes 1.26
    适合于--kubernetes-version=v1.23.3之后的版本,可以使用docker驱动运行minikubestart--driver=docker--image-mirror-country='cn'--force--kubernetes-version=1.26.0--extra-config=apiserver.runtime-config=admissionregistration.k8s.io/v1alpha1--feature-gates=......