11种(不被)黑客入侵的方法

作者:安德鲁·马丁(ControlPlane)

自项目启动以来,捕鱼大亨网络版的安全性已经走了很长一段路,但仍然包含一些陷阱。从控制平面开始,逐步建立工作负载和网络安全性,最后对安全性的未来进行展望,以下列出了一些方便的技巧,这些技巧可帮助加固集群并在受到威胁时提高其弹性。

第一部分:控制平面

控制平面是捕鱼大亨网络版的大脑。它具有群集上运行的每个容器和容器的总体视图,可以计划新的容器(其中可以包括对父节点具有根访问权限的容器),并且可以读取存储在群集中的所有机密信息。这些有价值的货物需要防止意外泄漏和恶意意图:当它被访问时,它处于静止状态时以及当它通过网络传输时。

1.到处都有TLS

应该为支持它的每个组件启用TLS,以防止流量嗅探,验证服务器的身份以及(对于双向TLS)验证客户端的身份。

请注意,某些组件和安装方法可能会启用HTTP上的本地端口,并且管理员应熟悉每个组件的设置以识别潜在的不安全流量。

资源

此网络图由 卢卡斯·卡尔斯特伦 演示了理想情况下应该应用TLS的一些地方:主节点上的每个组件之间,以及Kubelet和API服务器之间。 凯尔西高塔的规范 捕鱼大亨网络版的艰难之路 提供详细的手册说明, etcd的安全模型 文档。

从历史上看,自动缩放捕鱼大亨网络版节点是困难的,因为每个节点都需要TLS密钥才能连接到主节点,并且将秘密烘焙到基本映像中不是一个好习惯。 Kubelet TLS引导 为新的kubelet提供创建证书签名请求的功能,以便在引导时生成证书。

2.以最低权限启用RBAC,禁用ABAC和监视日志

基于角色的访问控制为用户对资源的访问(例如对名称空间的访问)提供了细粒度的策略管理。

捕鱼大亨网络版的ABAC(基于属性的访问控制)已经 被RBAC取代 从1.6版开始,因此不应在API服务器上启用。改用RBAC:

--authorization-mode=RBAC

或使用此标志在GKE中将其禁用:

--no-enable-legacy-authorization

有很多 很好的例子集群服务的RBAC策略, 以及 文档。而且不必到此止步-可以从审核日志中提取细粒度的RBAC策略 audit2rbac.

如果Pod受损,则不正确或过分允许的RBAC策略会带来安全威胁。保持最小特权,并不断审查和改进RBAC规则,应被视为团队在开发生命周期中建立的“技术债务卫生”的一部分。

审核记录 (1.10中的beta)在有效负载(例如请求和响应)以及元数据级别提供了可自定义的API日志记录。日志级别可以根据您组织的安全政策进行调整- GKE 提供合理的默认设置以帮助您入门。

对于诸如get,list和watch之类的读取请求,只有请求对象才保存在审核日志中。响应对象不是。对于涉及敏感数据(例如Secret和ConfigMap)的请求,仅导出元数据。对于所有其他请求,请求和响应对象都保存在审核日志中。

别忘了:在妥协的情况下,将这些日志保留在群集中是一种安全威胁。与所有其他对安全敏感的日志一样,这些日志应在群集外部传输,以防止在发生漏洞时被篡改。

3.对API服务器使用第三方身份验证

在整个组织(也称为“单一登录”)中集中进行身份验证和授权,有助于用户的入职,离职和一致的权限.

将捕鱼大亨网络版与第三方身份验证提供程序(例如Google或GitHub)集成在一起,将使用远程平台的身份保证(由2FA等支持),并防止管理员必须重新配置捕鱼大亨网络版 API服务器来添加或删除用户。

敏捷 是具有可插拔连接器的OpenID Connect身份(OIDC)和OAuth 2.0提供程序。 Pusher进一步推动了这一步 一些自定义工具,还有一些 其他 帮手 可用的用例略有不同。

4.分离和防火墙化您的etcd集群

etcd存储有关状态和机密的信息,并且是捕鱼大亨网络版的重要组成部分-应该与集群的其余部分不同地保护它。

对API服务器的etcd的写访问权限等同于在整个集群上获得root用户,甚至读访问权限也可以相当容易地用于提升特权。

捕鱼大亨网络版调度程序将在etcd中搜索没有节点的pod定义。然后,它将找到的Pod发送到可用的kubelet进行调度。 API伺服器会先验证提交的Pod,然后再将其写入etcd,因此直接写入etcd的恶意用户可以绕过许多安全机制,例如PodSecurityPolicies。

etcd应该配置为 对等和客户端TLS证书,并部署在专用节点上。为了避免私钥从工作节点被窃取和使用,还可以将群集防火墙连接到API服务器。

5.旋转加密密钥

一种安全性最佳实践是定期旋转加密密钥和证书,以限制密钥泄露的“爆炸半径”。

捕鱼大亨网络版将 自动旋转一些证书 (特别是kubelet客户端和服务器证书),方法是在现有凭据过期时创建新的CSR。

然而 对称加密密钥 API服务器用于加密etcd值的值不会自动旋转-必须 手动旋转。为此,需要具有主访问权限,因此托管服务(例如GKE或AKS)会向操作员抽象此问题。

第二部分:工作量

通过在控制平面上提供最小可行的安全性,集群可以安全地运行。但是,就像运送潜在危险货物的船舶一样,如果发生意外事故或违约,则必须保护船舶的集装箱以容纳该货物。 捕鱼大亨网络版工作负载(pod,部署,作业,集合等)也是如此-在部署时它们可能会受到信任,但是如果它们面向Internet,则总是存在以后被利用的风险。以最小的特权运行工作负载并强化其运行时配置可以帮助减轻这种风险。

6.使用Linux安全功能和PodSecurityPolicies

Linux内核具有许多重叠的安全扩展(功能,SELinux,AppArmor,seccomp-bpf),这些扩展可以配置为向应用程序提供最小特权.

像这样的工具 祸根 可以帮助生成AppArmor配置文件,以及 码头工人 适用于seccomp配置文件,但请注意-一个全面的测试套件,在验证应用这些策略的副作用时,需要在应用程序中使用所有代码路径。

PodSecurityPolicies 可用于强制使用安全扩展和其他捕鱼大亨网络版安全指令。它们提供了Pod必须履行的最低合同,才能提交给API服务器-包括安全配置文件,特权标志以及主机网络,进程或IPC名称空间的共享。

这些指令非常重要,因为它们有助于防止容器化进程逃离其隔离边界,并且 蒂姆·阿克莱尔示例PodSecurityPolicy 是可以根据用例进行自定义的综合资源。

7.静态分析YAML

如果PodSecurityPolicies拒绝访问API服务器,则还可以在开发工作流中使用静态分析来对组织的合规性要求或风险偏好进行建模。

敏感信息不应存储在Pod类型的YAML资源(部署,Pod,集合等)中,敏感configmap和机密信息应使用诸如 跳马 (与CoreOS的运营商合作), git-crypt, 密封的秘密, 要么 云提供商KMS.

YAML配置的静态分析可用于为运行时安全性建立基准。 库贝塞克 生成资源的风险评分:

{
  "score": -30,
  "scoring": {
    "critical": [{
      "selector": "containers[] .securityContext .privileged == true",
      "reason": "Privileged containers can allow almost completely unrestricted host access"
    }],
    "advise": [{
      "selector": "containers[] .securityContext .runAsNonRoot == true",
      "reason": "Force the running image to run as a non-root user to ensure least privilege"
    }, {
      "selector": "containers[] .securityContext .capabilities .drop",
      "reason": "Reducing kernel capabilities available to a container limits its attack surface",
      "href": "/docs/tasks/configure-pod-container/security-context/"
    }]
  }
}

kubetest 是用于捕鱼大亨网络版配置的单元测试框架:

#// vim: set ft=python:
def test_for_team_label():
    if spec["kind"] == "Deployment":
        labels = spec["spec"]["template"]["metadata"]["labels"]
        assert_contains(labels, "team", "should indicate which team owns the deployment")

test_for_team_label()

这些工具“左移”(在开发周期的较早阶段进行检查和验证)。在开发阶段的安全测试为用户提供了有关代码和配置的快速反馈,这些反馈可能在以后的手动或自动检查中被拒绝,并且可以减少引入更安全的做法的麻烦。

8.以非root用户身份运行容器

以root用户身份运行的容器通常具有比其工作负载所需的权限更多的权限,这在受到威胁的情况下可以帮助攻击者进一步进行攻击。

容器仍然依赖于传统的Unix安全模型(称为 自由访问控制 或DAC)-一切都是文件,并且向用户和组授予权限。

用户名称空间未在捕鱼大亨网络版中启用。这意味着容器的用户ID表映射到主机的用户表,并且以容器内的root用户身份运行进程,并以root身份在主机上运行该进程。尽管我们具有分层的安全机制来防止容器突破,但是仍然不建议在容器内部以root用户身份运行。

许多容器映像使用root用户运行PID 1-如果该进程被破坏,攻击者在容器中具有root用户,并且任何错误配置都变得更容易利用。

Bitnami已经做了很多工作 将其容器图像移动到 非root用户 (尤其是默认情况下OpenShift要求此操作),这可以简化向非根容器映像的迁移。

此PodSecurityPolicy代码段可防止以root用户身份在容器内运行进程,并阻止将进程升级为root用户:

# Required to prevent escalations to root.
allowPrivilegeEscalation: false
runAsUser:
  # Require the container to run without root privileges.
  rule: 'MustRunAsNonRoot'

非根容器不能绑定到1024以下的特权端口(这由CAP_NET_BIND_SERVICE内核功能控制),但是可以使用服务来掩盖这一事实。在此示例中,虚构的MyApp应用程序绑定到其容器中的端口8443,但是服务通过将请求代理到targetPort来在443上公开它:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 443
    targetPort: 8443

在用户命名空间可用或正在进行的工作要继续进行之前,必须以非root用户身份运行工作负载不会改变。 无根运行容器 登陆容器运行时。

9.使用网络策略

默认情况下,捕鱼大亨网络版网络允许所有Pod到Pod的流量;可以使用 网络政策 .

传统服务受到防火墙的限制,防火墙对每种服务使用静态IP和端口范围。由于这些IP很少更改,因此历史上一直将它们用作身份的一种形式。容器很少具有静态IP-它们被构建为快速失效,快速重新安排,并使用服务发现而不是静态IP地址。这些属性意味着防火墙变得更加难以配置和检查。

由于捕鱼大亨网络版将其所有系统状态存储在etcd中,因此可以配置动态防火墙-如果CNI网络插件支持的话。 Calico,Cilium,kube-router,Romana和Weave Net均支持网络策略。

应该注意的是,这些策略失败关闭了,因此这里没有podSelector时默认为通配符:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector:

这是一个示例NetworkPolicy,它拒绝除UDP 53(DNS)之外的所有出口,这也阻止了到应用程序的入站连接。 NetworkPolicies是有状态的,因此对出站请求的回复仍会到达应用程序。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: myapp-deny-external-egress
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Egress
  egress:
  - ports:
    - port: 53
      protocol: UDP
  - to:
    - namespaceSelector: {}

捕鱼大亨网络版网络策略无法应用于DNS名称。这是因为DNS可以将循环解析为多个IP,也可以基于调用IP动态地解析,因此网络策略只能应用于固定IP或podSelector(对于动态捕鱼大亨网络版 IP)。

最佳实践是从拒绝命名空间的所有流量开始,并逐步添加路由以允许应用程序通过其接受测试套件。这可能会变得很复杂,因此ControlPlane被一起砍掉了 网络断言 -具有高度并行化的nmap的DevSecOps工作流程的网络安全测试:

k8s: # used for 捕鱼大亨网络版 pods
  deployment: # only deployments currently supported
    test-frontend: # pod name, defaults to `default` namespace
      test-microservice: 80  # `test-microservice` is the DNS name 的  the target service
      test-database: -80     # `test-frontend` should not be able to access test-database’s port 80
      169.254.169.254: -80, -443           # AWS metadata API
      metadata.google.internal: -80, -443  # GCP metadata API

    new-namespace:test-microservice:  # `new-namespace` is the namespace name
      test-database.new-namespace: 80 # longer DNS names can be used for 其他 namespaces
      test-frontend.default: 80
      169.254.169.254: -80, -443           # AWS metadata API
      metadata.google.internal: -80, -443  # GCP metadata API

云提供商的元数据API一直是升级的源泉(​​如最近 Shopify 错误赏金 演示),因此通过特定测试来确认API在容器网络上已被阻止,有助于防止意外配置错误。

10.扫描图像并运行IDS

Web服务器向它们所连接的网络提供了攻击面:扫描映像的已安装文件可确保不存在攻击者可以利用以获取对容器的远程访问的已知漏洞。 IDS(入侵检测系统)会检测到它们。

捕鱼大亨网络版允许通过一系列的Pod进入集群 准入控制器 闸门,适用于Pod和其他资源(如部署)。这些门可以验证每个Pod的入场权限或更改其内容,并且它们现在支持后端Webhooks。

容器图像扫描工具可以使用这些webhooks来验证图像,然后再将它们部署到群集中。没有通过检查的图像可以被拒绝进入。

扫描容器映像中的已知漏洞可以减少攻击者可以利用已公开CVE的时间范围。免费工具,例如CoreOS的 克莱尔 和水族的 微型扫描仪 应该在部署管道中使用,以防止部署具有严重可利用漏洞的映像。

诸如 格拉菲亚斯 可以存储图像元数据,以针对容器的唯一签名进行持续的合规性和漏洞检查( 内容可寻址 哈希)。这意味着扫描具有该哈希值的容器映像与扫描生产环境中部署的映像相同,并且可以连续进行而无需访问生产环境。

未知的零日漏洞将始终存在,因此入侵检测工具(例如 扭锁, 水色Sysdig安全 应该部署在捕鱼大亨网络版中。 IDS检测到容器中的异常行为并将其暂停或杀死- Sysdig的Falco 是一个开源规则引擎,也是该生态系统的切入点。

第三部分:未来

安全的“云原生进化”的下一阶段似乎是服务网格,尽管采用可能需要时间-迁移涉及将复杂性从应用程序转移到网格基础架构,并且组织将渴望了解最佳实践。

11.运行服务网格

服务网格是加密的持久性连接的网络,它是在Envoy和Linkerd等高性能“ sidecar”代理服务器之间建立的。它增加了流量管理,监视和策略-所有这些都无需更改微服务。

通过以下方式,已经可以将微服务安全性和网络代码卸载到经过测试的共享库中: Linkerd,并介绍 伊斯蒂奥 由Google,IBM和Lyft共同开发的产品在此领域添加了替代方案。除了 特殊规格 用于每个Pod的加密身份和大量 其它功能,Istio可以简化下一代网络安全性的部署。

在“零信任”网络中,可能不需要传统的防火墙或捕鱼大亨网络版网络策略,因为每个交互都通过mTLS(相互TLS)进行,从而确保双方不仅安全地通信,而且两个服务的身份都是已知的。

从传统网络到Cloud Native安全原则的这一转变对于我们具有传统安全思想的人来说并不是一件容易的事,并且 零信任网络书 来自SPIFFE的 埃文·吉尔曼 强烈建议您介绍这个勇敢的新世界。

伊斯蒂奥 0.8磅 已经发布,该项目正在迅速接近1.0版本。它的稳定性版本与捕鱼大亨网络版模型相同:一个稳定的核心,各个API在自己的alpha / beta稳定性名称空间下标识自己。预计在接下来的几个月中,Istio的采用率会上升。

结论

Cloud Native应用程序具有一组更细粒度的轻量级安全性原语,以锁定工作负载和基础架构。这些工具的强大功能和灵活性既是福也是祸-由于自动化程度不足,暴露不安全的工作负载变得更加容易,这些工作负载允许从容器或其隔离模型中突围。

防御工具比以往任何时候都多,但是必须谨慎以减少攻击面和潜在的配置错误。

但是,如果安全性减慢了组织功能交付的速度,那么它将永远不是一流的公民。将持续交付原则应用于软件供应链可以使组织在不影响业务底线的情况下实现合规性,连续审核和强制执行的治理。

如果有全面的测试套件支持,则在安全性上进行快速迭代是最容易的。这可以通过持续安全性(时间点渗透测试的替代方法)来实现,持续不断的管道验证可确保了解组织的攻击面,并不断了解和管理风险。

这是ControlPlane的作案手法:如果我们可以帮助启动持续安全性学科,提供捕鱼大亨网络版安全和操作培训,或者为您共同实施安全的云原生发展,请 保持联系.


安德鲁·马丁(Andrew Martin)是以下公司的联合创始人 @controlplaneio 和有关云原生安全性的推文 @sublimino