写点什么

Kubernetes 身份认证和授权操作全攻略:访问控制之 Service Account

  • 2020-05-18
  • 本文字数:2870 字

    阅读完需:约 9 分钟

Kubernetes身份认证和授权操作全攻略:访问控制之Service Account

这是本系列的最后一篇文章,前面我们了解了访问控制中的基本概念以及身份认证授权的具体操作,本文我们将进一步了解访问控制中的 service account。


Kubernetes 中有用户和 service account 的概念,可用于访问资源。用户与密钥和证书相关联用于验证 API 请求,使用其中一个配置方案对在集群外部发起的任何请求进行身份验证。最常见的方案是通过 X.509 证书进行身份认证请求。有关创建证书和将证书与用户关联的信息,请参阅Kubernetes身份验证教程。


请记住,Kubernetes 不维护数据库或用户和密码的配置文件。相反,它希望在集群之外进行管理。通过身份验证模块的概念,Kubernetes 可以将身份验证委派给第三方,如 OpenID 或 Active Directory。


尽管 X.509 证书可用于身份验证的外部请求,但 service account 可以用于验证集群中运行的进程。此外,service account 与进行 API server 内部调用的 pod 相关联。


每个 Kubernetes 安装都有一个默认的 service account,它与每个正在运行的 pod 相关联。类似地,为了使 pod 能够调用内部 API Server 端点,有一个名为 Kubernetes 的 ClusterIP 服务,它与默认的 service account 一起使内部进程可以调用 API 端点。


  kubectl get serviceAccounts
复制代码


NAME      SECRETS   AGEdefault   1         122m
复制代码


 kubectl get svc
复制代码


NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEkubernetes   ClusterIP   10.96.0.1            443/TCP   123m
复制代码


请注意,这个 service account 指向嵌在每个 pod 内部的 secret。这一 secret 包含 API Server 所需的令牌。


  kubectl get secret
复制代码


NAME                  TYPE                                  DATA   AGEdefault-token-4rpmv   kubernetes.io/service-account-token   3      123m
复制代码


当我们开始调度 pod 并且访问它时,一切都变得明朗起来。我们将使用 curl 命令启动一个基于 BusyBox 的 pod。


kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
复制代码


kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.If you don't see a command prompt, try pressing enter.[ root@curl-tns-56c6d54585-6v2xp:/ ]$
复制代码


当我们在 BusyBox shell 中时,让我们尝试访问 API Server 端点。


[ root@curl-tns-56c6d54585-6v2xp:/ ]$ curl https://kubernetes:8443/api
复制代码


由于请求缺少身份验证令牌,因此不会产生任何结果。让我们看看如何检索可以嵌入 HTTP 头部的令牌。


如之前所讨论的,令牌作为一个 secret 安装在 pod 里。查看/var/run/secrets/kubernetes.io/serviceaccount 来查找令牌。


[ root@curl-tns-56c6d54585-6v2xp:/ ]$ cd /var/run/secrets/kubernetes.io/serviceaccount
复制代码


[ root@curl-tns-56c6d54585-6v2xp:/tmp/secrets/kubernetes.io/serviceaccount ]$ lsca.crt     namespace  token
复制代码


让我们来设置一些环境变量以简化 curl 命令。


CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crtTOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
复制代码


以下 curl 命令请求在默认命名空间中的服务。让我们看看我们能否从 API Server 中获得回应。


[ root@curl-tns-56c6d54585-6v2xp:~ ]$ curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"
复制代码


{  "kind": "Status",  "apiVersion": "v1",  "metadata": {   },  "status": "Failure",  "message": "services is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"services\" in API group \"\" in the namespace \"default\"",  "reason": "Forbidden",  "details": {    "kind": "services"  },  "code": 403}
复制代码


然而,默认的 service account 并没有足够的权限来检索在同一命名空间内的服务。


请记住,Kubernetes 遵循封闭开放的惯例,这意味着在默认情况下用户和 service account 没有任何权限。


为了满足这一请求,我们需要创建一个角色绑定,将默认 service account 和适当的角色相关联。这一步与我们将角色绑定到 Bob 的方式类似,后者授予他列出 pod 的权限。


退出 pod 并且运行以下命令,为默认 service account 创建一个角色绑定。


kubectl create rolebinding default-view \  --clusterrole=view \  --serviceaccount=default:default \  --namespace=default
复制代码


 rolebinding.rbac.authorization.k8s.io/default-view created
复制代码


以上命令将默认 service account 与集群角色视图相关联,该角色视图使 pod 能够列出资源。


如果你十分好奇,想看所有可用的集群角色,运行命令:kubectl get clusterroles


让我们再次启动 BusyBox pod 并且访问 API Server。


kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
复制代码


kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.If you don't see a command prompt, try pressing enter.[ root@curl-tns-56c6d54585-2cx44:/ ]$
复制代码


CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crtTOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
复制代码


curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"
复制代码


{  "kind": "ServiceList",  "apiVersion": "v1",  "metadata": {    "selfLink": "/api/v1/namespaces/default/services/",    "resourceVersion": "11076"  },  "items": [    {      "metadata": {        "name": "kubernetes",        "namespace": "default",        "selfLink": "/api/v1/namespaces/default/services/kubernetes",        "uid": "b715a117-6be1-4de0-8830-45bddcda701c",        "resourceVersion": "151",        "creationTimestamp": "2019-08-13T09:45:27Z",        "labels": {          "component": "apiserver",          "provider": "kubernetes"        }      },      "spec": {        "ports": [          {            "name": "https",            "protocol": "TCP",            "port": 443,            "targetPort": 8443          }        ],        "clusterIP": "10.96.0.1",        "type": "ClusterIP",        "sessionAffinity": "None"      },      "status": {        "loadBalancer": {         }      }    }  ]}
复制代码


您可以随意为默认 service account 创建其他绑定,以检查 RBAC 如何扩展到 pod。


关于 Kubernetes 身份认证与授权系列文章到此结束,我们讨论了身份验证,授权和 Service account 的基本概念,希望能对你有所帮助。


2020-05-18 18:001206

评论

发布
暂无评论
发现更多内容

其实TCP聪明得很!详解TCP常见的五个异常处理场景

Java 编程 架构 程序人生 架构师

烂大街的Spring循环依赖该如何回答?

Java spring 程序员 架构 面试

“人人皆可成为AI开发者”!百度世界大会官宣百度松果学堂成立

百度大脑

人工智能

阿里专家分享的SpringCloudNginx高并发核心文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

iOS SDK 架构解析

神策技术社区

程序员 数据 埋点

阿里专家分享内部绝密RocketMQ核心原理与最佳实践PDF

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

迅雷不及掩耳盗铃

escray

生活记录 8月日更 搜房记

spring-boot 2.5.4,nacos 作为配置、服务发现中心,Cloud Native Buildpacks 打包镜像,GitLab CI/CD

Zhang

gitlab nacos CI/CD spring-boot 2.5.4 CNB

ipfs投资者靠什么赚钱?投资ipfs要多少钱?

投资ipfs要多少钱 ipfs投资者靠什么赚钱

4轮技术面+1轮HR面,成功拿到腾讯40k*16的Offer ,详解面试流程和真题解析

Java 程序员 架构 面试

MySQL information_schema 系统库介绍

Simon

MySQL

python通过Matplotlib绘制常见的几种图形

Python研究者

8月日更

大数据实战训练营-sparkcore作业

Clarke

中国法定数字货币(DCEP)全面启航!全国普及势在必行

CECBC

探索技术与应用融合的区块链 实现产业良性发展

CECBC

写作——开启技术成长之路

神策技术社区

程序员 写作 日志

Android SDK 之用户路径采集

神策技术社区

数据 路径规划 分析 行为数据

Golang高并发:生产者消费者模型

Regan Yue

Go 语言 8月日更 生产者消费者模型

小米和网易两位资深工程师联合编写的HBASE原理与实践PDF

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

微信架构图设计&“学生管理系统”毕设架构

Imaginary

搭建太阳系3D可视化平台,科普宇宙的未知奥秘

一只数据鲸鱼

科普 数据可视化 智慧宇宙 太空

膜拜!终于拿到了美团大佬分享的Netty源码剖析与应用PDF

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

80W美团架构师整理分享出了Spring5企业级开发实战文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

手把手教你15分钟搭建人脸戴口罩识别软硬件系统

百度大脑

人工智能 EasyDL

微信小程序图片流&本地图片转base64处理方案

页面仔小杨

微信小程序

小布助手在面向中文短文本的实体链指比赛中的实践应用

OPPO小布助手

人工智能 算法 模型训练 智能助手 短文本

LVS 学习: netfilter 与 ipvs 无秘密

绅鱼片

Linux 负载均衡 LVS Netfilter IPVS

神策分析 Web JS SDK 功能介绍

神策技术社区

程序员 代码 埋点

TronChain波场链智能合约开发详情|智能合约DAPP搭建

量化系统19942438797

智能合约 波场链

新思科技推出Rapid Scan新功能帮助开发团队在编写云原生应用的同时确保安全性

InfoQ_434670063458

新思科技 静态应用安全

Linux内核源码分析方法—程序员进阶必备

Linux服务器开发

操作系统 Linux内核 内核源码 底层原理 内核开发

Kubernetes身份认证和授权操作全攻略:访问控制之Service Account_文化 & 方法_Rancher_InfoQ精选文章