如何在Falco中定义规则捕获容器内手动命令执行告警
容器内手动命令执行的Falco自定义规则解决方案
你需要捕获容器内任意手动触发的命令执行告警,原规则未生效的核心问题是逻辑优先级错误、未针对手动命令的交互特征做匹配,以下是可行的自定义规则及说明:
原规则问题分析
- 逻辑优先级错误:
and比or优先级更高,导致规则实际匹配(容器内进程+命令行含空格)或命令行以.sh结尾,会误触发主机上的.sh脚本告警,且未聚焦手动命令的核心特征。 - 未匹配交互场景:手动命令执行通常依赖shell程序(bash/sh等)并关联终端,原规则未针对这类关键特征过滤。
基础版规则(覆盖交互式shell场景)
针对最常见的docker exec -it进入容器执行命令的场景:
- rule: interactive_shell_in_container desc: 捕获容器内的交互式shell命令执行 condition: > container.id != host and proc.name in (bash, sh, zsh, dash, fish) and proc.tty != 0 and proc.pid != 1 output: > 容器内检测到交互式命令执行 (用户=%user.name 容器ID=%container.id 容器名称=%container.name Shell进程=%proc.name 父进程=%proc.pname 命令行=%proc.cmdline) priority: WARNING
各条件作用:
container.id != host:仅匹配容器内进程,排除主机进程proc.name in (...):覆盖市面上常见的shell程序proc.tty != 0:确保进程关联终端(手动交互操作的核心特征)proc.pid != 1:排除容器内以shell作为PID1的启动进程(这类不是手动触发的交互shell)
增强版规则(覆盖更多手动执行场景)
如果需要覆盖docker exec直接执行单条命令(如docker exec container ls)、手动启动非shell二进制程序的场景,可使用以下规则:
- rule: container_manual_command_execution desc: 捕获容器内任意手动触发的命令执行 condition: > container.id != host and ( # 交互式shell场景 ((proc.name in (bash, sh, zsh, dash, fish)) and proc.tty != 0 and proc.pid != 1) or # docker exec直接执行命令的场景(父进程为docker-init/runc) (proc.pname in (docker-init, runc) and proc.cmdline != "") or # 非shell但关联终端的手动执行命令 (proc.tty != 0 and proc.pname not in (systemd, init)) ) output: > 容器内检测到手动命令执行 (用户=%user.name 容器ID=%container.id 容器名称=%container.name 进程名=%proc.name 父进程=%proc.pname 命令行=%proc.cmdline) priority: WARNING
测试验证步骤
- 将规则添加到Falco自定义规则文件(如
/etc/falco/falco_rules.local.yaml) - 重启Falco服务:
systemctl restart falco - 执行手动操作测试:
- 通过
docker exec -it <容器ID> bash进入容器后执行任意命令 - 通过
docker exec <容器ID> ls直接执行单条命令
- 通过
- 查看Falco告警日志:
journalctl -u falco -f,确认告警是否正常触发
内容的提问来源于stack exchange,提问作者Harika
相关产品推荐
相关产品推荐

