使用Falco做K8S环境的HIDS

渗透技巧 3年前 (2021) admin
1,064 0 0

介绍

Falco 由 Sysdig 于 2016 年创建,是第一个作为孵化级项目加入 CNCF 的运行时安全项目。Falco可以对Linux系统调用行为进行监控,提供了lkm 内核模块驱动和eBPF 驱动。Falco的主要功能如下:从内核运行时采集Linux系统调用,提供了一套强大的规则引擎,用于对Linux系统调用行为进行监控,当系统调用违反规则时,会触发相应的告警。

安装文档地址如下:

https://falco.org/docs/getting-started/installation/

curl -s https://falco.org/repo/falcosecurity-3672BA8F.asc | apt-key add -
echo "deb https://download.falco.org/packages/deb stable main" | tee -a /etc/apt/sources.list.d/falcosecurity.list

apt-get update -y
apt-get -y install linux-headers-$(uname -r)
apt-get install -y falco
rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asc
curl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo
yum -y install kernel-devel-$(uname -r)
yum -y install falco

使用Falco做K8S环境的HIDS

Falco规则文件是包含三种类型元素的YAML文件:

Rules 、Macros、Lists

Rules就是生成告警的条件以及一下描述性输出字符串。Macros 是可以在规则或者其他宏中重复使用的规则条件片段。Lists 类似Python 列表,定义了一个变量集合。

Falco 使用了Sysdig, 在rule的 condition里面,任何 Sysdig 过滤器都可以在 Falco 中使用。

参考如下:

https://github.com/draios/sysdig/wiki/sysdig-user-guide#filtering

这是一个rule的 condition条件示例,在容器内运行 bash shell 时发出警报:

container.id != host and proc.name = bash

第一个子句检查事件是否发生在容器中(Sysdig 事件有一个container字段,该字段等于”host”事件是否发生在host主机上)。第二个子句检查进程名称是否为bash。

举个完整的列子

- list: my_programs
items: [ls, cat, bash]

- macro: access_file
condition: evt.type=open

- rule: program_accesses_file
desc: track whenever a set of programs opens a file
condition: proc.name in (my_programs) and (access_file)
output: a tracked program opened a file (user=%user.name command=%proc.cmdline file=%fd.name)
priority: INFO

web应用进程java,php,apache,httpd,tomcat 中运行其他进程falco demo,图片来自,字节沙龙

使用Falco做K8S环境的HIDS


web应用进程java,php,apache,httpd,tomcat 中读取查看敏感文件falco demo,图片来自,字节沙龙

使用Falco做K8S环境的HIDS

下面,我们修改falco 的配置,/etc/falco/falco.yaml

json_output: true
json_include_output_property: true
http_output:
enabled: true
url: "http://localhost:2801"

启动falco

systemctl enable falco  &&  systemctl start falco

https://github.com/falcosecurity/falcosidekick.git

falcosidekick 是一个管道工具,接受 Falco的事件并将它们发送到不同的持久化工具中。我们使用falcosidekick把falco post 过来的数据写入es ,也可以写入kafka。我们也读取kafka里面的东西完成告警, 也可以用 Prometheus 和falco-exporter 完成告警。如下图。

elasticsearch:
hostport: "http://10.10.116.177:9200"
index: "falco"
type: "event"
minimumpriority: ""
suffix: "daily"
mutualtls: false
checkcert: true
username: ""
password: ""


kafka:
hostport: ""
topic: ""
# minimumpriority: "debug"

使用Falco做K8S环境的HIDS

批量部署&更新规则

我们在生产环境中需要批量部署和更新规则需求,所以我们可以使用saltstack 或者 ansible 下发对应shell脚本来完成我们的需求。

批量部署

#!/bin/bash

if [ -n "$(uname -a | grep Ubuntu)" ]; then # 按实际情况修改
curl -s https://falco.org/repo/falcosecurity-3672BA8F.asc | apt-key add -
echo "deb https://download.falco.org/packages/deb stable main" | tee -a /etc/apt/sources.list.d/falcosecurity.list
apt-get update -y
apt-get install -y falco
else
rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asc
curl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo
yum -y install falco
fi

systemctl enable falco && systemctl start falco

批量更新规则

#!/bin/bash

BDATE=`date +%Y%m%d%H%M%S`
URL=http://8.8.8.8:8888/falco_update.tar.gz

if [ -d /etc/falco_bak ]
then
cp -r /etc/falco /etc/falco_bak/${BDATE}
rm -rf /etc/falco_bak/falco_update.tar.gz
else
mkdir /etc/falco_bak
cp -r /etc/falco /etc/falco_bak/${BDATE}
fi

curl -o /etc/falco_bak/falco_update.tar.gz ${URL} && rm -rf /etc/falco
tar -xzvf /etc/falco_bak/falco_update.tar.gz -C /etc && systemctl restart falco

把规则falco_update.tar.gz,提前准备好,使用saltstack 推下去即可.saltstack demo 如下:

[root@localhost ~]$ cat /srv/salt/top.sls   
base:
'*':
- exec_shell_install

[root@localhost ~]$ cat /srv/salt/exec_shell_install.sls

exec_shell_install:
cmd.script:
- source: salt://falco_install.sh
- user: root

[root@localhost ~]$ salt '*' state.highstate

也可以使用ansible 推下去即可.ansible demo 如下:

[root@server81 work]# ansible servers -m shell -a "mkdir -p /var/falco_sh"

[root@server81 ansible]# ansible servers -m copy -a "src=/root/ansible/falco_install.sh dest=/var/falco_sh/falco_install.sh mode=0755"
172.16.5.193 | CHANGED => {

[root@server81 ansible]# ansible servers -m shell -a "/var/falco_sh/falco_install.sh"
172.16.5.193 | CHANGED | rc=0 >>

可视化

Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用.

kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。


因为我们使用了, es 推荐使用kibana 做一下可视化, 也可以使用grafana 做可视化。demo 如下图:

使用Falco做K8S环境的HIDS



聊聊Falco的驱动部分

Falco 依赖于一个驱动模块,它抓取机器上的系统调用并将这些系统调用传递到用户空间。

LKM内核模块falco是默认驱动程序,兼容性最好, 最低支持2.6.20 内核。或者,可以使用 eBPF 探针,最低4.14版本

Falco 项目具有三种不同的驱动程序。

  • 内核模块

  • eBPF探针

  • userspace检测模块(无官方实现,民间实现pdig)

安装驱动程序的最简单方法是使用falco-driver-loader脚本。

默认情况下,它首先尝试使用dkms如果不可用,那么它会尝试将预构建的下载到~/.falco/,将其插入内核。

如果要安装 eBPF 驱动程序,请运行falco-driver-loader bpf它首先尝试在本地构建 eBPF 模块,否则下载预构建的eBPF模块到~/.falco/进行加载。

如果您使用的是 eBPF 探针,为了确保性能不会下降,请确保

  • 您的内核已CONFIG_BPF_JIT启用

  • net.core.bpf_jit_enable 设置为 1(启用 BPF JIT 编译器)

要在 Falco 中启用 eBPF 支持,请将FALCO_BPF_PROBE环境变量设置为空值(即FALCO_BPF_PROBE=""


如果您从软件包安装 Falco,则需要编辑falcosystemd 单元。

您可以通过执行以下命令来做到这一点:

systemctl edit falco

它将打开您的编辑器,此时您可以通过将以下内容添加到文件中来设置单元的环境变量:

[Service]
Environment='FALCO_BPF_PROBE=""'

如果使用 Helm 安装 Falco,则需要将ebpf.enabled选项设置true

helm install falco falcosecurity/falco --set ebpf.enabled=true


eBPF 简介:

       eBPF 分为用户空间程序和内核程序两部分:用户空间程序负责加载 BPF 字节码至内核,如需要也会负责读取内核回传的统计信息或者事件详情;内核中的 BPF 字节码负责在内核中执行特定事件,如需要也会将执行的结果通过 maps 或者 perf-event 事件发送至用户空间;

     其中用户空间程序与内核 BPF 字节码程序可以使用 map 结构实现双向通信,这为内核中运行的 BPF 字节码程序提供了更加灵活的控制。

用户空间程序与内核中的 BPF 字节码交互的流程主要如下:我们可以使用 LLVM工具将编写的 BPF 代码程序编译成 BPF 字节码;然后使用加载程序 Loader 将字节码加载至内核;内核使用验证器(verfier) 组件保证执行字节码的安全性,以避免内核panic,在确认字节码安全后将其加载对应的内核模块执行;BPF 观测技术相关的程序程序类型可能是kprobes/uprobes/tracepoint/perf_events 中的一个或多个,其中:

kprobes:实现内核中动态跟踪。kprobes 可以跟踪到 Linux 内核中的导出函数入口或返回点,但是不是稳定 ABI 接口,可能会因为内核版本变化导致,导致跟踪失效。
    uprobes:用户级别的动态跟踪。与 kprobes 类似,只是跟踪用户程序中的函数。
    tracepoints:内核中静态跟踪。tracepoints 是内核开发人员维护的跟踪点,能够提供稳定的 ABI 接口,但是由于是研发人员维护,数量和场景可能受限。
    perf_events:定时采样和 PMC。
内核中运行的 BPF 字节码程序可以使用两种方式将测量数据回传至用户空间
maps 方式可用于将内核中实现的统计摘要信息(比如测量延迟、堆栈信息)等回传至用户空间;

        Falco 的LKM驱动和eBPF 使用到了kprobes 和 tracepoints 进行syscall 跟踪。kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程。

驱动地址:

 https://github.com/njcx/falco-driver






原文始发于微信公众号(西部老枪):使用Falco做K8S环境的HIDS

版权声明:admin 发表于 2021年11月5日 上午7:35。
转载请注明:使用Falco做K8S环境的HIDS | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...