Falco是一个开源的工具,它可以窥视你的系统内部,检测并报告系统调用和网络活动情况。它最初是由Sysdig建立的,后来捐给了CNCF,在那里它作为一个孵化器项目做得很好,有一个活跃的社区。
我从Sysdig的首席技术官那里了解到,Falco被设计为系统的最后一道防线,在那里,人们通常把重点放在预防措施上。Falco的作用是报告异常情况和意外行为。
当在边缘位置运行k3s时,可能很难获得对服务器的物理访问,而且可能有部分连接可用。
上图:在BitScope Designs公司专门设计的工业装置 "BitScope Cluster Blade "上运行的联网的Raspberry Pi集群。
默认情况下,Falco有三个可能的事件源。
这些事件可以被发送到webhook,如OpenFaaS功能,以便在边缘进行补救,或在云中的集中行动中心发出警报和决策。作为一个通用的事件汇,数据可以直接从Kubernetes API中摄取,但智能设备,如门锁,也可以发送数据,如当前温度,或从加速计中获取的意外运动。
概念架构:从内核、eBPF、k3s API中检测事件,并通过OpenFaaS进行报警和补救。
在本指南中,我将向您展示如何配置Falco,使其在ARM64主机(如Equinix Metal提供的Ampere eMAG®)、AWS Graviton实例或Raspberry Pi 4上与k3s一起在边缘运行。
教程
我们将首先把Ubuntu Linux闪存到SD卡上,然后添加k3s,最后我们将安装Falco并配置k3s来发送事件。
下载操作系统
你将需要一个Raspbery Pi 4。我使用的是4GB内存的设备,但2GB也可以使用。
使用Raspberry Pi 4的链接下载Ubuntu 20.04.01图像。
你可以在这里获得该图像:https://ubuntu.com/download/raspberry-pi
现在使用Etcher.io或dd
,将服务器操作系统镜像写入你的Raspberry Pi的SD卡中。
第一次启动
注意:与RaspiOS不同,SSH是默认启用的。
启动机器并使用nmap
,在你的网络上找到它:
nmap -sP 192.168.0.0/24
登录并将密码从ubuntu
改为你喜欢的密码:
ssh ubuntu@192.168.0.101
接下来,把你的SSH密钥复制过来:
ssh-copy-id ubuntu@192.168.0.101
为k3s做准备
编辑/firmware/boot/cmdline.txt
并添加到第一行,不要添加任何断行符。
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
这样就可以启用cgroups,这是设置容器限制的必要条件。这个步骤来自我的Raspbian教程。在你的Raspberry Pi上安装k3s,会不会有集群?
重新启动你的RPi:
sudo reboot
用k3sup安装k3s
在你的工作站上使用我的k3sup工具,通过SSH安装k3s。请不要在RPi上运行这个工具:
curl -sLS https://get.k3sup.dev | sudo sh
现在通过k3sup install
进行安装:
k3sup install --ip 192.168.0.101 --user ubuntu \
--channel latest
--channel
命令来安装Kubernetes 1.19。
安装Falco和它的依赖项
通过SSH登录到RPi上。
目前,要在64位ARM上运行,需要一个上游项目的分叉,但我希望这些变化很快就能合并回来。一位维护者已经提供了一个.deb文件。
sudo apt-get -y install linux-headers-$(uname -r) dkms
DKMS是构建内核模块的必要条件。这是Falco对你的系统进行检测的方法之一。
你也可以使用
build/aarch64
分支从源代码构建。
安装 Falco 的二进制文件,让它构建内核模块:
wget https://fs.fntlnz.wtf/falco/aarch64-builds/falco-0.26.1-48%2Bf82d905-aarch64.deb
sudo dpkg -i ./falco-0.26.1-48+f82d905-aarch64.deb
在falco配置文件中消除一些错误。
编辑/etc/falco/falco.yaml
并替换以下内容:
syscall_event_drops:
actions:
- log
- alert
rate: .03333
max_burst: 10
用:
syscall_event_drops:
actions:
- ignore
rate: .03333
max_burst: 10
这将关闭我在ARM-64版本中看到的一些噪音。
在开机时启用它:
sudo systemctl enable falco \
&& sudo systemctl start falco
你可以在以下网址找到falco的各种预装规则/etc/falco/rules/
ls /etc/falco/rules/
falco.yaml
falco_rules.local.yaml
falco_rules.yaml
k8s_audit_rules.yaml
模拟一个Falco事件
在配置Kubernetes向Falco发送事件之前,我们可以发送一个样本事件来触发一个内置警报。
cat >> sample-event.json <<EOF
{"kind":"Event","apiVersion":"audit.k8s.io/v1beta1","metadata":{"creationTimestamp":"2018-10-25T13:58:49Z"},"level":"Request","timestamp":"2018-10-25T13:58:49Z","auditID":"841d3e6d-90d2-43df-8da4-684738bee3d5","stage":"ResponseComplete","requestURI":"/api/v1/namespaces","verb":"create","user":{"username":"system:anonymous","groups":["system:masters","system:authenticated"]},"sourceIPs":["192.168.99.1"],"objectRef":{"resource":"namespaces","name":"foo","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":201},"requestObject":{"kind":"Namespace","apiVersion":"v1","metadata":{"name":"foo","creationTimestamp":null},"spec":{},"status":{"phase":"Active"}},"requestReceivedTimestamp":"2018-10-25T13:58:49.730588Z","stageTimestamp":"2018-10-25T13:58:49.736141Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":""}}
EOF
通过Falco的REST API调用该事件。
curl http://127.0.0.1:8765/k8s-audit --data-binary @sample-event.json -H "Content-Type: application/json"
从k3s触发一个事件
我们可以添加一个额外的来源,就是来自Kubernetes审计日志的事件。这个功能必须通过k3s的systemd定义来开启。
为审计事件创建一个文件夹:
sudo mkdir -p /var/lib/rancher/audit
下载audit-policy.yaml
到/var/lib/rancher/audit
wget https://raw.githubusercontent.com/falcosecurity/evolution/master/examples/k8s_audit_config/audit-policy.yaml
sudo cp audit-policy.yaml /var/lib/rancher/audit/
创建一个webhook配置文件:
export IP=192.168.0.23
cat << EOF | sudo tee /var/lib/rancher/audit/webhook-config.yaml
apiVersion: v1
kind: Config
clusters:
- name: falco
cluster:
server: http://$IP:8765/k8s-audit
contexts:
- context:
cluster: falco
user: ""
name: default-context
current-context: default-context
preferences: {}
users: []
EOF
编辑/etc/systemd/system/k3s.service
,在结尾处添加这些行:
'--kube-apiserver-arg=audit-log-path=/var/lib/rancher/audit/audit.log' \
'--kube-apiserver-arg=audit-policy-file=/var/lib/rancher/audit/audit-policy.yaml' \
'--kube-apiserver-arg=audit-webhook-config-file=/var/lib/rancher/audit/webhook-config.yaml' \
现在重新加载:
sudo systemctl daemon-reload && \
sudo systemctl restart k3s
文档中我最喜欢的用例是检测存储在ConfigMaps中的AWS秘钥。当然,我们都知道机密数据属于Vault或Kubernetes Secrets里面,可以在休息时加密。
让我们试试吧?
从你的笔记本上运行这个:
kubectl create configmap aws-creds \
--from-literal aws_access_key_id=AKES20LNOA
现在检查Falco的日志:
sudo journalctl -u falco --lines 100
Oct 13 16:55:42 ubuntu falco[89818]: 16:55:24.207932928: Warning K8s configmap with private credential (user=system:admin verb=create configmap=aws-creds-1 config={"aws_access_key_id":"AKES20LNOA"})
你可以在Falco文档的 "Kubernetes审计规则 "中找到这个例子。
扩展k3s集群
你可以在k3s集群中添加额外的节点,方法是像我们为第一个节点安装Ubuntu,然后运行k3sup join
命令。
k3sup join --ip $IP -user ubuntu \
--server-ip 192.168.0.101
k3s还支持高可用性和使用SQL后端或嵌入式etcd的主节点的故障转移。
总结
完全公开:Sysdig是OpenFaaS有限公司的一个客户。
我们现在有了Ubuntu 20.04.01,Kubernetes与k3s和Falco都是为64位ARM构建的,在我们的Raspberry Pi上运行。
现在就看你如何进一步探索Falco,以及如何微调你的Kubernetes规则了。
我还想向我的朋友fntlnz表示感谢,他是Falco的维护者,帮助我在64位ARM上建立了Falco的工作。我们花了好几天时间才达到这个效果。