【技術分享】K8S Runtime入侵檢測之Falco
介紹
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 -yapt-get -y install linux-headers-$(uname -r)apt-get install -y falco rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asccurl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repoyum -y install kernel-devel-$(uname -r)yum -y install falco

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,圖片來自,字節沙龍

web應用進程java,php,apache,httpd,tomcat 中讀取查看敏感文件falco demo,圖片來自,字節沙龍

下面,我們修改falco 的配置,/etc/falco/falco.yaml
json_output: truejson_include_output_property: truehttp_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"
批量部署&更新規則
我們在生產環境中需要批量部署和更新規則需求,所以我們可以使用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 falcoelse 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 falcofi 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.gzelse 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/falcotar -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.slsbase: '*': - 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 >>
可視化
Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的數據。Kibana與Elasticsearch的交互方式是各種不同的圖表、表格、地圖等,直觀的展示數據,從而達到高級的數據分析與可視化的目的。
Elasticsearch、Logstash和Kibana這三個技術就是我們常說的ELK技術棧,可以說這三個技術的組合是大數據領域中一個很巧妙的設計。一種很典型的MVC思想,模型持久層,視圖層和控制層。Logstash擔任控制層的角色,負責搜集和過濾數據。Elasticsearch擔任數據持久層的角色,負責儲存數據。而我們這章的主題Kibana擔任視圖層角色,擁有各種維度的查詢和分析,并使用圖形化的界面展示存放在Elasticsearch中的數據。
因為我們使用了, es 推薦使用kibana 做一下可視化, 也可以使用grafana 做可視化。demo 如下圖: