Falco介绍
Falco是一个Linux安全工具,它使用系统调用来保护和监控系统。
Falco最初是由Sysdig开发的,后来加入CNCF孵化器,成为首个加入CNCF的运行时安全项目。
Falco提供了一组默认规则,可以监控内核态的异常行为,例如
- 对于系统目录/etc、/usr/bin、/usr/sbin的读写行为
- 文件所有权、访问权限的变更
- 从容器打开shell会话
- 容器生成新进程
- 特权容器启动
项目地址: https://github.com/falcosecurity/falco
Falco架构
rule engine:角色引擎,需要配置文件
通过内核中的模块检测系统调用,满足则输出到目标或者设备,手机和存储。支持对k8s审计日志的收集。
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 install epel-release -y
#【】yum update #更新系统,不更新系统会起不来。falco是一个守护进程
【】yum install falco -y
【】systemctl start falco
【】systemctl enable falco
【】lsmod|grep falco
报此错可以考虑升级内核3.10.0-1160.el7.x86_64
falco配置文件目录:/etc/falco
- falco.yaml falco配置于输出告警通知方式
- falco_rules.yaml 规则文件,默认已经定义很多威胁场景
- falco_rules.loacl.yaml 自定义扩展规则文件
- k8s_audit_rules.yaml K8s审计日志规则
安装文档:https://falco.org/zh/docs/installation
告警规则示列
(falco_rules.local.yaml):
- rule: The program "sudo" is run in a container
desc: An event will trigger every time you run sudo in a container
condition: evt.type = execve and evt.dir=< and container.id != host and proc.name = sudo
output: "Sudo run in container (user=%user.name %container.info parent=%proc.pname
cmdline=%proc.cmdline)"
priority: ERROR
tags: [users, container]
参数说明:
- rule:规则名称,唯一
- desc:规则的描述
- condition:条件表达式
- output:符合条件事件的输出格式
- priority:告警的优先级
- tags:本条规则的tags分类
威胁场景测试:
falco_rules.yaml(默认规则),里面的写法和标准写法不太一样,好多是类似于变量的重复引用所以可以简写
1、监控系统二进制文件目录读写(默认规则) $PATH目录
2、监控根目录或者/root目录写入文件(默认规则)
3、监控运行交互式Shell的容器(默认规则)进入容器会被监控
4、监控容器创建的不可信任进程(自定义规则)
验证:tail -f /var/log/message
监控容器创建的不可信任进程(自定义规则)
监控容器创建的不可信任进程规则,在falco_rules.local.yaml文件添加:以nginx为例
- rule: Unauthorized process on nginx containers
condition: spawned_process and container and container.image
startswith nginx and not proc.name in (nginx)
#运行新镜像,必须是容器,并且容器镜像开头是nginx 并设置白名单
desc: test
output: "Unauthorized process on nginx containers (user=%user.name container_name=%container.name container_id=%container.id image=%container.image.repository shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline terminal=%proc.tty)"
priority: WARNING
condition表达式解读:
• spawned_process 运行新进程
• container 容器
• container.image startswith nginx 以nginx开头的容器镜像
• not proc.name in (nginx) 不属于nginx的进程名称(允许进程名称列表)
重启falco应用新配置文件:
systemctl restart falco
测试
Falco支持五种输出告警方式falco.yaml:
- 输出到标准输出(默认启用)
- 输出到文件
- 输出到Syslog(默认启用)
- 输出到HTTP服务
- 输出到其他程序(命令行管道方式)
告警配置文件:/etc/falco/falco.yaml
例如输出到指定文件:将上面的json_output: false改为true json方便后面的分析
file_output:
enabled: true
keep_alive: false#改为true是持续写入保持打开状态,false是有事件再打开写入
filename: /var/log/falco_events.log
上下两个也可以关了,没必要重复收集影响性能
Falco告警集中化展示:
FalcoSideKick:一个集中收集并指定输出,支持大量方式输出,例如influxdb、Elasticsearch等
项目地址:https://github.com/falcosecurity/falcosidekick
FalcoSideKick-UI:告警通知集中图形展示系统
项目地址 https://github.com/falcosecurity/falcosidekick-ui
部署Falco UI:
#输出给ui falcosidekick收集数据,ui的容器端口为2802 数据接口是2801
docker run -d \
-p 2801:2801 \
--name falcosidekick \
-e WEBUI_URL=http://11.0.1.21:2802 \
falcosecurity/falcosidekick
【】docker run -d -p 6379:6379 redislabs/redisearch:2.2.4
docker run -d \
-p 2802:2802 \
-e FALCOSIDEKICK_UI_REDIS_URL=11.0.1.21:6379 \
--name falcosidekick-ui \
falcosecurity/falcosidekick-ui
修改falco配置文件指定http方式输出:
json_output: true
json_include_output_property: true
http_output:
enabled: true
url: "http://192.168.31.71:2801/"
版权归原作者 弓长丿 所有, 如有侵权,请联系我们删除。