在容器运行的过程中,攻击者可能会入侵容器应用,进行容器逃逸等攻击行为。为了及时发现这些入侵行为,我们需要进行容器运行时的入侵检测。
在本篇文章中,我们将介绍如何安装Falco并自定义检测规则来进行容器运行时的入侵检测。
01、Falco简介
Falco 是一个开源的运行时安全检测引擎,可在主机、容器、K8s 和云环境中提供运行时安全性,实时检测异常行为和潜在安全威胁并发出警报。本文以Centos为测试环境,在宿主机上安装Falco,并在K8s中集成Falco。
02、在主机上安装Falco
(1)在cenos上,导入 Falco GPG 密钥,配置yum存储库,更新软件包列表,安装falco。
rpm --import https://falco.org/repo/falcosecurity-packages.asc
curl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo
yum update -y
yum install -y falco
# 执行命令测试Falco是否安装成功,若失败,尝试执行 falcoctl driver install 下载预编译驱动
(2)使用 systemd 管理 Falco
sudo systemctl list-unit-files "falco*"
# 启用eBPF
sudo systemctl enable falco-modern-bpf.service
#启用falco-modern-bpf.service还会falco-custom.service创建一个名为 的新别名/服务,
sudo systemctl list-unit-files "falco*"
#启动服务
systemctl start falco-modern-bpf.service
systemctl status falco-modern-bpf.service
(3)配置Falco
syslog_output: #关闭默认输出
enable: false
stdout_output: #关闭默认输出
enable: false
file_output: #输出到一个指定的日志文件中。
enable: true
keep_alive:false
filename: /var/log/falco.log
(4)触发规则,查看安全告警
more /etc/shadow
tail -f /var/log/falco.log
03、自定义检测规则
安全场景:当容器遭受入侵,攻击者通过web漏洞尝试进行远程命令执行或是反弹shell,执行一些系统命令。
检测规则:自定义检测规则,检测父进程为apache2,子进程为bash,匹配到这条策略就会触发告警。
Falco 编写的自定义检测规则:
- rule: Apache spawns bash shell (Web Attack Alert)
desc: “检测 Apache 进程异常启动 Bash,可能为 Web 漏洞利用(如反弹 Shell、远程命令执行)”
condition: evt.type=execve and container.id!=host and proc.pname=apache2 and proc.name="bash"
output: High risk process behavior in container, Apache spawns bash shell (evt_type=%evt.type user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid process=%proc.name proc_exepath=%proc.exepath parent=%proc.pname command=%proc.cmdline terminal=%proc.tty exe_flags=%evt.arg.flags %container.info)
priority: critical
tags: [container, shell]
04、在 K8s集群中部署 Falco
Falco 可以通过 DaemonSet 部署在 Kubernetes 集群的每个节点上,从而实时监控整个集群的系统调用。
(1)添加 Helm 仓库并更新
helm repo add falcosecurity https://falcosecurity.github.io/chartshelm repo update
(2)使用Helm安装Falco
helm install --replace falco --namespace falco --create-namespace --set tty=true falcosecurity/falco
(3)检查 Falco pod 是否正在运行
kubectl get pods -n falco
(4)创建一个pod,并触发规则
kubectl run pod1 --image=nginxkubectl exec -it pod1 -- cat /etc/shadow
(5)查看falco日志
kubectl logs -l app.kubernetes.io/name=falco -n falco -c falco | grep Warning
(6)安装 Falcosidekick 和 Falcosidekick-UI
helm upgrade --namespace falco falco falcosecurity/falco --set falcosidekick.enabled=true --set falcosidekick.webui.enabled=true
(7)查看svc,修改为NodeProt
kubectl -n falco get svc
(8)浏览器访问 Falcosidekick UI,默认用户名和密码是admin/ admin。