当前位置: 首页 > news >正文

Kubernetes 安全秘籍:5 个你必须知道的知识点

Kubernetes 安全和身份验证是确保集群和应用安全的关键。今天将深入探讨 Service Account、身份验证和RBAC的关键概念和实践,帮助您构建安全可靠的应用。今天本文将着重于安全相关的内容,并提供更详细的示例和配置说明,帮助兄弟们更深入地理解和应用 Kubernetes 安全和身份验证机制。

Kubernetes Service Account

Service Account 是 Kubernetes 中用于为 Pod 提供身份和凭据的资源。它允许 Pod 访问 Kubernetes API 和其他资源,而无需使用用户凭据。
在这里插入图片描述

Service Account 工作原理

1.1 Service Account 生命周期

Service Account 的生命周期包括以下阶段:

创建: 创建 Service Account 资源。

绑定: 将 Service Account 绑定到 Pod 或其他资源。

使用: Pod 或其他资源使用 Service Account 的身份和凭据访问 Kubernetes API 或其他资源。

删除: 删除 Service Account 资源。

1.2 Service Account 凭据

Service Account 拥有以下两种类型的凭据:

Token: 用于 Pod 访问 Kubernetes API 的令牌。

Secret: 用于 Pod 访问其他资源的密钥。

2. Service Account 实践

2.1 使用默认 Service Account

每个命名空间都包含一个默认的 Service Account,名为 default。Pod 可以使用默认 Service Account 访问 Kubernetes API 和其他资源,无需显式绑定。

2.2 创建自定义 Service Account

您可以创建自定义 Service Account 来满足特定需求。例如,您可以创建具有不同权限或用于访问不同资源的 Service Account。

2.3 绑定 Service Account

您可以将 Service Account 绑定到 Pod 或其他资源。绑定 Service Account 时,您可以指定要使用的 Service Account 以及要授予的权限。

3. Service Account 高级特性

3.1 使用 Automount Service Account Token

您可以使用 automountServiceAccountToken 字段自动将 Service Account 令牌挂载到 Pod 中。这使得 Pod 可以更容易地访问 Kubernetes API。

3.2 使用 Service Account Token 注入

您可以使用 serviceAccountToken 字段将 Service Account 令牌注入到 Pod 的环境变量中。这使得 Pod 可以更容易地访问其他资源。

3.3 使用 Service Account 与 RBAC 结合

您可以使用 RBAC 控制用户创建和修改 Service Account 的权限。您还可以使用 RBAC 控制 Pod 使用 Service Account 的权限。

4. Service Account 安全最佳实践

使用最小特权原则,仅授予 Service Account 必要的权限。

定期审核 Service Account,确保其符合最新需求。

使用安全扫描工具,例如 Clair,扫描 Service Account 凭据中的安全漏洞。

Kubernetes 身份验证

身份验证是 Kubernetes 安全的核心支柱之一,用于认证用户和 Pod 的身份。

认证流程:

  • 用户或 Pod 向 Kubernetes API Server 发送请求。
  • API Server 询问认证模块是否允许访问。
  • 认证模块根据配置的认证方式进行认证。
  • 如果认证成功,则 API Server 允许访问。
  • 如果认证失败,则 API Server 拒绝访问。
    在这里插入图片描述

认证方式

Kubernetes 支持多种认证方式,包括:

  • 本地认证: 使用本地用户名和密码进行认证。
  • LDAP 认证: 使用 LDAP 服务器进行认证。
  • OIDC 认证: 使用 OpenID Connect 认证。
  • 其他: 支持多种第三方认证插件。

1.1 本地认证

本地认证是最简单的认证方式,适用于小型集群或测试环境。

配置本地认证:

  • 创建一个名为 local-auth 的认证模块。
apiVersion: authentication.k8s.io/v1
kind: TokenReview
metadata:name: local-auth
spec:audiences:- kubernetes.io/serviceaccount- kubernetes.io/pod
  • 将 local-auth 认证模块绑定到 API Server。
apiVersion: kubeadm.k8s.io/v1
kind: InitConfiguration
metadata:name: init-config
spec:bootstrapTokens:- token: abcdefghijklmnopqrstuvwxyzttl: 24h0m0susages:- signing- authenticationlocalAPIEndpoint:advertiseAddress: 127.0.0.1nodeRegistration:kubeletExtraArgs:- --authentication-token-webhook-cache-ttl=2m0sserviceAccountKeyFile: /etc/kubernetes/pki/sa.keytoken: abcdefghijklmnopqrstuvwxyz---
apiVersion: kubeadm.k8s.io/v1
kind: ClusterConfiguration
metadata:name: cluster-config
spec:authentication:authenticator:name: local-auth

1.2 LDAP 认证

LDAP 认证适用于大型组织,可以使用现有的 LDAP 服务器进行认证。

配置 LDAP 认证:

创建一个名为 ldap-auth 的认证模块。

apiVersion: authentication.k8s.io/v1
kind: TokenReview
metadata:name: ldap-auth
spec:audiences:- kubernetes.io/serviceaccount- kubernetes.io/podtokenReview:spec:server: ldap://ldap.example.combindDN: cn=admin,dc=example,dc=combindPassword: secretbaseDN: dc=example,dc=cominsecure: true

将 ldap-auth 认证模块绑定到 API Server。

apiVersion: kubeadm.k8s.io/v1
kind: InitConfiguration
metadata:name: init-config
spec:bootstrapTokens:- token: abcdefghijklmnopqrstuvwxyzttl: 24h0m0susages:- signing- authenticationlocalAPIEndpoint:advertiseAddress: 127.0.0.1nodeRegistration:kubeletExtraArgs:- --authentication-token-webhook-cache-ttl=2m0sserviceAccountKeyFile: /etc/kubernetes/pki/sa.keytoken: abcdefghijklmnopqrstuvwxyz---
apiVersion: kubeadm.k8s.io/v1
kind: ClusterConfiguration
metadata:name: cluster-config
spec:authentication:authenticator:name: ldap-auth

1.3 OIDC 认证

OIDC 认证适用于需要与其他系统进行单点登录 (SSO) 的环境。

配置 OIDC 认证:

创建一个名为 oidc-auth 的认证模块。

apiVersion: authentication.k8s.io/v1
kind: TokenReview
metadata:name: oidc-auth
spec:audiences:- kubernetes.io/serviceaccount- kubernetes.io/podtokenReview:spec:issuer: https://oidc.example.comclientID: my-client-idclientSecret: my-client-secretextraScopes:- profile- email
  1. 将 OIDC 认证模块绑定到 API Server
apiVersion: kubeadm.k8s.io/v1
kind: InitConfiguration
metadata:name: init-config
spec:bootstrapTokens:- token: abcdefghijklmnopqrstuvwxyzttl: 24h0m0susages:- signing- authenticationlocalAPIEndpoint:advertiseAddress: 127.0.0.1nodeRegistration:kubeletExtraArgs:- --authentication-token-webhook-cache-ttl=2m0sserviceAccountKeyFile: /etc/kubernetes/pki/sa.keytoken: abcdefghijklmnopqrstuvwxyz---
apiVersion: kubeadm.k8s.io/v1
kind: ClusterConfiguration
metadata:name: cluster-config
spec:authentication:authenticator:name: oidc-auth

用户认证流程

  • 用户访问 Kubernetes API Server。
  • API Server 将请求转发给 OIDC 认证模块。
  • OIDC 认证模块将用户重定向到 OIDC 身份提供者进行认证。
  • 用户在 OIDC 身份提供者处输入身份信息并进行认证。
  • OIDC 身份提供者将认证结果返回给 OIDC 认证模块。
  • OIDC 认证模块生成一个 Kubernetes 令牌并返回给用户。
  • 用户使用Kubernetes 令牌访问 Kubernetes API Server。

代码示例
以下是一个使用 OIDC 认证进行登录的python示例代码:

import requests# OIDC 身份提供者 URL
oidc_provider_url = "https://oidc.example.com"# OIDC 客户端 ID
client_id = "my-client-id"# OIDC 客户端密钥
client_secret = "my-client-secret"# 重定向 URI
redirect_uri = "https://kubernetes.default.svc.cluster.local/auth/callback"# 请求授权代码
response = requests.get(f"{oidc_provider_url}/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=profile email"
)# 解析授权代码
code = response.url.split("code=")[1]# 请求令牌
response = requests.post(f"{oidc_provider_url}/token",data={"grant_type": "authorization_code","code": code,"redirect_uri": redirect_uri,"client_id": client_id,"client_secret": client_secret,},
)# 解析令牌
access_token = response.json()["access_token"]# 使用令牌访问 Kubernetes API Server
response = requests.get("https://kubernetes.default.svc.cluster.local/api/v1/nodes",headers={"Authorization": f"Bearer {access_token}"},
)# 打印响应
print(response.text)

关注我,我们一起学习更多知识,带你了解更多职场信息内容.

想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 【操作系统学习笔记】文件管理1.9
  • ROS2动作通信的实现
  • 电子数字灯LED管变化数量
  • 计算机找不到api-ms-win-core-path-l1-1-0的5种解决方法
  • 解决ts报错:类型“entry”上不存在属性“$AppTools”
  • 【REST2SQL】12 REST2SQL增加Token生成和验证
  • YOLOv8.1.0安装
  • java实现文件下载(前端传文件后端以流的方式进行输出)
  • 专业140+总分430+西南交通大学924信号与系统考研经验电子信息与通信工程,真题,大纲,参考书
  • 【面试题】Rocketmq面试题总结
  • 图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)
  • Golang pprof 分析程序的使用内存和执行时间
  • Hack The Box-Crafty
  • Linux——文件重定向
  • 数据结构从入门到精通——队列
  • Create React App 使用
  • ES6核心特性
  • Koa2 之文件上传下载
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Promise面试题,控制异步流程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • text-decoration与color属性
  • 第十八天-企业应用架构模式-基本模式
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 聊聊directory traversal attack
  • 如何在 Tornado 中实现 Middleware
  • 软件开发学习的5大技巧,你知道吗?
  • 深度解析利用ES6进行Promise封装总结
  • 时间复杂度与空间复杂度分析
  • 再谈express与koa的对比
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #Z0458. 树的中心2
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (52)只出现一次的数字III
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (五)c52学习之旅-静态数码管
  • .net 4.0发布后不能正常显示图片问题
  • .NET CLR基本术语
  • .NET 解决重复提交问题
  • .NET委托:一个关于C#的睡前故事
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • ::before和::after 常见的用法
  • []常用AT命令解释()
  • [<MySQL优化总结>]
  • [20161214]如何确定dbid.txt
  • [ACTF2020 新生赛]Upload 1
  • [ajaxupload] - 上传文件同时附件参数值
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++]:for循环for(int num : nums)