ITPub博客

首页 > 数据库 > 数据库开发技术 > Polaris:快速验证集群是否遵循最佳安全实践

Polaris:快速验证集群是否遵循最佳安全实践

原创 数据库开发技术 作者:云原生AI百宝箱 时间:2023-10-30 22:35:49 0 删除 编辑

点击上方蓝字 👆关注【云原生百宝箱】公众号,别让消息溜走

后台回复【加群】,与牛人互动不停



Kubernetes 是一个非常强大的软件部署平台。它提供的灵活性水平几乎可以适应任何用例,无论多么独特。这就是超过一半的财富 500 强企业采用 Kubernetes 的原因。根据 Dimensional Research 和 VMware 的一项研究《2020 年Kubernetes 现状报告》[1],K8s 的采用率从 2018 年的 27% 大幅飙升至 2020 年的 48% 。

但与所有工具一样,在功能和安全性之间存在自然的权衡。配置 Kubernetes 及其运行的工作负载的方法有数百万种,但其中 99% 都是危险的。很容易引入安全性、效率或可靠性问题——通常只是因为忘记在 YAML 配置中指定特定字段。

为了解决这个问题,社区提出了一套用于配置 Kubernetes 工作负载的 Kubernetes 最佳实践。这些是应该始终遵循的准则,除非你有充分的理由不这样做。 Fairwinds 的 Polaris 项目的[2] 诞生是为了帮助定义和实施这些最佳实践。

关于Polaris

Polaris是一款针对Kubernetes的开源安全策略引擎,可以帮助广大研究人员通过验证和修复Kubernetes的资源配置,来审查Kubernetes集群是否遵循了最佳安全实践。

当前版本的Polaris包含了30多种内置的配置策略,并且能够使用JSON Schema构建自定义策略。如果你通过命令行或Webhook运行Polaris的话,Polaris则可以根据策略标准自动修复问题。

工具特性

Polaris支持下列三种运行模式:

1、仪表盘模式[3]:根据“策略即代码”来验证Kubernetes资源安全态势;

2、准入控制器模式[4]:自动拒绝或修改不符合组织策略的工作负载;

3、命令行工具[5]:将策略作为代码纳入CI/CD流程,以测试本地YAML文件;

安装Polaris仪表板

Polaris仪表盘可以使用kubectl或Helm安装在集群上。它也可以在本地运行,并使用存储在KUBECONFIG中的凭据连接到集群。

需要注意的是,仪表盘是了解集群或“代码基础结构”中哪些工作负载不符合最佳实践的好方法。

Helm安装

helm repo add fairwinds-stable https://charts.fairwinds.com/stable

helm upgrade --install polaris fairwinds-stable/polaris --namespace polaris --create-namespace

kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80

本地代码安装

首先,你需要一个有效的KUBECONFIG来设置仪表盘并连接到你的集群。

广大研究人员可以直接访问该项目的【Releases页面[6]】来下载最新的代码发布版本,或使用【Homebrew[7]】安装:

brew tap reactiveops/tap

brew install reactiveops/tap/polaris

polaris dashboard --port 8080

我们还可以将仪表盘指向本地文件系统:

polaris dashboard --port 8080 --audit-path=./deploy/

本地Docker容器安装

docker run -d -p8080:8080 -v ~/.kube/config:/opt/app/config:ro  quay.io/fairwinds/polaris:1.2 polaris dashboard --kubeconfig /opt/app/config

使用Polaris仪表板

Polaris仪表板可以简单直观地了解Kubernetes工作负载的当前状态,以及可以改进的路线图。仪表板提供了集群范围的概述,以及按类别、命名空间和工作负载划分结果:

Polaris的默认标准是非常高的,所以如果你的分数低于你的预期,请不要感到惊讶。

Polaris的一个关键目标是设定一个高标准,并在默认情况下实现出色的配置。如果我们包含的默认值过于严格,那么很容易将配置作为部署配置的一部分进行调整,以更好地适应你的工作负载。

Polaris示例

下面是一个 Kubernetes 部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

你能说出它出了什么问题吗?可能不会,除非你非常熟悉 Kubernetes 配置。但有几个字段未指定,可能会导致严重问题。

CPU 和内存设置

首先,重要的是告诉 Kubernetes 你的应用程序预计使用多少内存和 CPU。这使得 Kubernetes 能够有效地将你的工作负载打包到运行它们的节点上,并在应用程序出现异常(例如,由于内存泄漏)时提供指导。

更好的容器规范如下所示:

      containers:
      - name: nginx
        image: nginx:1.14.2
        resources:
          requests:
            memory: 512MB
            cpu: 500m
          limits:
            memory: 1GB
            cpu: 1000m

健康探针

上面的示例还缺少 Liveness 和 Readiness Probes。这些设置告诉 Kubernetes 如何检查你的应用程序是否正常并准备好提供流量。如果没有 Liveness Probe,如果你的应用程序冻结,Kubernetes 将无法自我修复;如果没有Readiness Probe,它可能会将流量定向到尚未完全准备就绪的 Pod。

Liveness 和 Readiness Probes 需要一些特定于应用程序的知识,但通常会轮询特定的 HTTP 端点或运行 Unix 命令来测试应用程序是否正确响应。例如:

      containers:
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080

安全强化

许多 Kubernetes 工作负载设置默认情况下是不安全的——它们倾向于授予应用程序权限来执行它可能需要或不需要的操作。

例如,默认情况下每个容器都会安装一个可写的根文件系统,这可以使攻击者能够替换系统二进制文件或修改配置。

更安全的容器配置如下所示:

      containers:
      - name: nginx
        image: nginx:1.14.2
        securityContext:
          allowPrivilegeEscalation: false
          privileged: false
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          capabilities:
            drop:
              - ALL

Polaris 如何提供帮助

Polaris 检查上述所有问题以及更多问题。它带有几十项内置检查。随着用户提交反馈并且社区学习新的更好的配置工作负载的方法,检查会不断添加到我们的库中。

我们的每项检查都是在 JSON Schema 中定义的。

最简单的检查只需要几行配置:

successMessage: Host network is not configured
failureMessage: Host network should not be configured
category: Security
target: Pod
schema:
  '$schema': http://json-schema.org/draft-07/schema
  type: object
  properties:
    hostNetwork:
      not:
        const: true

但我们也可以利用 JSON Schema 和 Go Templates 的全部功能来创建一些相当复杂的检查。你可以查看 Polaris 文档,[8] 了解有关如何编写自己的自定义 Polaris 检查的更多信息,如果你的组织有自己的内部策略和想要执行的最佳实践,这将非常有用。

其他资料

  • • Goldilocks[9] - 通过将内存和 CPU 设置与实际使用情况进行比较来调整 Kubernetes Deploy资源的大小

  • • Polaris[10] - 审核、执行和构建 Kubernetes 资源策略,包括 20 多项内置最佳实践检查

  • • Pluto[11] - 检测未来版本中已弃用或删除的 Kubernetes 资源

  • • Nova[12] - 检查你的 Helm 图表是否有可用更新

  • • rbac-manager[13] - 简化 Kubernetes 集群中 RBAC 的管理

引用链接

[1] Kubernetes 现状报告: https://k8s.vmware.com/state-of-kubernetes-2020/
[2] Fairwinds 的 Polaris 项目的: https://github.com/FairwindsOps/polaris
[3] Polaris仪表盘模式: https://polaris.docs.fairwinds.com/dashboard
[4] Polaris准入控制器模式: https://polaris.docs.fairwinds.com/admission-controller
[5] Polaris命令行工具: https://polaris.docs.fairwinds.com/infrastructure-as-code
[6] Polaris Releases页面: https://github.com/fairwindsops/polaris/releases
[7] Polaris Homebrew: https://brew.sh/
[8] Polaris 文档,: https://polaris.docs.fairwinds.com/customization/custom-checks/
[9] Goldilocks: https://github.com/FairwindsOps/Goldilocks
[10] Polaris: https://github.com/FairwindsOps/Polaris
[11] Pluto: https://github.com/FairwindsOps/Pluto
[12] Nova: https://github.com/FairwindsOps/Nova
[13] rbac-manager: https://github.com/FairwindsOps/rbac-manager


- END -




推荐阅读


原文作者:云原生AI百宝箱;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-06-25

  • 博文量
    70
  • 访问量
    34375