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

news2025/6/11 8:20:15

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: abcdefghijklmnopqrstuvwxyz
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
  localAPIEndpoint:
    advertiseAddress: 127.0.0.1
  nodeRegistration:
    kubeletExtraArgs:
    - --authentication-token-webhook-cache-ttl=2m0s
  serviceAccountKeyFile: /etc/kubernetes/pki/sa.key
  token: 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/pod
  tokenReview:
    spec:
      server: ldap://ldap.example.com
      bindDN: cn=admin,dc=example,dc=com
      bindPassword: secret
      baseDN: dc=example,dc=com
      insecure: true

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

apiVersion: kubeadm.k8s.io/v1
kind: InitConfiguration
metadata:
  name: init-config
spec:
  bootstrapTokens:
  - token: abcdefghijklmnopqrstuvwxyz
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
  localAPIEndpoint:
    advertiseAddress: 127.0.0.1
  nodeRegistration:
    kubeletExtraArgs:
    - --authentication-token-webhook-cache-ttl=2m0s
  serviceAccountKeyFile: /etc/kubernetes/pki/sa.key
  token: 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/pod
  tokenReview:
    spec:
      issuer: https://oidc.example.com
      clientID: my-client-id
      clientSecret: my-client-secret
      extraScopes:
      - profile
      - email

  1. 将 OIDC 认证模块绑定到 API Server
apiVersion: kubeadm.k8s.io/v1
kind: InitConfiguration
metadata:
  name: init-config
spec:
  bootstrapTokens:
  - token: abcdefghijklmnopqrstuvwxyz
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
  localAPIEndpoint:
    advertiseAddress: 127.0.0.1
  nodeRegistration:
    kubeletExtraArgs:
    - --authentication-token-webhook-cache-ttl=2m0s
  serviceAccountKeyFile: /etc/kubernetes/pki/sa.key
  token: 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.coloradmin.cn/o/1504133.html

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

相关文章

北京智源表示大模型推断少用几层也可以,节省15%算力资源

在人工智能领域,大语言模型(LLMs)已经在各种下游任务中展现出了绝佳的性能。通常采用零次学习、少次学习和微调等多种评估协议。然而,LLMs的推理阶段非常昂贵,需要大量的计算资源。理想情况下,LLMs的推理阶…

java-ssm-jsp-基于ssm的宝文理学生社团管理系统

java-ssm-jsp-基于ssm的宝文理学生社团管理系统 获取源码——》公主号:计算机专业毕设大全

贝叶斯优化CNN-LSTM回归预测(matlab代码)

贝叶斯优化CNN-LSTM回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想,通过不断探索各种参数组合的结果,根据已有信息计算期望值,并选择期望值最大的组合作为最佳策略,从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…

python 基础知识点(蓝桥杯python科目个人复习计划61)

今日复习内容:想到什么复习什么 因为比赛用到的编辑器是IDLE,所以从现在开始,我就不用pycharm了。 例题1: 从1到2020的所有数字中,有多少个2? 这个题是一个填空题,我用的方法是先在编辑器上…

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

华为新发布磁电存储“王炸”,到底是什么?

最近,在巴塞罗那举行的2024年世界移动通信大会(MWC24)上,华为数据存储产品线总裁周彼得博士介绍了这款即将面世的产品。他向听众表示,与磁带存储相比,该设备可以降低20%的总连接成本,而与硬盘相…

C# 中 Math.Round 数学函数

在 C# 中,Math.Round 是一个数学函数,用于对一个浮点数进行四舍五入操作。它接受一个浮点数作为输入,并返回一个最接近输入值的整数或指定小数位数的浮点数。 Math.Round 方法有多个重载,其中最常用的重载有以下两种形式&#xf…

OpenTenBase 开发环境搭建及Debug设置

最近有个 OpenTenBase开源核心贡献挑战赛 领导建议大家都去试试,我也去凑了下热闹,发现能力有限一时半会是搞不明白了,最多也就是能搞搞文档翻译,或者写点操作手册啥的。 不过不管怎么样,先把开发环境搭上,…

cannot import name ‘Flask‘ from partially initialized module ‘flask‘

bug: ImportError: cannot import name Flask from partially initialized module flask (most likely due to a circular import) (G:\pythonProject6\flask.py) 这个是因为包的名字和文件的名字一样 修改文件名: 结果 🤣🤣&…

基于PyTorch深度学习实战入门系列-(2)Numpy基础上

导入Numpy模块 import numpy as np创建数组(一维数组、小数数组、二维数组) # 创建一个一维数组 n1 np.array([1, 2, 3]) # 创建一个含有小数的一维数组 n2 np.array([0.1, 0.2, 0.3]) # 创建一个简单的二维数组 n3 np.array([[1, 2], [3, 4]]) print…

Rust教程:How to Rust-从开始之前到Hello World

本文为第0篇 专栏简介 本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议基础的同学(无基础学Rust也是牛人[手动捂脸]) 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用&…

力扣由浅至深 每日一题.01 两数之和

万物惊鸿,唯我澄明 —— 24.3.9 1. 两数之和https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会…

C语言转义字符:一文打尽

转义字符 1. 前言2. 预备知识2.1 打印格式2.2 进制转换2.3 ASCII码 3. 什么是转义字符4. 常见的转义字符4.1 \?4.2 \4.3 \"4.4 \\4.5 \dddddd表示1到3个八进制数字4.6 \xdddd表示1到2个十六进制数字4.7 其他转义字符 5. 一道笔试题6. 一个小插曲 1. 前言 大家好&#xf…

giffgaff怎么充值?giffgaff怎么续费?

-性价比高:0月租,免费接收短信,充值一次,接码可以用20年以上(仅需半年保号一次),可能是国内性价比最高的接码实体卡!-安全:实体卡无须担心因号码被风控,还可以…

使用阿里云服务器搭建网站简单吗?超简单教程

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网aliyunfuwuqi.com以搭建WordPress网站博客为例,来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流…

BUU [网鼎杯 2020 半决赛]AliceWebsite

BUU [网鼎杯 2020 半决赛]AliceWebsite 开题&#xff1a; hint附件是源码。在index.php中有一个毫无过滤的本地文件包含 <?php $action (isset($_GET[action]) ? $_GET[action] : home.php); if (file_exists($action)) {include $action; } else {echo "File not…

STM32之串口中断接收UART_Start_Receive_IT

网上搜索了好多&#xff0c;都是说主函数增加UART_Receive_IT()函数来着&#xff0c;实际正确的是UART_Start_Receive_IT()函数。 —————————————————— 参考时间&#xff1a;2024年3月9日 Cube版本&#xff1a;STM32CubeMX 6.8.1版本 参考芯片&#xff1a…

基于Kronig-Penney能带模型的MATLAB求解与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Kronig-Penney能带模型的MATLAB求解与仿真.综合利用 MATLAB提供的求解常微分方程、矩阵行列式、代数表达式化简及绘图等函数 ,可使 Kronig-Penney能带模型分析…

【鸿蒙开发】第十八章 Web组件(二)

接上一章节 【鸿蒙开发】第十七章 Web组件&#xff08;一&#xff09; 4 H5与端侧交互 4.1 应用侧调用前端页面函数 应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触…

计算机网络(基础篇)复习笔记——体系结构/协议基础(持续更新中......)

目录 1 计算机网络基础相关技术Rip 路由更新操作 2 体系结构(OSI 7层, TCP/IP4层)应用层运输层网络层IPv4无分类域间路由选择 CIDRIPV6 数据链路层循环冗余校验CRC协议设备 物理层传输媒体信道复用技术宽带接入技术数据通信 3 网络局域网(以太网Ethernet) 4 通信过程编码:信道极…