首页 > 其他分享 >k8s基于RBAC权限生成config和token

k8s基于RBAC权限生成config和token

时间:2023-04-20 14:01:41浏览次数:45  
标签:k8s kubeconfig RBAC token 集群 user context configns

一、背景

Kubernetes 主要通过 API Server 对外提供服务,对于这样的系统来说,如果不加以安全限制,那么可能导致请求被滥用,甚至导致整个集群崩塌。

Kubernetes 中提供了良好的多租户认证管理机制,RBAC正式其中重要的一个,今天我们来详细聊聊 K8s 中的 RBAC。

二、相关概念

2.1在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。

 

  • User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
  • Role(角色):不同角色具有不同的权限
  • Permission(权限):访问权限
  • 用户-角色映射:用户和角色之间的映射关系
  • 角色-权限映射:角色和权限之间的映射

2.2kubeconfig 介绍

kubeconfig文件保存了k8s集群的集群、用户、命名空间、认证的信息。kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯。

注意:用于配置对集群的访问的文件称为kubecconfig文件。也就是说,kubeconfig文件中包含的内容是集群的配置。但是,并不是必须有个文件名字叫kubeconfig

默认情况下,kubectl命令从$HOME/.kube目录下查找一个名字叫做config的文件。可以通过KUBECONFIG环境变量或者--kubeconfig参数来指定其他的kubeconfig文件。

kubeconfig中主要由如下部分组成:clusters(集群)、users(用户)、context(上下文)


2.2.1 kubeconfig支持多集群、多用户、多认证
在实际的使用中的如下场景:

kubelet使用证书认证(kubelet和api server进行认证)

用户使用token进行认证

管理员为不同的用户提供不同的证书

都可以使用kubeconfig来组织起集群、用户、命名空间的信息。同样,也可以使用context在集群和命名空间之间进行切换。

2.2.2 Context的定义

在kubeconfig中,context中将访问一个集群的参数进行分组。访问这个context名称就是访问这个参数组。context就是一组信息的别名,举例来说,当在高德中使用家的地址,公司的地址就是一个别名,就能迅速的定位到具体的地址信息。

每个context都有3个参数:cluster(集群) 、namespace(命名空间) 、user(用户)

默认情况下,kubectl命令从current context中来获取参数,然后与集群进行通讯

三、实战

3.1创建namespace
kubectl create namespace configns
3.2 使用权限创建服务账户
cat > access.yaml<< EOF
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: confignse-user
  namespace: configns

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: configns-user-full-access
  namespace: configns
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: configns-user-view
  namespace: configns
subjects:
- kind: ServiceAccount
  name: configns-user
  namespace: configns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: configns-full-access
EOF

如您所见,在 Role 定义中,我们添加了对该命名空间中所有内容的完全访问权限。 因为它是一个角色,而不是一个 ClusterRole,所以它将被应用于单个命名空间:configns。 有关 Kubernetes 中角色的更多详细信息,请查看官方文档.

kubectl create -f access.yaml
3.3 获取secret

创建sa用户后,系统会为sa创建对应的secret。

我们现在需要做的第一件事是获取服务帐户的秘密名称。运行以下命令并复制密钥的名称。

$ kubectl describe sa configns-user -n configns

Name:                configns-user
Namespace:           configns
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   configns-user-token-tncrk
Tokens:              configns-user-token-tncrk
Events:              <none>
$ skubectl get secret -n configns
NAME                           TYPE                                  DATA   AGE
configns-user-token-tncrk   kubernetes.io/service-account-token   3      16m

我们现在需要获取服务帐户的令牌和证书颁发机构。为此,我们将使用 kubectl 读取它们。现在,由于 Kubernetes 的秘密是 base64 编码的,我们还需要对它们进行解码。

3.3.1 获取token
kubectl get secret -n configns configns-user-token-tncrk -o "jsonpath={.data.token}" |base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1fVDJTS1NhM0V1enlHTGFuN3BfNGZmOVM2bm9RTmdLZjlqWlpnbzA3ZEEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteW5hbWVzcGFjZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteW5hbWVzcGFjZS11c2VyLXRva2VuLXRuY3JrIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15bmFtZXNwYWNlLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNTcxNDg4YS1mOTc5LTQ1YjMtOTE4ZS1jNjJkYmJhYzlmMjIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bXluYW1lc3BhY2U6bXluYW1lc3BhY2UtdXNlciJ9.oTghGOFPxyv0cJhQnrD7NdxPsil2JVZedJw5oIlHvlgY7B5ZMYbwhj9qd01GuZ5mjgiqKQJfndsf0fRziUR2TmgM4BQM-4MP8DJKG4eLW9zJx7pvrnFR-Ktf89AK-jHkmKg-yP7WS940NxeYctANh-sR4LJzJ-tRExNSOx54ZLW-dn4TuDo1pXj1DtOrHJsvhrP0CFaQWNTV1gDlucIKGo4dCU0LRiE1P1bgaHI4GBLTP2ez9VYtG24j9LLksvKWgWHu7zOKJlA2g1UDfWDF32343ddwADFe34%
3.3.2 获取ca
kubectl get secrets configns-user-token-tncrk -n mynamespace  -o "jsonpath={.data['ca\.crt']}"
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1URXhOREF5TkRnME5sb1hEVE14TVRFeE1qQXlORGcwTmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2dPClpZdUdQWFVTc1ZWejBRSmRlTzNLK2JNQjl1TWNkc2xuTUlYdmI5Rmt3WjNCbjRNTHZaYUFrTC9RT2tNdkhEU1MKOTV4RElPTXRDZmJHWElKbEFJZ3YySUpTRUF6YmNNRE5hb2ZwZmpBVXVzUXd6TUhkdjVoRzRJbkg1UzRGdVFMaAp6Vm5jV1lFTDFORDFFZy9hWnMrTDFJemtGSHc1N1J3Q3hBY3dJcDY4azdLeFUyN24yOHYrVzVCY29HVWR0NGVoCkVaYVFOcGpNamRic3dHa1QwQVlLNFNWc1B2dDY5a2RsYlJld3gzYms5UEpYUFRqeWNkNmFMbUtDQk0yU1M0Q3EKbkJUM2NmS2l6ZGFza3VBTkFmWWQ4S0h4NE9rSXBMSHErM2JSeDltWDZYOUpXS1JIWVppM0VMZTVZa1NRcGQ3ZAo3ZXRKVmpsV0pFa3UwS3E5cW5VQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZMK2Q0NDdvMmpPbXN4dmE5TG5wTHpWVjdoRlFNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCQlRnT2NPeVduWHJ5RTZ2YS9HNGlTU3c0MGZpNUZ2VnY0N0JMT0FBYUFjeURTNzFraQpnYmVERC9maUVSVkxWbi82Z1ZoektkaDRvMHZwaUxjNEZGejBhV1lhQlN6RVpnS1N5YzV5ejVxSndTNlJ4MjhSCmU5dEpsRUFWM3BYbXNTT3ppY2hRdVdiWkQ1NVFTT3ZXaEsvd3AveGxzR3ZEZSt4S0VMUmJTTGJmNzNCZzZvQ1gKTnZWWi9hSmovbk04WXhJOFZidzd1czZpK1FFMVRCVmpWZU1jSGlpTDByUlpnNkhEejY5THR4Qk1kRW9WQlJmbAp6TXdybE5laDJmbzFjTHpsRU1sVHIzUU93ZC9Rd0IyQ1MwcTZVOGRoZ1pVYkpTVmhWMHBCYVFDRmpLTS9jamFpCm96ajcvc2tUYjVhaDVqQVFqbFZBQi83cjlWVHk1U253sdfwfEWFWVWV#DF#3D2r%
3.4 创建kubeconfig

我们现在拥有所需的一切。剩下的唯一事情就是使用我们之前收集的数据创建 Kube 配置文件:

apiVersion: v1
kind: Config
preferences: {}

# Define the cluster
clusters:
- cluster:
    certificate-authority-data: PLACE USER CA HERE
    # You'll need the API endpoint of your Cluster here:
    server: https://YOUR_KUBERNETES_API_ENDPOINT
  name: my-cluster

# Define the user
users:
- name: configns-user
  user:
    as-user-extra: {}
    client-key-data: PLACE USER CA HERE
    token: PLACE USER TOKEN HERE

# Define the context: linking a user to a cluster
contexts:
- context:
    cluster: my-cluster
    namespace: configns
    user: configns-user
  name: configns

# Define current context
current-context: configns

四、总结

使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份认证机制的信息。理解kubeconfig中各字段的含义,配合脚步可以轻松快速的自服务创建自己所需的配置文件。

参考链接:

标签:k8s,kubeconfig,RBAC,token,集群,user,context,configns
From: https://blog.51cto.com/u_11791718/6209524

相关文章

  • k8s deployment资源部署java以及skywalking agent示例
    catdeploy.ymlapiVersion:apps/v1kind:Deploymentmetadata:name:app-namenamespace:your-namespaceannotations:kubernetes.io/change-cause:2.11.0-SNAPSHOT-20230420-46#版本说明-用于回滚等labels:app:app-namespec:replicas:1sel......
  • session,coolie,token区别
    一.seesion、cookie、token区别1.session和cookie的区别1.1、cookie数据存放在客户浏览器,session数据存放在服务器1.2、cookie不是很安全,别人可以分析存在在本地的cookie进行cookie欺骗,考虑到安全应该使用session1.3session会在一定时间内(有一个有效期)保存在服务器上,当访问增多......
  • 部署kubernetes-dashboard顺便搞懂kubernetes中的ServiceAccount和RBAC
    "种草"kubernetes-dashboard安装部署dashboard创建用于登录面板的ServiceAccount权限控制"种草"kubernetes-dashboardKubernetesDashboard是通用的用于管理Kubernetes集群的WebUI面板kubernetes-dashboard代码库readme中对自己的介绍:KubernetesDashboardi......
  • k8s api
    kubectldescribesecretdashboard-admin-token-s2k99-nkube-systemcurl--cacert/etc/kubernetes/ssl/k8s-root-ca.pem-H"Authorization:BearereyJh94Xy44BpIMJYX1-FygIomSoOAdvi85WTaLLsy"https://00.100.85.167:6443{"paths":[&quo......
  • K8s为啥要启用bridge-nf-call-iptables内核参数?用案例给你讲明白
    使用kubernetes遇到最多的70%问题都可以归于网络问题,最近发现如果内核参数:bridge-nf-call-iptables设置不当的话会影响kubernetes中Node节点上的Pod通过ClusterIP去访问同Node上的其它pod时会有超时现象,复盘记录一下排查的前因后因。1、问题现象集群环境为K8sv......
  • 长时间不操作报错原因 操作页面时报错Unexpected token <
    长时间不操作报错原因操作页面时报错Unexpectedtoken<  刷新后页面正常。这是因为页面请求的js文件资源找不到(判断此原因的元素:点击报错的时候network中会加载一个js文件,右键文件新标签页打开跳转到404文件即可确定是此问题)=========================================......
  • k8s下prometheus启动node_exporter
    启动访问地址:IP:9090启动方式:./prometheus--web.enable-lifecycle:热更新,不用重启即生效加载方法有以下两种#1.kill-HUPpid#2.curl-XPOSThttp://IP/-/reload--storage.tsdb.path:数据存储位置,默认是data目录。--storage.tsdb.retention.time:保留时间,默认是15天,过15天之后,就删......
  • ansible-kubeadm在线安装k8s v1.19-v1.20版本
    ansible-kubeadm在线安装k8sv1.19-v1.20版本1.ansible-kubeadm在线安装k8sv1.19-v1.20版本安装要求确保所有节点系统时间一致操作系统要求:CentOS7.x_x64ansible机器与部署k8s集群做免密钥找一台服务器安装Ansible#yuminstallepel-release-y#yuminstallans......
  • async function 报eslint 错误:Parsing error: Unexpected token function 解决方法
    asyncfunctiongetData(){这个代码报eslint错误:Parsingerror:Unexpectedtokenfunction。.eslintrc中parserOptions:{ecmaVersion:6},根据ESLint的官方文档,"ecmaVersion"配置项可以配置以下值:3:ECMAScript 3(默认值)5:ECMAScript 56:ECMAScrip......
  • k8s中command、args && dockerfile中entrypoint、cmd之间的比较
    k8s中command、args&&dockerfile中entrypoint、cmd之间的比较标签(空格分隔):K8SDockerfile中ENTRYPOINT,CMD的比较ENTRYPOINT的两种格式:ENTRYPOINT["executable","param1","param2"](exec格式,推荐)ENTRYPOINTcommandparam1param2(shell格式)C......