Kubernetes安全加固的一些实用建议

目录
  • 前言
  • 集群设置和加固
    • 准则如下:
  • 网络和资源策略
  • RBAC和服务账户
  • 系统加固
  • 供应链安全
  • 监控、日志和运行时安全
  • 总结

前言

随着更多的组织开始拥抱云原生技术,Kubernetes已成为容器编排领域的行业标准。向 Kubernetes转变的这股潮流,很大程度上简化了容器化应用程序的部署、扩展和管理,并实现了自动化,为传统的单体式系统提供了胜于传统管理协议的众多优势。

然而,管理大规模的Kubernetes带来了一系列独特挑战,包括加固集群、保护供应链以及运行时检测威胁。本文结合云原生计算基金会(CNCF)、美国国家安全局(NSA)以及网络安全和基础设施安全局(CISA)的诸多最佳实践,整理出Kubernetes安全加固的6个建议,帮助组织降低风险。

集群设置和加固

保护Kubernetes环境从加固集群开始。对于使用托管Kubernetes服务(比如GKE、EKS或AKS)的用户而言,由相应的云提供商管理主节点安全,并为集群实施各种默认安全设置。GKE Autopilot采取了额外措施,实施GKE加固准则和GCP安全最佳实践。但即使对于GKE Standard或EKS/AKS用户而言,云提供商也有一套准则,以保护用户对Kubernetes API服务器的访问、对云资源的容器访问以及Kubernetes升级。

准则如下:

  • GKE加固指南
  • EKS安全最佳实践指南
  • AKS集群安全

至于自我管理的Kubernetes集群(比如kube-adm或kops),kube-bench可用于测试集群是否符合CIS Kubernetes Benchmark中规定的安全准则。主要的建议包括:加密存储在静态etcd中的机密信息、使用TLS证书保护控制平面通信以及开启审计日志功能。

网络和资源策略

默认情况下,Kubernetes允许从任何pod到同一集群中另一个pod的通信。虽然这对于发现服务而言很理想,但没有提供网络分离,不法分子或中招的系统可以无限制地访问所有资源。如果团队使用命名空间作为Kubernetes内部多租户的主要手段,这就成为非常严重的问题。

为了控制pod、命名空间和外部端点之间的流量,应使用支持NetworkPolicy API的CNI插件(比如Calico、Flannel或针对特定云的CNI),用于网络隔离。遵照零信任模型,最佳实践是实施默认一概拒绝的策略,阻止所有出入流量,除非另一项策略特别允许。

除了网络策略外,Kubernetes还提供两个资源级别的策略:LimitRange和ResourceQuotas。LimitRanges可用于限制单个资源的使用(如每个pod最多有2个CPU),而ResourceQuota控制聚合资源的使用(如在dev命名空间中总共有20个CPU)。

RBAC和服务账户

强大的网络和资源策略到位后,下一步是强制执行RBAC授权以限制访问。Kubernetes管理员可以对用户和用户组强制执行RBAC以访问集群,以及限制服务访问集群内外的资源(如云托管的数据库)。另外,企业使用创建时挂载到每个pod的默认服务账户时须谨慎。pod可能被授予过大的权限,这取决于授予默认服务账户的权限。如果不需要与Kubernetes服务进行任何特定的通信,将automountServiceAccountToken设置为false,以防止挂载。

系统加固

鉴于集群已安全,下一步是尽量缩小系统的攻击面。这适用于节点上运行的操作系统以及容器上的内核。选择为运行容器而优化的专用操作系统,如AWS Bottlerocket或GKE COS,而不是选择通用的Linux节点。接下来,充分利用Linux内核安全功能,如SELinux、AppArmor(自1.4起是测试版)及/或seccomp(自1.19起是稳定版)。AppArmor为Linux用户或用户组定义了将程序限制于一组有限资源的权限。一旦定义了AppArmor配置文件,带有AppArmor标注的pod将强制执行这些规则。

apiVersion:   v1
kind:   Pod
metadata:
        name: apparmor
        annotations:
                 container.apparmor.security.beta.kubernetes.io/hello:   localhost/k8s-apparmor-example-deny-write
spec:
        containers:
        - name: hello
            image: busybox
            command: [ "sh", "-c", "echo 'Hello   AppArmor!' && sleep 1h" ]

另一方面,Seccomp限制容器的系统调用。只要底层Kubernetes节点上有seccomp配置文件可用,就可以在securityContext这部分定义seccomp配置文件。

apiVersion: v1
kind: Pod
metadata:
  name: audit-pod
  labels:
        app: audit-pod
spec:
  securityContext:
        seccompProfile:
                 type: Localhost
                 localhostProfile: profiles/audit.json
  containers:
  - name: test-container
       image: hashicorp/http-echo:0.2.3
       args:
        - "-text=just made some syscalls!"

即使没有seccomp配置文件,用户仍然可以限制容器免受各种权限提升攻击。在安全上下文中,Kubernetes允许配置容器是否可以以特权或root身份来运行,或者将权限升级到root。用户还可以限制hostPID、hostIPC、hostNetwork和hostPaths。所有这些设置都可以通过Pod Security Policy(v1.21中已被弃用)或使用其他开源工具(比如K-Rail、Kyverno和OPA/Gatekeeper)来执行。

最后,如果需要额外的安全保证,可以配置自定义的RuntimeClass,以便充分利用硬件虚拟化(如gVisor或Kata)。在节点层面定义RuntimeClass,并在pod定义部分指定它。

apiVersion:   node.k8s.io/v1 # RuntimeClass is defined in the node.k8s.io API group
kind:   RuntimeClass
metadata:
  name: myclass # The name the RuntimeClass   will be referenced by
  # RuntimeClass is a non-namespaced resource
handler:   myconfiguration # The name of the corresponding CRI configuration
---
apiVersion:   v1
kind:   Pod
metadata:
  name: mypod
spec:
  runtimeClassName: myclass

供应链安全

即使集群和系统安全,为保证整个应用程序的端到端安全,也必须考虑到供应链。若是内部开发的应用程序,请遵循创建容器的最佳实践,即使用最小基础镜像以减小攻击面、固定软件包版本,并使用多阶段构建以创建小镜像。此外,定义容器运行所需的非root用户,或使用podman构建无root容器,以限制root访问。

下一步,使用开源工具(如Trivy、Clair或Anchore)或者商用工具扫描所有镜像,以查找漏洞。一些工具还允许对镜像进行签名和验证签名,以确保容器在构建和上传过程中未被篡改。最后,定义Kubernetes可以使用ImagePolicyWebhook或上面提到的任何策略执行工具从中提取镜像的白名单注册表。

监控、日志和运行时安全

至此,我们有了一个供应链严加保护的安全集群,可以生成干净的、经过验证的镜像,有限的访问权限。然而环境是动态的,安全团队需能够响应运行环境中的事件。首先,将readOnlyRootFilesystem设置为true,并将tmp日志文件存储到emptyDir,以此确保容器在运行时不变。除了典型的应用程序监控(如Prometheus/Grafana)或日志(如EFK)存储外,还可以使用Falco或Sysdig来分析系统调用进程和Kubernetes API日志。

这两种工具都可以在运行时解析来自内核的Linux系统调用,并在违反规则时触发警报。示例规则包括:权限提升时发出警报,已知目录上检测到读/写事件时发出警报,或调用shell时发出警报。最后,将Kubernetes API审计日志与现有日志聚合和警报工具整合起来,以监控集群中的所有活动。这包括API请求历史记录、性能指标、部署、资源消耗、操作系统调用和网络流量。

总结

由于云原生系统很复杂,需要采用多层方法来保护Kubernetes环境。建议Kubernetes做好云原生安全的4C:云、集群、容器和代码。首先,加固集群,并遵循云安全最佳实践;其次,严加保护容器,减小攻击面,限制访问,并确保运行时不变;再次,保护供应链,分析代码和容器以查找漏洞。最后,监控运行时的所有活动,将防御机制融入Kubernetes内运行的每一层软件中。

(0)

相关推荐

  • 云原生技术kubernetes(K8S)简介

    目录 01 kubernetes是什么? 02 kubernetes和Compost+Swarm之间的区别 03 一点总结 今天我们看看kubernetes技术的介绍,最近在极客时间上看张磊老师的深入kubernetes技术,讲的非常好,有兴趣的同学可以去收听一下,对于理解kubernetes技术非常有帮助,这里我会按照自己的进度,分享一下学习的笔记. 今天站的角度比较高,概念性质的东西会多一点. 01 kubernetes是什么? 曾经我认为这个问题很好回答,直到不断的去理解kubernete

  • Kubernetes(k8s)基础介绍

    之前我一直想学习Kubernetes,因为它听起来很有意思(如果你是希腊人,你会觉得这个名字很有问题),但我从来没有机会,因为我没有任何东西需要运行在集群中.而最近,我的工作中开始逐步涉及Kubernetes相关的事情,所以这次我抓住机会,开始查资料,但后来我发现目前所有的资料(包括官方教程)都过于冗长,结构也不合理,这让我一开始有点沮丧. 经过几天的研究,我开始逐步理解Kubernetes的核心理念,并且把他部署到了生产环境中.因为我的简历现在说自己是个"Kubernetes专家",

  • Kubernetes安全加固的一些实用建议

    目录 前言 集群设置和加固 准则如下: 网络和资源策略 RBAC和服务账户 系统加固 供应链安全 监控.日志和运行时安全 总结 前言 随着更多的组织开始拥抱云原生技术,Kubernetes已成为容器编排领域的行业标准.向 Kubernetes转变的这股潮流,很大程度上简化了容器化应用程序的部署.扩展和管理,并实现了自动化,为传统的单体式系统提供了胜于传统管理协议的众多优势. 然而,管理大规模的Kubernetes带来了一系列独特挑战,包括加固集群.保护供应链以及运行时检测威胁.本文结合云原生计算

  • android布局优化的一些实用建议

    前言 Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一个子集. 本文主要包括以下内容 为什么要进行布局优化及android绘制,布局加载原理 获取布局文件加载耗时的方法 介绍一些布局优化的手段与方法 一些常规优化手段 为什么要进行布局优化? 为什么要进行布局优化?答案是显而易见的,如果布局嵌套过深,或者其他原因导致布局渲染性能不佳,可能会导致应用卡顿 那么布局到底是如何导

  • 提高正则表达式性能的几点实用建议汇总

    目录 为什么正则表达式效率很重要? 低效正则表达式的剖析 真实例子 编写高效正则表达式的指南 考虑故障场景 注意通配符标记的多次重复 不要以通配符重复开始正则表达式 只匹配你真正需要的 试着快速失败 Profile-尤其是故障案例 尽量减少从主机中提取的数据 除非绝对必要,否则不要使用组 考虑正则表达式 TPL触发器的正则表达式优化 索引 试着给点提示 尝试做出独特的提示 总结 当正则表达式通常与大型数据集相匹配时它们的编写必须高效. 为什么正则表达式效率很重要? 虽然写得好的正则表达式可能非常

  • 一文详解基于Kubescape进行Kubernetes安全加固

    目录 正文 Kubernetes 加固概述 通用性的安全建议 Kubescape 概述 Kubescape 基本原理 Kubescape 安装部署 Linux 安装 Kubescape macOS 安装 Kubescape Kubescape 实践 扫描结果分析 常用扫描技巧 正文 Hello folks! 今天我们介绍一款开源容器平台安全扫描工具 - Kubescape.作为第一个用于测试 Kubernetes 集群是否遵循 NSA-CISA 和 MITREATT&CK 等多个框架安全部署规范

  • JavaScript 新手24条实用建议[TUTS+]

    注:本文多次用到Firebug的console对象,请参考Firebug Console API .关于firebug的更详细介绍,请猛击这里.1. 用 === 代替 == JavaScript里有两种不同的相等运算符:===|!== 和==|!=.相比之下,前者更值得推荐.请尽量使用前者. 引用: "如果两个比较对象有着同样的类型和值,===返回true,!==返回false." – JavaScript: The Good Parts不过,如果使用==和!=,在操作不同数据类型时,

  • 对于Python的Django框架使用的一些实用建议

    前言:随着Django1.4第二个候选版的发布,虽然还不支持Python3,但Django团队已经在着手计划中,据官方博客所说,Django1.5将会试验性的支持python3. Django 作为一个杰出的Python开源框架,或许得不到和其它流行框架如Rails这样多的赞美,但是它和其他框架一样精炼,非常注重DRY(Don't Repeat Yoursef)原则.组件的重用性,通过自动化过程使编码更简洁. 如果在Django项目中能够灵活使用某些方法和技巧的话,它将大大加快软件开发的速度同时

  • 新手入门Python编程的8个实用建议

    前言 我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑踩过的雷总结出来的,现在在这里分享一下给大家,因为很多伙伴是接触Python编程入门不久,也希望大家少走弯路,多少有些地方可以给大家借鉴. 目录先放出来 项目文件事先做好归档 永远不要手动修改源数据并且做好备份 做好路径的正确配置 代码必要的地方做好备注与说明 加速你的Python循环代码 可视化你的循环代码进度 使用高效的异常捕获工具 要多考虑代码健壮性 1.

  • 对于Python的Django框架部署的一些建议

    "Django应用.配置文件以及其他各种相关目录的最佳布局是什么样的?" 总是有朋友问我们这个问题,因此我想花一点时间,写一下我们究竟是如何看待这个问题的,这样我们就可以很容易让其他人参照这个文档.请注意,这里是基于 Django 1.7.1 版写的,但是可以很容易应用在 Django 1.4 版之后任何版本. 虽然 Django 1.4 发布时,它包含了一个改进后的项目布局(这还用了很长一段时间),但本文有一些优化项目布局的更好建议. 为什么这种布局比较好 我们在这里推荐的项目布局有

  • Java 常见异常(Runtime Exception )详细介绍并总结

    本文重在Java中异常机制的一些概念.写本文的目的在于方便我很长时间后若是忘了这些东西可以通过这篇文章迅速回忆起来. 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果.这样做有如下的弊端:例如函数返回-1代表出现异常

  • 分享jQuery封装好的一些常用操作

    1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 $(document).ready(function() { $("input.text1").val("Enter your search text here"); textFill($('input.text

随机推荐