这是本系列文章的第二篇,在上篇文章中我们介绍了Kubernetes访问控制。在本文中,我们将通过上手实践的方式来进一步理解身份认证的概念。
在生产环境中,Kubernetes 管理员使用命名空间来隔离资源和部署。命名空间作为一个逻辑边界来强制基本访问控制。
假设现在我们有个新的管理员叫 Bob,要加入开发团队为研发组管理 Kubernetes 部署。我们现在需要给他提供足够的访问权限以便于他管理工程命名空间。假设你是集群管理员并且拥有管理全局资源和对象的权限,你需要登上 Bob 的账户并帮助他获取访问 Kubernetes 集群所需的凭据。
我在操作中使用的是 Minikube,但本文示例的场景适用于任何使用其他方式配置的 Kubernetes 集群(只要你是集群管理员身份就行)。
首先,创建一个名为 cred 的目录,并运行以下命令为 Bob 生成一个私钥。
mkdir cred
cd cred
openssl genrsa -out bob.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................................................................................+++
................................................+++
e is 65537 (0x10001)
我们还需要一个可以从私钥生成的证书签名请求。
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n
将密钥移动到父级文件夹并在 Base64 中对其进行编码。
cp bob.key ..
cd ..
cat cred/bob.csr | base64 | tr -d '\n'
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
我们需要将生成的 base64 编码的字符串嵌入到 YAML 文件中,并将其作为证书签名请求提交给 Kubernetes。这一步骤基本上可以将 Bob 的私钥与 Kubernetes 集群相关联。
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: bob-csr
spec:
groups:
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEzSU9oUTArMFJUakpqZjBKTkd2Rmo0YWFlN1hYCkkrZWkzTzZWTEpqMHNKNDBvengyUTVndXBmeFc5b0lEYTJETnhVZjZkNHVMOUJ3V2lhdFdQdnBDNm80MHJQc2EKTjBUdEhEekFYeWppc0E5VXVRMVNKMWg5Mkg0TU9XWEpWNWJWaTlXYjBKU3hLbXVrSUVtaERJcW9TcEh6MU5xaApQMWNXOFFpNXpoVVBmWlpnOUhSaWVUQ2xEMmR3bWRtS1JjbU9uenNGVWhJWmZWanVZNzZJUm9KbksyaHNzVjZoCmMyY1JNTVNEdFA0ZDArYkxOY1BKdExpS3JjQkdwUGxLUEdrSHovM2NNbVhpVi8wY2xqUlppMzJCb3B4NlI1NUIKc0Z6cXZwcWgzNWxLNUVOUGxPZy9sdURFdllGeUtzOUY2aERBRFhDNzQxU0ZCQTI0TERzcTFiWWtVUUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxTejgxL2N3bjQxbVRrUDhabWhhUUx3MkpIRkN4ZUlaOFdpCkZOV0U1cnRVd3hrSjJGWVJKRlFUL1hJN0FoL0pXTkhqeHlhOUNyN3c0OThmanN3bDF2ZzQ1QUgrR29DeVEwTWkKOU1MMHl0WmZyaG5jYmtpRG9oSUpuaWhJTjlCUGpHVkw2SG1USytGc0sybG1ZZ1JDdk9Cclg3Rkh6ZjgwM0ZFNAp4ZkgrZlFsdGxDdEZTSEhuaUlzZTFEQ2J4cFVTdnRISXpYMFcyb2hXV3RPVkRpOTAzOW8zY2VaWmdVK3VRYno0Cmp2djJoeVdRNDhORFl3RWF1UUU2S3NBQTFLT0IyUkI2dE45bjFTVWoxU1B2WnBsQkVieDZ5MTkzaUJSVFJRM2wKM2JhdFRNUUEzelBsdk01ZEE2Vy8rQWcwVm0xMk1SR091VFRLSEU2bE5INE1DbHQvRGZZPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
usages:
- digital signature
- key encipherment
- server auth
kubectl create -f signing-request.yaml
certificatesigningrequest.certificates.k8s.io/bob-csr created
使用以下 kubectl 命令验证 CSR:
kubectl get csr
NAME AGE REQUESTOR CONDITION
bob-csr 41s minikube-user Pending
请注意,请求此时依旧处于 pending 状态。集群管理员需要批准它,才会变成 active 状态。
kubectl certificate approve bob-csr
certificatesigningrequest.certificates.k8s.io/bob-csr approved
kubectl get csr
NAME AGE REQUESTOR CONDITION
bob-csr 104s minikube-user Approved,Issued
既然证书已经批准并发布,我们需要从集群中获取签名证书。这是登录 Bob 账户最关键的一步。
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt
bob.crt 这一文件是用于 Bob 身份认证的客户端证书。我们现在拥有 Kubernetes 的私钥(bob.key)和批准的证书(bob.crt)。只要 Bob 拥有这两个凭据,他就可以通过集群进行身份认证。
那么,现在就可以将 Bob 作为用户添加到 Kubernetes 中。
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key
User "bob" set.
打开 ~/.kube/config 文件确认凭据已经设置完成。
让我们创建一个名为 engineering 的新命名空间,Bob 是其管理员。
kubectl create namespace engineering
namespace/engineering created
kubectl get namespace
NAME STATUS AGE
default Active 37m
engineering Active 0s
kube-node-lease Active 37m
kube-public Active 37m
kube-system Active 37m
kubectl CLI 以 auth 的形式提供了非常有用的开关,可以验证特定用户的权限。让我们检查一下当前的管理员用户是否可以访问 engineering 命名空间。鉴于您集群管理员的身份,因此可以轻易看到输出结果。
kubectl auth can-i list pods --namespace engineering
yes
我们也能够检查 Bob 能否访问 engineering 命名空间。
kubectl auth can-i list pods --namespace engineering --as bob
no
很显然,Bob 无法访问命名空间,这是因为我们创建了凭据但是没有明确授权 Bob 对任何对象进行任何特定的动作。
在下一篇文章中,我将引导您完成授权 Bob 的所有步骤。同时,还会介绍角色以及角色绑定。保持关注哟~
更多内容推荐
Kubernetes 首爆严重安全漏洞,请升级你的 Kubernetes
Kubernetes 首爆严重安全漏洞,该漏洞可以无形的方式入侵 Kubernetes
如何使用 Kubernetes GPU 集群自动化深度学习训练
该指南能帮助同行研究者和爱好者们轻松地使用Kubernetex GPU集群来自动化和加速他们的深度学习训练。
再也不用担心学不会 K8S!17 个 K8S 初学者必须掌握的知识点
本文来自RancherLabs微信公众号
手把手教你使用 RKE 快速部署 K8S 集群并部署 Rancher HA
本文来自RancherLabs微信公众号
信任始于握手:TLS1.2 连接过程解析
当你在浏览器地址栏里键入“**https**”开头的URI,再按下回车,会发生什么呢?
2019 年 7 月 26 日
将 AWS IAM Authenticator 部署到 kops
管理身份验证协议通常是一项繁重的任务,需要管理员去维护可接受用户的列表、持续验证每个用户的权限、删除不需要访问权限的用户,甚至定期对令牌和基于证书的访问权限进行回收再利用。
实例演示:如何简化生产中的 Pod 安全策略?
本文来自RancherLabs微信公众号
从零开始入门 K8s:K8s 安全之访问控制
访问控制是云原生安全的一个重要组成部分,也是 K8s 集群在多租环境下必要且基本的安全加固手段。在 K8s 体系中,访问控制又分为三个重要的组成部分,请求认证,鉴权和运行时刻的 admission 准入控制。
在 Amazon EKS 上使用 Open Policy Agent
Open Policy Agent (OPA) 是云原生计算基金会 (CNCF) 的一个沙盒项目,可帮助您针对几乎所有内容实施自动化策略,其工作原理与 AWS Identity and Access Management (IAM) 类似。
HTTP 世界全览(下):与 HTTP 相关的各种协议
学习HTTP的相关协议,可以让你对HTTP了解得更为全面,为后续的学习扫清障碍。
2019 年 6 月 5 日
实战案例:使用 Spring Security 搭建一套基于 JWT 的 OAuth 2.0 架构
今天,我会带你使用Spring Security来一步一步地搭建一套基于JWT的OAuth 2.0授权体系。
2020 年 7 月 23 日
使用“Grafeas”元数据 API 和“Kritis”部署授权管理软件供应链
在最近谷歌云平台(Google Cloud Platform,简称GCP)博客探讨容器安全的系列文章中,GCP团队已经提供了Grafeas的更多细节:通用API和语言,用于存储、查询以及检索跟软件组件有关的元数据,以及Kritis:拟议的框架,允许使用存储在Grafeas中的元数据以构建和使用Kubernetes实施实时部署策略。
Kubernetes 是否已经跨过鸿沟?
Ian Crosby认为Kubernetes已经接近主流采用阶段,因为它在企业级领域所面临的挑战(即高度安全的环境、支持Windows、对有状态负载更好的支持以及与遗留软件和混合云的集成)正在被社区所解决。正如Crosby所说,“问题不在于Kubernetes是否能够跨过鸿沟,而在于何时跨过鸿沟”。
鉴权:如何保护你的数据安全?
今天这节课,我将为你介绍etcd的鉴权模块,深入剖析etcd如何解决上面的这些痛点和挑战。
2021 年 1 月 29 日
数据库安全:数据库中的数据是如何被黑客拖取的?
你知道数据库是如何进行认证的吗?使用数据库交换数据的过程是安全的吗?假如黑客连入了数据库,又会发生什么呢?
2020 年 1 月 17 日
从零开始入门 K8s:Kubernetes API 编程范式
在 Kubernetes 里面, API 编程范式也就是 Custom Resources Definition(CRD)。我们常讲的 CRD,其实指的就是用户自定义资源。为什么会存在用户自定义资源问题呢?本文将会从其需求来源出发,对此概念进行逐步深入的讲解。
使用 Pod 安全策略强化 K8S 安全
本文来自RancherLabs微信公众号
笨方法使用 Kubernetes 实现持续交付
实现使用Kubernetes的持续交付的自动化,需要单一数据源(SSOT)。此外,还应在无需推送新的代码更改的情况下,有效地实现回滚。
Mirantis 与谷歌合作集成 Kubernetes 与 OpenStack
OpenStack专家Mirantis宣布了一个与谷歌的联合项目,以实现Kubernetes容器管理系统与OpenStack项目的集成。该项目将允许Docker容器在由OpenStack管理的基础设施上大规模地部署。
固若金汤的根本(下):数字签名与证书
数字签名、证书、CA,这些知识有种“盗梦空间”一层套一层的感觉,你都了解它们吗?
2019 年 7 月 24 日
推荐阅读
电子书
大厂实战PPT下载
换一换 杨凯(亚顿) | 阿里巴巴 高级前端专家
吴子房 | 网易 前端开发专家
林选磊 | TigerGraph 解决方案工程师
评论