安全风险概述
构建时:基于安全的镜像仓库、权限最小化的安全镜像构建业务系统,及时修复已知漏洞。
部署时:按照K8s最佳实践部署,修复错误配置。
K8s安全体系
基础架构安全:基于CIS kubernetes benchmark指导安全部署;依赖K8s的安全体系,建立细粒度的访问控制机制。
可信软件供应链:通过镜像扫描发现已知安全漏洞;通过镜像签名保障镜像来源的安全性及不被篡改;通过DevSecOps集成,实现安全左移,与开发、测试、运维等质量动作进行深度融合。
运行时安全:通过PodSecurityPolicy针对容器部署时进行安全校验,有效约束应用运行时的行为安全;应用运行时的安全配置巡检;持续的无处不在的运行时安全监控机制和异常事件告警通知机制,保证安全事件的及时发现及解决;选用安全沙箱,提供更强的隔离环境。
K8s信任边界
容器镜像:主要涉及到的安全攻击点就是镜像仓库和镜像本身。其中,使用了不受信任的镜像仓库或被篡改的容器镜像会导致恶意代码被执行。
K8s控制平面:涉及K8s 的 API Server、scheduler 和 controller-manager核心组件等。其中API Server为K8s系统管控入口,是重点的攻击对象。另外,核心组件之间调用链的安全也同样重要。
K8s数据平面:涉及Ingress Controller跟Service,Ingress作为内部服务对外暴露的端口,被攻击风险较大。
节点上运行时安全:涉及kubelet、kube-proxy 和容器运行时环境,需要避免运行时容器越权或容器逃逸等风险。
安全数据源
控制面组件,例如 Scheduler,各种 Controller,Api Server 自身。
节点上的各种 Agent,例如 Kubelet、Kube-proxy 等。
集群的其它服务,例如 Coredns、Ingress-controller、各种第三方的 Operator 等。
外部用户,例如运维人员通过 Kubectl。
当前/历史上集群发生了哪些变更事件。
这些变更操作者是谁,是系统组件还是用户,是哪个系统组件/用户。
重要变更事件的详细内容是什么,比如修改了POD中的哪个参数。
事件的结果是什么,成功还是失败。
操作用户来自哪里,集群内还是集群外。
对系统中的异常事件做实时告警,例如Failed、Evicted、FailedMount、FailedScheduling等。
通常问题排查可能要去查找历史数据,因此需要去查询更长时间范围的事件(几天甚至几个月)。
事件支持归类统计,例如能够计算事件发生的趋势以及与上一时间段(昨天/上周/发布前)对比,以便基于统计指标进行判断和决策。
支持不同的人员按照各种维度去做过滤、筛选。
支持自定义的订阅这些事件去做自定义的监控,以便和公司内部的部署运维平台集成。
基础服务问题:NTP服务未启动。
硬件问题:CPU、内存、磁盘、网卡损坏Kernel问题:Kernel hang,文件系统损坏。
容器运行时问题:Docker hang,Docker无法启动。
网站访问的PV、UV;
访问的地域分布、设备端分布;
网站访问的错误比例;
后端服务的响应延迟;
不同URL访问分布。
容器内运行的 Shell
服务器进程产生意外类型的子进程
敏感文件读取(如 /etc/shadow)
非设备文件写入至 /dev
系统的标准二进制文件(如 ls)产生出站流量
安全数据类型包含了日志、指标、事件。
安全数据可能是来自文件,也有可能来自标准输出或者标准错误,甚至可能是Syslog等标准协议。
安全文本数据可能会存在于容器内的文件或者宿主机上的文件。
Ingress访问日志等涉及数据面流量的日志往往会数据量极大。
审计日志作为集群安全审计的必备日志,重要性极高,需要长时间跨度存储(等保2.0要求至少需要存180天),并且不能有采集的丢失。
容器运行时支持的全面性,可以支持Docker、Containerd等运行时。
K8s提供了强大的动态扩缩容能力,但也同时给数据采集带了困难。因此,采集器需要适应容器动态的特点。
有些安全数据是通过Job触发的,该类任务具有生命周期短的特点,采集器需要提供短生命周期容器的采集能力。
所采集需要具备关联K8s上下文的能力,为后续分析提供便捷。
强大的数据处理能力,可以在不影响性能的前提下完成安全数据的处理需求,为后续分析场景打下基础。
K8s云上托管服务越来越流行,需要能够支持云上服务的采集场景。
K8s采集技术
iLogtail主体部分通过C++,插件部分Golang实现,不管内存还是CPU具有天然的性能优势。
iLogtail也持续针对性的做了很多特定场景的优化,比如针对日志的极简、Json、正则模式采集提供了C++加速能力,极大提升了日志采集效率,单核采集流量最高能到百M/s。
iLogtail作为阿里集团内重要的可观测数据采集基础设施,多年来一直稳定支持双11等大促场景,在应对网络拥塞、流量洪峰、进程重启等方面表现突出。
公有云上iLogtail也持续支持着各行各业的客户,众多复杂业务场景对于iLogtail的可靠性提供了足够的场景支持。
iLogtail实现如此高吞吐的秘诀之一是使用了无锁化事件处理模型。与业界其他开源Agent为每个配置分配独立线程/Goroutine读取数据不同,iLogtail数据的读取只配置了一个线程。由于数据读取的瓶颈并不在于计算而是磁盘,单线程足以完成所有配置的事件处理以及数据读取。使用单线程使得iLogtail的事件处理和数据读取都可以在无锁环境下运行,数据结构更加轻量化,从而取得了相对多线程处理更优的性价比。
文件采集基于inotify与polling相结合的发现机制,既借助了inotify的低延迟与低性能消耗的特点,也通过polling的方式兼顾了运行环境的全面性。
iLogtail提供了业务容器实时动态发现能力,并支持通过K8s元信息(例如Label、环境变量等)进行采集过滤。特别是一些短Job场景,比如一些机器学习的训练任务,生命周期只有几分钟甚至几十秒,也提供了全面的友好的支持。
部署模式上,也支持DaemonsSet、Sidecar等多种模式。
为了更原生的K8s支持,也提供了Operator机制,用户可以通过CRD的方式进行采集配置管理。
上下游生态:通过插件系统的扩展,目前iLogtail已经支持了众多数据源的接入,数据源类型覆盖Log、Metric、Trace,数据源除了文件的采集,还包括了标准协议的支持,例如HTTP、Mysql Binlog、Prometheus、Skywalking、syslog等。数据输出生态也从SLS逐步扩展到Kafka、gPRC等,未来也会支持ClickHouse、ElasticSearch等。
处理能力扩展:iLogtail采用PipeLine的设计,通过Input插件采集到数据,会经过采集配置中设定的Processor处理,之后经过Aggregator插件打包,最终通过Flusher发送到日志存储系统。数据处理环境包含数据切分、字段提取、过滤、数据增强等环节,所有插件可以自由组合。此外,针对于正则、Json、分隔符等特定格式,iLogtail还提供了C++加速能力。
快速迭代:开发者也可以根据自己的需求,定制开发相应的插件。因为每个插件相互独立,所以开发者只需要按照接口规范开发即可,入手门槛较低。
iLogtail采用基于时间片的采集调度、多级高低水位反馈队列、事件非阻塞处理、流控/停采策略以及配置动态更新等多项关键技术,融合实现了兼具隔离性、公平性、可靠性、可控性、性价比五大特性的多租户隔离方案。
DaemonSet方式:在K8s的每个node上部署一个iLogtail,由该iLogtail采集节点上所有容器的日志到日志系统。此方式特点是运维简单、资源占用少、支持采集容器的标准输出和文本文件、配置方式灵活,但是在超大集群存在一定的性能瓶颈。
Sidecar方式:一个POD中伴随业务容器运行一个iLogtail容器,用于采集该POD中业务容器产生的日志。此方式特点是多租户隔离性好、性能好,但是资源占用较多。
Deployment方式:当业务容器用PVC挂载日志目录或者需要全局连接API Server获取K8s元数据等场景,可以选择在集群中部署一个单副本的iLogtail Deployment进行数据采集。
容器自动发现与释放:iLogtail通过访问位于宿主机上容器运行时(Docker Engine/ContainerD)的sock获取容器信息,并通过监听Docker Event及增量获取机制,及时感知容器新增与释放。
容器上下文信息获取:包括容器层级信息,例如容器名、ID、挂载点、环境变量、Label;以及K8s层级信息,例如Pod、命名空间、Labels。
容器过滤及隔离性:基于容器上下文信息,提供采集容器过滤能力,可以将不同采集配置应用到不同的采集容器上,既可以保证采集的隔离性,也可以减少不必要的资源浪费。
元信息关联:基于容器上下文信息和容器环境变量,提供在日志中富化K8s元信息的能力。
采集路径发现:根据容器元信息自动识别不同运行时的标准输出格式和日志路径;对于overlay、overlay2的存储驱动,可以根据日志类型及容器运行时自动拼接出采集路径,简单高效。
统一存储分析引擎
安全威胁往往是一个逐步的过程,可能需要几个月或更长的时间才会真正暴露出来。因此,需要提供低成本的存储能力,及强大的长时间跨度数据分析能力。
安全数据来源众多,格式不统一,日志、时序数据都可能涉及。有些安全威胁隐蔽性较强,需要多种数据的联动分析才能发现。因此,需要具备强大的关联分析能力。
我们可以通过标准 SQL 语句对日志进行分析。
还可以通过 PromQL 扩展的 SQL 函数对指标数据进行分析。
还可以通过嵌套查询,对指标数据的分析结果进行再聚合。
此外还可以再通过机器学习函数,给查询和分析赋予 AI 的能力。
智能巡检
原始访问日志存储:当Ingress Controller产生访问请求后,会实时将请求的访问日志推送到用户自身的日志库中,SLS的Logstore具备高可靠、实时索引、自动扩容等功能,保证日志的可靠性和可扩展性。
预聚和:由于原始访问日志量巨大,基于原始日志计算指标性能开销较大,因此我们专门推出了基于访问日志的指标预聚和能力,能够将上百万甚至上亿的访问日志实时聚合成指标类型的时序数据,数据量会降低1-2个数量级,后续的分析与监控可直接基于时序数据进行,大大提高效率。
智能巡检:对于预聚和后的Metrics(指标数据),我们提供了基于机器学习的智能巡检功能,帮助用户自动去检测Ingress的各个维度的指标异常,将异常信息实时展现在时序的图表中,结合实时告警能力及时通知给用户解决。此外后续还会支持异常打标,基于用户反馈的信息进行更加精确的检测。
成本高、查询效率低:对于日志量极大场景,特别如果再加上长时间跨度的因素,会造成存储成本的急剧上升,查询效率往往也很低。
效率低:对于异常现场的定位,需要人工配置各种各样的规则去进行异常的捕获。
时效差:大部分时序数据具有时效性特征。故障、变更都会引起对应指标形态的变化,前一种规则条件下的异常可能在下一时刻是正常状态。
配置难:时序数据形态各异。有突刺变化、折点变化、周期变化等诸多形态,阈值范围也各有不同。对于复杂形态下的异常,规则往往难以配置。
效果差:数据流不断动态变化,业务形态日新月异,固定的规则方法很难在新的业态下起作用,从而产生大量的误报或者漏报。对于异常的程度,不同场景,不同用户,对其容忍的程度不同。在排查问题中,有效异常点捕捉的越多,有助于具体问题的排查;而在告警通知中,高危异常点越少,越有助于提升告警处理的效率。
安全态势
告警与On-Call机制
多渠道:支持短信、语音、邮件、钉钉、企业微信、飞书、Slack等多种通知渠道,同时还支持通过自定义 Webhook 进行扩展。同一个告警,支持同时通过多个渠道、每个渠道使用不同的通知内容进行发送。例如通过语音和钉钉来进行告警通知,既可以保证触达强度,又可以保证通知内容的丰富程度。
动态通知:可以根据告警属性动态分派通知。例如:测试环境的告警,通过短信通知到张三,并且只在工作时间通知;而生产环境的告警,通过电话通知到张三和李四,并且无论何时,都要进行通知。
通知升级:长时间未解决的告警要进行升级。例如某告警触发后,通过短信通知到了某员工,但是该问题长时间未被处理,导致告警一直没有恢复,此时需要通知升级,通过语音的方式通知到该员工的领导。
基于云原生可观测平台构建K8s下的SecOps能力
数据采集层:主要提供安全数据接入能力。其中以iLogtail为最主要的数据采集方式(支持前置的数据处理能力),并且同时支持API方式,兼容众多标准协议,例如OpenTelemetry、Prometheus、Syslog、Kafka等。
统一存储分析层:提供了针对Logs、Metric、Trace、安全事件、Topo等多种数据的存储层,并且在此基础上提供了统一的数据关联分析能力。对于不规则数据,提供了数据加工能力。
智能服务:基于智能告警服务,可以实现安全场景的持续监控及通知响应能力;智能算法服务提供了智能巡检功能可以扩展智能巡检、分析的能力。
上层应用:基于上述三层可以打造属于用户自己的SecOps应用。当然对于ITOps、DevOps、BussinessOPS也是不错的选择。
GitHub: https://github.com/alibaba/ilogtail
社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme
企业版官网:https://help.aliyun.com/document_detail/65018.html
最全Kubernetes审计日志方案:https://developer.aliyun.com/article/686982
Kubernetes可观察性:全方位事件监控:https://developer.aliyun.com/article/745567
零信任策略下云上安全信息与事件管理最佳实践:https://developer.aliyun.com/article/812284
阿里可观测性数据引擎的技术实践:https://developer.aliyun.com/article/814339
阿里 PB 级 Kubernetes 日志平台建设实践:https://developer.aliyun.com/article/704058
Kubernetes 安全风险以及 29 个最佳实践:https://mp.weixin.qq.com/s/aMadv2d3jHPJyV2h42r8sQ
推荐阅读
深入浅出Kubernetes
本书作者是阿里云技术专家。多年操作系统和图形显卡驱动调试和开发经验。目前专注云原生领域,容器集群和服务网格。《深入浅出Kubernetes》分为理论篇和实践篇,12篇技术文章帮你了解集群控制、集群伸缩原理、镜像拉取等理论,一次搞懂6个核心原理吃透基础理论,实现从基础概念的准确理解到上手实操的精准熟练,深入浅出使用Kubernetes!
点击阅读原文查看详情。