靶场概述
难度: hard
描述:集群级别的最佳 Kubernetes 安全实践。
这个房间适合所有有抱负的 DevSecOps 工程师和花时间学习该工具基础知识的 Kubernetes 爱好者。它适用于了解该工具、其工作原理以及构建安全 Kubernetes 集群时要采取的初始步骤的人。但现在怎么办?您已经构建了一个安全的集群,但如何确保其安全?随着 Kubernetes 被用作编排容器化应用程序的平台,必须在不同的层上考虑许多不同的安全因素。对于那些希望登上 DevSecOps Express 的人来说,甚至对于那些已经登上的人来说,这可能会让人不知所措。因此,这个房间旨在收集一些关键的最佳 Kubernetes 安全实践,以使您的旅程更加顺畅。全体上车!
基本信息
🚀 | 本地机器信息 | 目标机器信息 |
---|---|---|
IP | 10.17.5.121 | |
OS | kali |
基础知识
Kubernetes 中最重要的安全实践之一是高效、安全地实施访问控制。服务账户是 Access Control 难题的一部分,您需要完成它才能了解如何实现。服务帐户在 Kubernetes 简介房间中简要介绍了,但现在是时候更深入地了解它们是什么以及它们在 Kubernetes 中的使用方式了。“服务帐户”是如果您使用其他云技术时可能熟悉的通用术语。在这个任务中,我们将在 Kubernetes 的上下文中定义一个 Service 帐户,一个 ServiceAccount 对象。
服务帐户可以被视为数字身份或非人类帐户。在 Kubernetes 中,此身份在安全上下文中用于将身份与特定进程相关联。换句话说,集群内部和外部的 Kubernetes 系统组件、应用程序 Pod 或其他实体都可以使用 ServiceAccount 凭证来标识此 ServiceAccount。从安全角度来看,这意味着可以进行 API 身份验证,或者如前所述,可以使用这些 ServiceAccount 实现身份 / 访问控制。
ServiceAccounts 与用户
这里是一个很好的观点,可以强调 ServiceAccount 的 “非人类账户” 方面,并消除关于人类用户被身份验证 / 授权进入集群的任何混淆。以下是有关 ServiceAccounts 和 Users 的一些信息。
服务账户 | 用户 |
---|---|
由 K8s 管理 | 在 K8s 之外管理 |
由 API 创建 | 没有 “User” Kubernetes Object |
具有存储为 Secrets 的关联凭证 | 无法通过 API 创建 |
从本质上讲,用户访问通常使用某种帐户管理解决方案来处理。Kubernetes 确实有一个内置的,但它通常与另一个用户管理系统(如 LDAP 或 AD)集成。对集群及其资源的非人工访问使用 Kubernetes ServiceAccounts 处理。
ServiceAccounts 具有以下属性:
轻量级:Kubernetes ServiceAccounts 允许您创建与 Kubernetes 集群中的特定任务/进程关联的账户。这省去了使用用户账户运行流程带来的许多麻烦(使用与用户账户创建中涉及的数据库相关的特殊系统和业务逻辑),并且更容易根据最小权限原则定义更精细的、特定于任务的权限。
命名空间:在 Kubernetes 中,ServiceAccounts 是一个命名空间资源,这意味着 ServiceAccount 名称只需要在它们关联的命名空间中是唯一的。每个命名空间在创建时都会获得一个与之关联的默认 ServiceAccount,该名称恰如其分地命名为 “default”。假设您没有在 pod/deployment 定义中手动定义 ServiceAccount。在这种情况下,这个 “默认” ServiceAccount(在创建 Pod 的命名空间中)将被分配给它,并且 ServiceAccounts 凭证(令牌)将作为 secret 挂载到它上面。请注意,默认情况下,“默认”ServiceAccount 的权限很少,因此如果任务需要更多权限,则需要创建一个 ServiceAccount。
便携式:由于 ServiceAccount 是轻量级的,并且只需要在命名空间级别是唯一的,因此它们可以捆绑在一起以供其他命名空间或项目使用,从而使其具有可移植性。
这些属性适用于多种用例。作为 DevSecOps 工程师,在处理这些问题时,您的 ServiceAccount 意识应该令人耳目一新。以下是一些示例:
在 Pod 中运行的任务/进程需要与 API 通信以检索机密或敏感信息。此处可以使用 ServiceAccount 来授予对此密钥的只读访问权限。
您在 “example-namespace” 中运行了一个 Pod。其过程包括确保所有 Pod 都在 “other-namespace” 中运行。这里可以使用 ServiceAccount,并结合 RBAC(稍后会详细介绍),以确保此 Pod 有足够的权限在 “other-namespace” 中列出 Pod。
ServiceAccounts 可用于对外部服务进行身份验证。例如,假设您有一个 CI/CD 管道,并且此管道中的某个阶段涉及对 Kubernetes 集群的身份验证。
ServiceAccounts 的创建和配置
使用 kubectl 定义 ServiceAccounts 非常容易。您可以使用以下命令在集群上创建 ServiceAccount。
注意:serviceaccount 可以缩写为 sa
kubectl 创建服务帐户
1 | thm@k8s:~$ kubectl create serviceaccount example-name --namespace example-namespace |
如果您希望此 ServiceAccount 与特定 Pod 相关联,则可以在 pod/部署配置 YAML 中定义,如下所示:
1 | apiVersion: v1 |