草庐IT

Kubernetes 集群零信任访问架构设计

Hunter 2023-03-28 原文

现代 IT 环境日益动态化。例如,Kubernetes 正在突破许多 IT 组织的可能性。

开源技术在自动化容器化应用程序的部署、可扩展性和管理方面的很多好处。特别是,IT 团队正在利用其强大的功能、效率和灵活性来快速开发现代应用程序并完成大规模交付。

然而,在 Kubernetes 环境中强化安全实践的过程是一个日益严峻的挑战。随着越来越多的开发和生产 Kubernetes 集群分布在本地数据中心、多个公共云提供商和边缘位置,这种相对较新的动态操作模型为访问控制带来了极大的复杂性。

由于大多数团队都有在多个区域运行的多个集群的场景——通常具有不同的分布和管理界面——企业 IT 需要考虑到需要不同级别访问权限的开发人员、运营人员、承包商和合作伙伴团队。

鉴于 Kubernetes 的分布式和扩展性,IT 必须尽一切可能确保访问安全,以避免正在发生的错误。下面,我们将看看如何应用 Kubernetes 零信任原则来保护整个环境,如何为容器提供零信任安全性。

Kubernetes 集群的零信任访问

假设在网络中和网络之间访问的所有人员、系统和服务都是不可信的安全模型,零信任正在成为防止恶意攻击的最佳技术。基于身份验证、授权和加密技术,零信任的目的是不断验证安全配置和状态,以确保跨环境的可信。

以下是对 Kubernetes 工作原理的基本了解:

  • 每个集群的 Kubernetes 控制平面的核心是 Kubernetes API Server。
  • API Server 用于查询和操作所有 Kubernetes 对象的状态。
  • Kubernetes 资源对象包括命名空间、pod、配置映射等。
控制对 API Server 的访问是管理 Kubernetes 访问和实现零信任的关键功能。保护对 Kubernetes 集群的访问的第一步是使用传输层安全性 (TLS) 保护进出 API Servre 的流量。

实现零信任的 API 服务器最佳实践:

  • 随处启用 TLS。
  • 使用 API Server 的专用端点。
  • 对 API Server 使用第三方身份验证。
  • 关闭 API Server 的防火墙入站规则,确保它被隐藏并且不能从 Internet 直接访问。
在保护传输层之后,Kubernetes 还包括必要的钩子来实现零信任和控制每个 Kubernetes 集群的 API Server 访问。这些钩子代表了 Kubernetes 强化安全态势的四个关键领域:

  • 验证
  • 授权
  • 准入控制
  • 记录和审计

Kubernetes 身份验证

在零信任的情况下,所有与 Kubernetes 集群相关的用户级和面向服务的帐户都必须在执行 API 调用之前进行身份验证。Kubernetes 可以广泛使用安全模块和插件,以确保该平台能够通过团队首选的身份验证系统有效运行:

  • HTTP 基本身份验证
  • 身份验证代理(支持 LDAP、SAML、Kerberos 等)
  • 客户证书
  • 不记名令牌
  • OpenID Connect 令牌
  • Webhook 令牌授权
身份验证的常见最佳实践包括启用至少两种身份验证方法(多因素身份验证或 MFA)和定期轮换客户端证书。

对 Kubernetes 的授权

必须允许每个具有身份验证访问权限的用户或服务帐户在 Kubernetes 集群中执行任何可能的操作。零信任的想法是,只有经过身份验证的用户具有完成所请求操作的必要权限,才能授权请求。对于发出的每个请求,此模型将需要指定 Kubernetes 集群中的用户名、操作和受影响的对象。

Kubernetes 支持多种授权方法,包括:

  • 基于属性的访问控制 (ABAC) 根据用户、环境和资源属性的组合动态地授权访问。
  • 基于角色的访问控制或 RBAC,根据用户在组织中的角色(例如开发人员、管理员、安全人员等)授权访问。
组织最常使用 RBAC,因为它的实用性允许更轻松的管理控制并提供大多数用例所需的粒度。在行业内,以最低权限启用 RBAC 是很常见的。

ABAC 可以提供额外的粒度,但需要额外的时间和资源来正确定义和配置。但是,使用 ABAC 方法解决问题可能更具挑战性。因此,通常以最低权限启用 RBAC。

Kubernetes 准入控制

准入控制器提供了一种实现业务逻辑的方法,以改进 Kubernetes 的零信任方法。准入控制器的目的是使系统能够自动处理创建、修改、删除或连接到 Kubernetes 对象的请求。可能需要启用多个准入控制器以满足您组织的需求,如果其中任何一个拒绝特定请求,系统也会自动拒绝它。

当今可用的各种内置准入控制器为团队提供了许多用于执行策略和实施各种操作的选项。动态控制器可以快速修改请求以遵守已建立的规则集。例如,ResourceQuota 准入控制器观察传入的请求并确保它们不违反已在命名空间的 ResourceQuota 对象中列出的约束。

Kubernetes 的日志记录和审计

审计功能提供了集群内执行的操作的跟踪记录,这对于 Kubernetes 安全态势至关重要。这些功能可以跟踪任何用户、应用程序和控制平面本身的任何操作。

有四种不同类型的审计级别:

  • 无 – 不记录此事件
  • 元数据 – 记录请求元数据
  • 请求 - 记录事件元数据和请求
  • RequestResponse – 记录事件元数据、请求和响应
除了指定审计级别之外,团队还可以控制记录审计事件的位置。当日志后端将事件写入集群的本地文件系统时,webhook 后端会将审计事件发送到外部日志系统。

扩展零信任架构

虽然上述不同的方法和实践提供了创建零信任环境的能力,但当 Kubernetes 的足迹扩展到几个集群之外时,正确配置和对齐这些单独的元素成为一个更重大的挑战。当涉及多个工作负载和 Kubernetes 分布时,事情会变得特别复杂。这一挑战并不新鲜,但如今已为许多公司所共有。

例如,让我们考虑一个场景,一家公司管理着 100 个 Kubernetes 集群——从开发到 QA 到预生产再到生产——并且这些集群需要在地理位置上靠近其全球客户群,以便应用程序能够处理实时视频和音频数据。

在确保用户安全访问 Kubernetes 集群方面,该公司可能会遇到三个问题:

  • 假设这家公司有几百名开发人员和几十名 IT 运维人员,手动在每个集群中添加和删除用户的艰巨任务会产生比解决的问题更多的问题。
  • 如果发生紧急事件,补救所需的时间至关重要。如果访问方法让那些对问题进行故障排除的人只需要几分钟才能登录到受影响的集群,那么问题可能会成倍增加。
  • 由于日志数据分布在 100 个集群中,因此可能无法全面了解审计和合规性报告。

平台团队的注意事项

企业平台团队的众多目标之一是帮助全球分布的 IT 团队从一个中心位置管理其所有集群中的用户访问。其目的是有效地保护和管理对 Kubernetes 基础设施的访问,同时使审计日志记录和合规性报告更加简单。

平台团队应考虑为 Kubernetes 实施零信任,以确保应用和实施前面描述的最佳实践来保护整个 Kubernetes 环境。通过消除在每个集群上手动应用最佳实践的需要,IT 组织可以以更低的风险大规模运行 Kubernetes。

在为 Kubernetes 设计零信任时,平台团队需要考虑以下三个好处:

  • 使 RBAC 超灵活:如果团队成员更改角色,访问权限应自动更新,这样任何人都不会拥有过多或过少的访问权限。
  • 快速和简化可访问性:通过安全的单点登录为授权用户提供无缝访问,从而消除对任何集群的延迟访问。
  • 即时场景的凭据:授权用户的服务帐户应在具有“即时”访问权限的远程集群上创建,并在用户注销后自动删除,从而消除凭据过期的机会。
一两个集群时并不会存在明显的安全风险,但随着 Kubernetes 集群和容器化应用程序数量的增加。因此,平台团队需要在其整个 Kubernetes 基础架构中为集群和应用程序启用集中的企业级安全和控制。

有关Kubernetes 集群零信任访问架构设计的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  9. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  10. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

随机推荐