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)

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

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

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue的table组件合并行方法

/*** param {Array} data - 原始数据集合* param {string} addParamer - 这个是自定义的参数,向每个对象中添加一个参数 按照这个参数的个数进行合并* param {} args - 剩余参数 这个是合并规则 ,比如按照时间合并 那就传入对象中的时间参数date&#xf…

String StringBuffer StringBuilder StringJoiner区别

String、StringBuffer、StringBuilder和StringJoiner在Java中都是处理字符串的工具,但它们各自有不同的特点和适用场景。 String: 是不可变的字符序列,一旦创建就不能更改其内容。每次对String进行修改时,实际上会生成一个新的String对象。这…

机器人期刊:Science Robotics and IEEE Transactions

文章目录 1. Science Robotics (出版商 AAAS)2. IEEE Transactions on RoboticsReference1. Science Robotics (出版商 AAAS) https://www.science.org/journal/scirobotics 2. IEEE Transactions on Robotics

10kV/35kV并网分布式光伏系统-实现错峰有序用电

根据国家电网 Q/GDW1480-2015 《分布式电源接入电网技术规定》:分布式电源并网电压等级可根据各 并网点装机容量进行初步选择,推荐如下: • 8kW 及以下可接入 220V ; • 8kW~400kW 可接入 380V ; • 400kW~60…

Solidity Uniswap V2 Pair中交换Token

交换意味着使用一定数量的TokenA来换取Tokenb。但我们需要一些额外的辅助服务: 1.提供实际汇率。 2.保证所有的交易都是在正确的汇率下进行的。 GitHub - XuHugo/solidityproject: DApp go go go !!! 我们在研究流动性供应时学到了一些关于 D…

【Appium问题】每次启动appium都会安装一次uiautomator

问题 每次启动appium,都需要安装一次uiautomator2比较麻烦 解决 在配置文件capabilities 中增加参数skipServerInstallationTrue

【C++专栏】C++入门 | 函数重载、引用、内联函数

博客主页:Duck Bro 博客主页系列专栏:C专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ C入门 | 函数重载、引用、内联函数 文章编号:C入门 / 02 文…

mongodb的备份与恢复

查询语句 show dbs use leshusanguo show tables db.user.find() db.user.find({},{uid:1,nickname:1,max_level:1}) db.user.find({max_level:1},{uid:1,nickname:1,max_level:1}) db.user.count() db.user.find({max_level:1,uid:672064,},{uid:1,nickname:1,max_level:1}) …

Docker的奇幻漂流

航海日志:Docker的奇幻漂流 欢迎各位探险家们,今天我们将启航进入一个由容器构成的神秘海域——Docker。在这个由代码构建的奇妙世界里,我们将学习如何驾驭这些名为“容器”的神奇船只。准备好了吗?让我们扬帆起航,探…

ORACLE RAC反应卡顿时enq: SV - contention和latch: row cache objects的分析

某客户数据库系统使用ORACLE RAC 11G版本,两个节点。在上午8点钟之后,业务开始大量进行时,出现严重的卡顿问题;在工程师分析后,发现当时出现了很多异常等待数据,如典型的enq: SV - contention 、enq: TX - …

基于单片机的老人防丢系统设计

目 录 摘 要 I Abstract II 引 言 3 1 系统总体架构 6 1.1方案设计与选择 6 1.2 系统架构设计 6 1.3 系统器件选择 7 2 系统硬件设计 9 2.1 单片机外围电路设计 9 2.2 LCD1602液晶显示电路设计 12 2.3 短信模块电路设计 14 2.4 GPS模块电路设计 14 2.5 电源与按键控制电路设计…

用 reduce 实现 map 的功能

Array.prototype.map function (callback) {const array this;return array.reduce((acc, cur, index) > {acc.push(callback(cur, index, array));return acc;}, []); }; 测试: var m [1, 2, 3, 4, 5].map(function (v, i, arr) {return v v; }); console…

精读《深度学习 - 函数式之美》

1 引言 函数式语言在深度学习领域应用很广泛,因为函数式与深度学习模型的契合度很高,The Beauty of Functional Languages in Deep Learning — Clojure and Haskell 就很好的诠释了这个道理。 通过这篇文章可以加深我们对深度学习与函数式编程的理解…

使用Python合并PDF文件并添加自定义目录及页脚

如何用Python合并PDF文件并添加自定义目录及页脚 步骤一:准备环境步骤二:合并PDF文件步骤三:处理特定文件步骤四:合并并添加目录与页脚步骤五:保存最终文档结语完整代码 在处理文档时,我们经常遇到需要合并…

Mybaties-Plus saveBatch()、自定义批量插入、多线程批量插入性能测试和对比

一.背景 最近在做一个项目的时候,由于涉及到需要将一个系统的基础数据全量同步到另外一个系统中去,结果一看,基础数据有十几万条,作为小白的我,使用单元测试,写了一段代码,直接采用了MP(Mybati…

element---tree树形结构(返回的数据与官方的不一样)

项目中要用到属性结构数据&#xff0c;后端返回的数据不是官方默认的数据结构&#xff1a; <el-tree:data"treeData":filter-node-method"filterNode":props"defaultProps"node-click"handleNodeClick"></el-tree>这是文档…

SpringCloudGateway全局过滤器

文章目录 全局过滤器的作用自定义全局过滤器过滤器执行的顺序 上一篇 Gateway理论与实践 介绍的过滤器&#xff0c;网关提供了31种&#xff0c;但每一种过滤器的作用都是固定的。如果我们希望拦截请求&#xff0c;做自己的业务逻辑则没办法实现。 全局过滤器的作用 全局过滤器的…

怎样添加、移除、移动、复制、创建和查找节点?

1&#xff09;创建新节点 createDocumentFragment() //创建一个 DOM 片段createElement() //创建一个具体的元素createTextNode() //创建一个文本节点 2&#xff09;添加、移除、替换、插入 appendChild() //添加removeChild() //移除replaceChild() //替换insertBefore() /…

高级语言讲义2010计专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型&#xff1a;表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后&#xff0c;ES就会自动判断其类型&#xff0c;而且当参数发生变…