k8s--Kubernetes存储--kubernetes访问控制
创始人
2025-05-28 02:10:11
0

文章目录

  • 一、k8s访问控制介绍
  • 二、UserAccount与serviceaccount(sa)
    • 1.serviceaccount:pod绑定sa
    • 2.UserAccount
      • (1)认证
      • (2)授权
      • (3)补充


一、k8s访问控制介绍

在这里插入图片描述在这里插入图片描述

  • 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的客户端主要分为两类:
    1.kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。
    2.pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。
  • kubectl向apiserver发起的命令,采用的是http方式,其实就是对URL发起增删改查的操作。
    $ kubectl proxy --port=8888 & ##开一个代理端口
    $ curl http://localhost:8888/api/v1/namespaces/default
    $ curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments
  • 以上两种api的区别是:
    api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
    apis 它是一般API访问的入口固定格式名。

二、UserAccount与serviceaccount(sa)

  • UserAccount与serviceaccount:
    用户账户是针对人而言的。 服务账户是针对运行在 pod 中的进程而言的。
    用户账户是全局性的。 其名称在集群各 namespace 中都是全局唯一的,未来的用户资源不会做 namespace 隔离, 服务账户是 namespace 隔离的。
    通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。 服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 ( 即权限最小化原则 )。

1.serviceaccount:pod绑定sa

将认证信息添加到serviceAccount中,要比直接在Pod指定imagePullSecrets要安全很多。

[root@k8s2 ~]# kubectl create sa admin    ##创建sa[root@k8s2 secret]# vim pod3.yaml         ##把serviceaccount和pod绑定起来:
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:serviceAccountName: admin               ##指定sa,没有指定会拉取不到containers:- name: nginximage: nginx
[root@server2 secret]# kubectl apply -f pod3.yaml     ##
[root@server2 secret]# kubectl get pod 
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          12s
[root@server2 secret]# kubectl describe pod mypod
Volumes:admin-token-md4rv:                                   ##所要的sa认证信息Type:        Secret (a volume populated by a Secret)SecretName:  admin-token-md4rv

2.UserAccount

(1)认证

[root@k8s2 secret]# cd /etc/kubernetes/pki/
[root@k8s2 pki]# openssl genrsa -out test.key 2048                  ##生成指定key
[root@k8s2 pki]# openssl req -new -key test.key -out test.csr -subj "/CN=test"     ##生成证书请求
[root@k8s2 pki]# openssl  x509 -req -in test.csr -CA ca.crt -CAkey ca.key  -CAcreateserial -out test.crt -days 365     ##生成证书
[root@k8s2 pki]#  kubectl config set-credentials test --client-certificate=/etc/kubernetes/pki/test.crt --client-key=/etc/kubernetes/pki/test.key --embed-certs=true     ##生成用户并设置认证
[root@k8s2 pki]# kubectl config set-context test@kubernetes --cluster=kubernetes --user=test     ##设置账户
[root@k8s2 pki]# kubectl config view       ##查看配置内容
apiVersion: v1
clusters:
- cluster:certificate-authority-data: DATA+OMITTEDserver: https://192.168.56.172:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
- context:cluster: kubernetesuser: testname: test@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: REDACTEDclient-key-data: REDACTED
- name: testuser:client-certificate-data: REDACTEDclient-key-data: REDACTED

切换用户test
[root@k8s2 pki]# kubectl config use-context test@kubernetes

[root@server2 pki]# kubectl get pod ##默认用户没有任何权限,需要授权
在这里插入图片描述
切回admin
[root@k8s2 pki]# kubectl config use-context kubernetes-admin@kubernetes

[root@k8s2 rbac]# vim roles.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: myrole
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: test-read-podsnamespace: default
subjects:
- kind: Username: testapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: myroleapiGroup: rbac.authorization.k8s.io
[root@k8s2 rbac]# kubectl apply -f roles.yaml
role.rbac.authorization.k8s.io/myrole created
rolebinding.rbac.authorization.k8s.io/test-read-pods created[root@k8s2 rbac]# kubectl config use-context test@kubernetes
Switched to context "test@kubernetes".[root@k8s2 rbac]# kubectl run demo --image nginx
pod/demo created
[root@k8s2 rbac]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          2s

现在只能操作pod资源,其它不行
在这里插入图片描述
切回admin
[root@k8s2 rbac]# kubectl config use-context kubernetes-admin@kubernetes

(2)授权

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

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

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

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

[root@k8s2 rbac]# vim roles.yaml
kind: Role                                                    ##role示例
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: defaultname: myrole
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]---
kind: RoleBinding                                             # RoleBinding示例:
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: test-read-podsnamespace: default
subjects:
- kind: Username: testapiGroup: rbac.authorization.k8s.io
roleRef:kind: Role                                           ##绑定的类型是rolename: myroleapiGroup: rbac.authorization.k8s.io---
kind: ClusterRole                                          #ClusterRole示例:
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: myclusterrole
rules:                                                       ##通过规则可以设置控制的内容
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list", "delete", "create", "update"]
- apiGroups: ["extensions", "apps"]resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding						#RoleBinding必须指定namespace;RoleBinding示例
metadata:name: rolebind-myclusterrolenamespace:  default
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRole                               ##绑定的是集群rolename: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.iokind: Username: test---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding				#ClusterRoleBinding全局授权,无需指定namespace
metadata:name: clusterrolebinding-myclusterrole
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRole                      ##绑定的是集群,但是不需要指定namespacename: myclusterrole
subjects:
- apiGroup: rbac.authorization.k8s.iokind: Username: test[root@k8s2 rbac]# kubectl apply -f roles.yaml
role.rbac.authorization.k8s.io/myrole unchanged
rolebinding.rbac.authorization.k8s.io/test-read-pods unchanged
clusterrole.rbac.authorization.k8s.io/myclusterrole unchanged
rolebinding.rbac.authorization.k8s.io/rolebind-myclusterrole unchanged
clusterrolebinding.rbac.authorization.k8s.io/clusterrolebinding-myclusterrole created

使用test用户进行测试
[root@k8s2 rbac]# kubectl config use-context test@kubernetes
在这里插入图片描述
切回admin
[root@k8s2 rbac]# kubectl config use-context kubernetes-admin@kubernetes
回收
[root@k8s2 rbac]# kubectl delete -f roles.yaml

[root@k8s2 rbac]# kubectl config delete-user test
[root@k8s2 rbac]# kubectl config delete-context test@kubernetes

(3)补充

  • 服务账户的自动化
    服务账户准入控制器(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” 的服务账户
  • Kubernetes 还拥有“用户组”(Group)的概念:
    ServiceAccount对应内置“用户”的名字是:
    system:serviceaccount:
    而用户组所对应的内置名字是:
    system:serviceaccounts:
    示例1:表示mynamespace中的所有ServiceAccount
    subjects:
  • kind: Group
    name: system:serviceaccounts:mynamespace
    apiGroup: rbac.authorization.k8s.io
    示例2:表示整个系统中的所有ServiceAccount
    subjects:
  • kind: Group
    name: system:serviceaccounts
    apiGroup: rbac.authorization.k8s.io
Kubernetes 还提供了四个预先定义好的 ClusterRole 来供用户直接使用:cluster-amdinadmineditview- 示例:(最佳实践)kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: readonly-defaultsubjects:- kind: ServiceAccountname: defaultnamespace: defaultroleRef:kind: ClusterRolename: viewapiGroup: rbac.authorization.k8s.io[root@server2 rbac]# kubectl describe clusterrole cluster-admin [root@server2 rbac]# kubectl describe clusterrole view[root@server2 rbac]# kubectl describe clusterrole admin[root@server2 rbac]# kubectl describe clusterrole edit

相关内容

热门资讯

不良率上升倒逼防线前移 银行收... 银行正在给个人信贷风控“上强度”。上海证券报记者近期自业内多方了解到,不少银行零售信贷业务从审批权限...
自媒体新手如何快速涨粉?这5个... 自媒体新手如何快速涨粉?这5个技巧让你少走弯路! 嗨,我是小融。 最近很多刚入门自媒体的朋友问我,怎...
乌兰察布市财政局关于黄金领域非... 乌兰察布市财政局关于黄金领域 非法金融活动风险提示 近期,黄金价格波动频繁,市场热度持续攀升,各类假...
一只鸡蛋架“直发”俄罗斯 无锡... (来源:无锡新传媒) 转自:无锡新传媒 一只3D打印塑料鸡蛋架,成为无锡国际邮件互换局正式开通运营后...
武汉楼市开启红五月 新房成交量... 原标题:武汉楼市开启红五月 数据爆表,新房成交量较去年同期翻番 武汉城建未来中心项目营销中心现场来...
一家精神病院竟现身A股公司前十... 5月8日,有投资者发现,盛通股份前十大股东名单中,竟出现了一家精神病院的身影。这家精神病院全称为“上...
真的老了!哈登心魔难除 骑士还... 哈登又拉胯了。 刚刚过去的两场东部半决赛,骑士都输的相当狼狈,而哈登的发挥更是灾难级的。 半决赛G1...
精神病院通报成上市公司前十大股... 近日,上市公司盛通股份发布一季报,披露了前十大股东名单。其中,一家名为“上饶市广丰区十五岭山精神病医...
天溯计量发布年报 上市首年检测... 转自:中国经营网 文 近日,计量检测机构天溯计量(301449.SZ)发布了2025年年度报告。年...
原创 全... 美伊真要停火了? 一页纸协议让全球油价闪崩! 就在今天,全球市场被一条消息炸开了锅。美国白宫觉得,他...
百信银行业绩:26Q1净利润大... 4月底,中信百信银行股份有限公司(下称“百信银行”)2025年财报及2026年一季度报接连披露—— ...
美光科技股价单周飙升38% 市... 【CNMO科技消息】受全球内存芯片短缺影响,美光科技股价本周大幅上涨。截至周五收盘,美光股价报746...
江西一精神病院炒股,炒成上市公... 近日,上市公司盛通股份(002599.SZ)发布一季报,披露了前十大股东名单,其中一家名为“上饶市广...
专访中国太保副总裁俞斌:从“+... 拥抱AI(人工智能),不再是保险行业的“选择题”,而是关乎企业生存与发展的“必答题”,更是企业决胜未...
多平台优化算法:美团取消超时扣... 图片来源:界面图库 5月8日,网信中国发布消息称,生活服务类平台算法治理已取得初步成效,美团、淘宝、...
原创 2... 2025年,国内系统重要性银行名单正式公布。这是我国金融体系的核心支柱,一共21家银行入选,它们是维...
东海县供销总社:“供销+龙头企... 近日,东海县供销合作总社鼎味泰直营店正式开业。作为东海县供销系统打造的新型社企便民服务网点,该门店的...
原创 阿... 深夜,一家零食店铺的客服后台弹出一条消息:“我上次买的芒果干,这次想换个不那么酸的口味,再帮我推荐几...
和平湾全新项目前瞻 负公摊、唯... 在沈阳,如果想在主城核心区域找一块容积率低于1.5的住宅用地,难度有多大? 过去三年,沈阳主城核心区...
精神病院与国际投行高盛同在 盛... 近日,盛通股份(002599.SZ)发布一季报,其前十大股东名单中,第九位为“上饶市广丰区十五岭山精...