首页 > 数据库 > 数据库开发技术 > Polaris:快速验证集群是否遵循最佳安全实践
点击上方蓝字 👆关注【云原生百宝箱】公众号,别让消息溜走
后台回复【加群】,与牛人互动不停
Kubernetes 是一个非常强大的软件部署平台。它提供的灵活性水平几乎可以适应任何用例,无论多么独特。这就是超过一半的财富 500 强企业采用 Kubernetes 的原因。根据 Dimensional Research 和 VMware 的一项研究《2020 年Kubernetes 现状报告》[1],K8s 的采用率从 2018 年的 27% 大幅飙升至 2020 年的 48% 。
但与所有工具一样,在功能和安全性之间存在自然的权衡。配置 Kubernetes 及其运行的工作负载的方法有数百万种,但其中 99% 都是危险的。很容易引入安全性、效率或可靠性问题——通常只是因为忘记在 YAML 配置中指定特定字段。
为了解决这个问题,社区提出了一套用于配置 Kubernetes 工作负载的 Kubernetes 最佳实践。这些是应该始终遵循的准则,除非你有充分的理由不这样做。 Fairwinds 的 Polaris 项目的[2] 诞生是为了帮助定义和实施这些最佳实践。
Polaris是一款针对Kubernetes的开源安全策略引擎,可以帮助广大研究人员通过验证和修复Kubernetes的资源配置,来审查Kubernetes集群是否遵循了最佳安全实践。
当前版本的Polaris包含了30多种内置的配置策略,并且能够使用JSON Schema构建自定义策略。如果你通过命令行或Webhook运行Polaris的话,Polaris则可以根据策略标准自动修复问题。
Polaris支持下列三种运行模式:
1、仪表盘模式[3]:根据“策略即代码”来验证Kubernetes资源安全态势;
2、准入控制器模式[4]:自动拒绝或修改不符合组织策略的工作负载;
3、命令行工具[5]:将策略作为代码纳入CI/CD流程,以测试本地YAML文件;
Polaris仪表盘可以使用kubectl或Helm安装在集群上。它也可以在本地运行,并使用存储在KUBECONFIG中的凭据连接到集群。
需要注意的是,仪表盘是了解集群或“代码基础结构”中哪些工作负载不符合最佳实践的好方法。
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 run -d -p8080:8080 -v ~/.kube/config:/opt/app/config:ro quay.io/fairwinds/polaris:1.2 polaris dashboard --kubeconfig /opt/app/config
Polaris仪表板可以简单直观地了解Kubernetes工作负载的当前状态,以及可以改进的路线图。仪表板提供了集群范围的概述,以及按类别、命名空间和工作负载划分结果:
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 配置。但有几个字段未指定,可能会导致严重问题。
首先,重要的是告诉 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 检查上述所有问题以及更多问题。它带有几十项内置检查。随着用户提交反馈并且社区学习新的更好的配置工作负载的方法,检查会不断添加到我们的库中。
我们的每项检查都是在 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
原文作者:云原生AI百宝箱;如有侵权,请联系管理员删除。