Kubernetes是一种用于管理容器化应用程序的自动化系统,它为开发人员提供了多种好处。它通过在现有 pod 崩溃时自动创建新 pod 来消除应用程序停机时间,并且它允许团队轻松扩展应用程序以适应流量的增加或减少。由于这些和其他功能,许多组织正在将其现有应用程序迁移到 Kubernetes。
使用云供应商提供的托管 Kubernetes 服务时,例如 Amazon Elastic Kubernetes Service (Amazon EKS)、Google Kubernetes Engine (GKE) 或 Azure Kubernetes Service (AKS),您需要确定用户对该服务的访问权限. Kubernetes 提供了一个命令行客户端工具 kubectl,它使用您的管理配置文件来访问您的 Kubernetes 集群。如果其他团队成员需要访问该集群,您需要创建一个具有适当访问权限的单独配置文件,这可以通过 Kubernetes 访问控制来处理。
但并非组织的所有成员都需要相同级别的访问权限。例如开发和销售团队将有不同的需求。因为跨组织的过于广泛的访问可能会增加人为错误或安全漏洞的风险,所以 Kubernetes 允许您创建不同的角色并将所需的权限分配给这些角色,然后将角色分配给不同的用户。
在分配 Kubernetes 访问控制时,需要牢记一些基本组件。以下是其中的十个组件,它们将帮助您改善开发人员体验 (DX) 和安全性,并优化您的应用程序的可扩展性。
您可以使用单点登录 (SSO) 身份验证来访问您的 Kubernetes 集群,而不是依赖可能会带来安全风险的静态密码。Kubernetes 提供了使用OpenID Connect (OIDC) 令牌对 SSO 进行身份验证的能力,这提供了用户友好的登录体验。OIDC 支持 Salesforce、Azure AD 和 Google 等身份提供商,它们将为您提供访问令牌、ID 令牌和刷新令牌。ID 令牌是一个JWT,您可以随后将其用于授权。
Dex是 Kubernetes 集群上的另一个 SSO 开源工具,由 CoreOS 开发。Dex 支持用于 SSO 的 LDAP、GitHub、SAML 2.0、GitLab、OAuth 2.0、Google、LinkedIn、Microsoft、Bitbucket Cloud、OpenShift、Atlassian Crowd、Gitea 和 OpenStack Keystone。您可以使用 Dex 控制登录后的令牌生成,并在需要时强制用户重新进行身份验证。Dex 还提供了强大的文档来实现各种连接器。
审计日志功能记录对 Kubernetes 集群的所有请求。它捕获 Kubernetes API 服务器中请求的 URL、哪些用户或服务发出了请求、发出请求的时间、发出请求的位置,以及请求被放行或拒绝的原因。审计日志以JSON Lines格式存储数据,并在键值对中包含元数据。
有许多工具可用于分析审计日志文件,例如Prometheus和Grafana。分析可帮助您检测身份验证或授权失败以及 API 请求缓慢等问题。您还可以使用日志报告数据来识别集群的异常流量,这可以帮助您缓解任何攻击。
这对于您的服务器应用程序来说是一项至关重要的功能,因为日志会告诉您集群的执行情况以及是否存在问题。
基于角色的访问控制(RBAC) 用于向 Kubernetes 集群添加新用户或组。默认情况下,管理员配置证书文件不能分发给所有用户。通过使用 RBAC,您可以定义哪些用户可以访问哪些 Kubernetes 组件以及他们可以对每个组件执行哪些活动。
RBAC 的四个组成部分是Role、ClusterRole、RoleBinding和ClusterRoleBinding。Role ClusterRole定义访问权限。并将RoleBinding和ClusterRoleBinding绑定到用户。和是相同的,但是为特定命名空间创建的,而是用于集群的。
RBAC 可以与 OIDC 一起使用,因此您可以控制 Kubernetes 组件对创建的用户或组的访问权限。Role通过使用 RBAC,您可以使用和定义哪些用户或组可以访问哪些资源RoleBinding。RBAC 允许灵活的访问控制;您可以随时添加或修改访问权限。
Kubernetes 策略允许您限制资源使用并保护组件免受未经授权的访问。策略包括资源配额、Pod 安全策略和网络策略。
网络策略允许您通过限制节点端口访问来控制 Pod 的网络访问。资源配额用于限制 Kubernetes 组件对 CPU 和内存的使用。如果组件超出限制,则无法创建这些组件,这将返回 HTTP 状态码403 Forbidden。最后,Kubernetes 集群中的 pod 用于运行应用程序。Pod 安全策略允许您定义某些条件,并且 Pod 只有在满足这些条件时才会运行。
kubeconfig 文件用于身份验证和授权。在该文件中,kube-context 包含 Kubernetes 集群(服务器 URL 和证书颁发机构数据)、用户名和命名空间。这种类型的文件是使用 RBAC 或托管 Kubernetes 提供程序创建的。
上下文定义了哪个用户与哪个命名空间和哪个集群相关联,因为 kubeconfig 文件可以选择定义多个 Kubernetes 集群 URL。使用kubectl config current-context命令获取当前上下文,然后使用kubectl config use-context namespace_name命令切换到不同的上下文。
etcd是一个 Kubernetes 控制平面组件,是一个高可用的键值对存储。所有 Kubernetes 集群数据都将存储在 etcd 中,作为分布式数据库。ectd 允许 Kubernetes 集群中的所有节点读写组件的状态数据。它存储 Kubernetes 组件的实际状态和期望状态。该kubectl get命令从 etcd 读取数据,并且该kubectl create命令在 etcd 中创建新条目。保护 etcd 很重要,因为如果未经授权的人获得访问权限,他们可以修改或删除 Kubernetes 组件的任何数据。所以要为 etcd 启用TLS以保护其免受未经授权的访问。
每当您使用 kubectl 发出命令时,Kubernetes 集群中的工作节点都会为您完成工作。控制平面根据命令指示工作节点,然后将组件状态数据存储在 etcd 数据库中。这意味着 pod 将仅在工作节点上运行。
如果有人使用 SSH 连接获得对工作节点的访问权限,他们可能会对您的应用程序造成安全威胁。您不应该直接访问您的工作节点。确保节点已禁用 SSH 访问。控制工作节点中的网络端口访问,以避免不必要的问题。
Kubernetes Secret 用于存储敏感信息,例如密码。但是,默认情况下数据是 Base64 编码的,这不足以保护应用程序凭据。
建议使用外部机密管理器,因为如果用户可以访问这些凭据,则会增加滥用的可能性。有许多工具和提供程序可以存储您的敏感数据,例如AWS Secrets Manager和HashiCorp Vault。
命名空间用于隔离 Kubernetes 组件。您可以根据需要将 pod、服务或机密等组件放置在不同的命名空间中,甚至可以在一个命名空间中运行数据库 pod,在另一个命名空间中运行前端应用程序 pod。
如果您拆分前端应用程序和数据库应用程序,您可以使用 RBAC 创建访问权限并轻松限制对 Kubernetes 组件的访问。带有命名空间的 RBAC 将帮助您实现更好的资源访问控制。
Kubernetes 每年发布 3 次新版本,每次都应该更新集群。新版本将解决任何现有的错误并添加新功能。例如,在 Kubernetes 1.6 版中添加了 RBAC。如果您不不断更新,那么您将无法使用最新的功能。
如果您使用托管 Kubernetes 提供程序,那么升级过程会更容易。您的提供商将处理工作并为您提供更新的用户界面
Kubernetes 虽然很受欢迎,但它是一个复杂的平台,您必须密切关注您在集群上提供的用户访问权限。并非所有用户都需要对所有组件具有相同级别的访问权限。确保特定用户访问将帮助您确保集群安全并确保整个组织的透明度更高,因为每个团队成员都将知道他们在 Kubernetes 应用程序中定义的角色。
这些访问控制组件的实施听起来可能很耗时,但您的托管 Kubernetes 提供商可以帮助甚至为您完成大部分工作。提前花时间确保适当的访问控制将使您和您的组织免于遇到不可预估的麻烦。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。