监控、审计和运行时安全
监控、审计和运行时安全

目录
[toc]
1、分析容器系统调用:Sysdig
Sysdig介绍
Sysdig:一个非常强大的系统监控、分析和故障排查工具。
汇聚 strace+tcpdump+htop+iftop+lsof 工具功能于一身!
sysdig 除了能获取系统资源利用率、进程、网络连接、系统调用等信息,
只支持本机运行。
还具备了很强的分析能力,例如:
- 按照CPU使用率对进程排序
- 按照数据包对进程排序
- 打开最多的文件描述符进程
- 查看进程打开了哪些文件
- 查看进程的HTTP请求报文
- 查看机器上容器列表及资源使用情况
项目地址:https://github.com/draios/sysdig
文档:https://github.com/draios/sysdig/wiki
sysdig 通过在内核的驱动模块注册系统调用的 hook,这样当有系统调用发生和完成的时候,它会把系统调用信息拷贝到特定的buffer,然后用户态组件对数据信息处理(解压、解析、过滤等),
并最终通过 sysdig 命令行和用户进行交互。

安装sysdig
自己是在centos7.6上安装的。
1rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public
2curl -s -o /etc/yum.repos.d/draios.repo https://s3.amazonaws.com/download.draios.com/stable/rpm/draios.repo
3yum install epel-release -y
4yum install sysdig -y
5
6/usr/bin/sysdig-probe-loader # 加载驱动模块 注意:我当时安装时,执行这个命令会报错的,但不影响结果。
哪台机器有问题,就在哪台机器上装。

sysdig常用参数
1• -l, --list:列出可用于过滤和输出的字段
2• -M <num_seconds> :多少秒后停止收集 例如:sysdig -M 3 -p "user:%user.name time:%evt.time proc_name:%proc.name"
3• -p <output_format>, --print=<output_format> :指定打印事件时使用的格式
4 • 使用-pc或-pcontainer 容器友好的格式
5 • 使用-pk或-pkubernetes k8s友好的格式
6• -c <chiselname> <chiselargs>:指定内置工具,可直接完成具体的数据聚合、分析工作
7• -w <filename>:保存到文件中 案例:sysdig -M 3 -p "user:%user.name time:%evt.time proc_name:%proc.name" -w a.sysdig
8• -r <filename>:从文件中读取
sysdig常用命令
案例:sysdig命令
1执行sysdig命令,实时输出大量系统调用。
2示例:59509 23:59:19.023099531 0 kubelet (1738) < epoll_ctl
3格式:%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
4• evt.num: 递增的事件号
5• evt.time: 事件发生的时间
6• evt.cpu: 事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的
7• proc.name: 生成事件的进程名字
8• thread.tid: 线程的 id,如果是单线程的程序,这也是进程的 pid
9• evt.dir: 事件的方向(direction),> 代表进入事件,< 代表退出事件
10• evt.type: 事件的名称,比如 open、stat等,一般是系统调用
11• evt.args: 事件的参数。如果是系统调用,这些对应着系统调用的参数
12
13自定义格式输出:sysdig -p "user:%user.name time:%evt.time proc_name:%proc.name"
输入sysdig后,就会显示好多log信息的,表示当前系统上哪些进程在进行系统调用。

==案例:自定义格式输出==
1自定义格式输出:sysdig -p "user:%user.name time:%evt.time proc_name:%proc.name"

==sysdig过滤==
1sysdig过滤:
2• fd:根据文件描述符过滤,比如 fd 标号(fd.num)、fd 名字(fd.name)
3• process:根据进程信息过滤,比如进程 id(proc.id)、进程名(proc.name)
4• evt:根据事件信息过滤,比如事件编号、事件名
5• user:根据用户信息过滤,比如用户 id、用户名、用户 home 目录
6• syslog:根据系统日志过滤,比如日志的严重程度、日志的内容
7• container:根据容器信息过滤,比如容器ID、容器名称、容器镜像
8
9查看完整过滤器列表:sysdig -l
示例
1示例:
21、查看一个进程的系统调用
3sysdig proc.name=kubelet
4
52、查看建立TCP连接的事件
6sysdig evt.type=accept
7
83、查看/etc目录下打开的文件描述符
9sysdig fd.name contains /etc
10
114、查看容器的系统调用
12sysdig -M 10 container.name=web
13
14注:还支持运算操作符,=
15、!=、>=、>、<、<=、contains、in 、exists、and、or、not
1[root@k8s-master1 ~]#docker run -d --name=web nginx
2sysdig -M 10 container.name=web
3[root@k8s-master1 image-policy]#curl 172.17.0.2 #访问容器ip

Chisels(实用的工具箱)
1Chisels:实用的工具箱,一组预定义的功能集合,用来分析特定的场景。
2
3sysdig –cl 列出所有Chisels,以下是一些常用的:
4• topprocs_cpu:输出按照 CPU 使用率排序的进程列表,例如 sysdig -c
5• topprocs_net:输出进程使用网络TOP
6• topprocs_file:进程读写磁盘文件TOP
7• topfiles_bytes:读写磁盘文件TOP
8• netstat:列出网络的连接情况
sysdig -c topprocs_cpu

sysdig -c topprocs_net

sysdig -c topprocs_files

sysdig -c topfiles_bytes

sysdig -c netstat

其它命令

1网络:
2# 查看使用网络的进程TOP
3sysdig -c topprocs_net
4# 查看建立连接的端口
5sysdig -c fdcount_by fd.sport "evt.type=accept" -M 10
6# 查看建立连接的端口
7sysdig -c fdbytes_by fd.sport
8# 查看建立连接的IP
9sysdig -c fdcount_by fd.cip "evt.type=accept" -M 10
10# 查看建立连接的IP
11sysdig -c fdbytes_by fd.cip
12
13
14
15硬盘:
16# 查看进程磁盘I/O读写
17sysdig -c topprocs_file
18# 查看进程打开的文件描述符数量
19sysdig -c fdcount_by proc.name "fd.type=file" -M 10
20# 查看读写磁盘文件
21sysdig -c topfiles_bytes
22sysdig -c topfiles_bytes proc.name=etcd
23# 查看/tmp目录读写磁盘活动文件
24sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"
25
26
27
28CPU:
29# 查看CPU使用率TOP
30sysdig -c topprocs_cpu
31# 查看容器CPU使用率TOP
32sysdig -pc -c topprocs_cpu container.name=web
33sysdig -pc -c topprocs_cpu container.id=web
34
35
36
37容器:
38# 查看机器上容器列表及资源使用情况
39csysdig –vcontainers
40# 查看容器资源使用TOP
41sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file
42
43
44其他常用命令:
45sysdig -c netstat
46sysdig -c ps
47sysdig -c lsof #查看所有打开的文件描述符
1# 查看建立连接的端口
2sysdig -c fdcount_by fd.sport "evt.type=accept" -M 10

1# 查看建立连接的IP
2sysdig -c fdcount_by fd.cip "evt.type=accept" -M 10

1# 查看进程打开的文件描述符数量
2sysdig -c fdcount_by proc.name "fd.type=file" -M 10

1# 查看容器CPU使用率TOP
2sysdig -pc -c topprocs_cpu container.name=web
3sysdig -pc -c topprocs_cpu container.id=web

1# 查看容器资源使用TOP
2sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file

1csysdig #图形化查看 (比top多了FILE和NET2列,其它没啥变化。)
2
3# 查看机器上容器列表及资源使用情况
4csysdig –vcontainers

容器命令我这里有报错哎:。。。


1sysdig -c lsof #查看所有打开的文件描述符

2、监控容器运行时:Falco
Falco介绍
Falco 是一个 Linux 安全工具,它使用系统调用来保护和监控系统。
Falco最初是由Sysdig开发的,后来加入CNCF孵化器,成为首个加入CNCF的运行时安全项目。
Falco提供了一组默认规则,可以监控内核态的异常行为,例如:
- 对于系统目录/etc, /usr/bin, /usr/sbin的读写行为
- 文件所有权、访问权限的变更
- 从容器打开shell会话
- 容器生成新进程
- 特权容器启动
项目地址:https://github.com/falcosecurity/falco
Falco架构

安装falco
安装falco:
1rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asc
2curl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo
3yum install epel-release -y
4#yum update
5reboot
6yum install falco -y
7systemctl start falco
8systemctl enable falco
9
10#falco是一个守护进程
falco配置文件目录:/etc/falco
- falco.yaml falco配置与输出告警通知方式
- falco_rules.yaml 规则文件,默认已经定义很多威胁场景
- falco_rules.local.yaml 自定义扩展规则文件
- k8s_audit_rules.yaml K8s审计日志规则
安装文档:https://falco.org/zh/docs/installation

⚠️ 注意:
安装过程最好不要使用yum update命令升级,否则会同时升级k8s集群的,因此建议单独升级系统内核就行。

自定义扩展规则文件
告警规则示例(falco_rules.local.yaml):
1- rule: The program "sudo" is run in a container
2 desc: An event will trigger every time you run sudo in a container
3 condition: evt.type = execve and evt.dir=< and container.id != host and proc.name = sudo
4 output: "Sudo run in container (user=%user.name %container.info parent=%proc.pname
5cmdline=%proc.cmdline)"
6 priority: ERROR
7 tags: [users, container]
参数说明:
- rule:规则名称,唯一
- desc:规则的描述
- condition: 条件表达式
- output:符合条件事件的输出格式
- priority:告警的优先级
- tags:本条规则的 tags 分类

威胁场景测试
威胁场景测试:
1、监控系统二进制文件目录读写(默认规则)
2、监控根目录或者/root目录写入文件(默认规则)
3、监控运行交互式Shell的容器(默认规则)
4、监控容器创建的不可信任进程(自定义规则)
使用:falco
验证:tail -f /var/log/messages(告警通知默认输出到标准输出和系统日志)
- 如果报错了,可以执行
falco-driver-loader命令

- 启用falco

测试过程:
1、监控系统二进制文件目录读写(默认规则)
1[root@k8s-master1 ~]#tail -f /var/log/messages
2[root@k8s-master1 ~]#touch /usr/bin/a

[root@k8s-master1 ~]#vim /etc/falco/falco_rules.yaml

2、监控根目录或者/root目录写入文件(默认规则)
[root@k8s-master1 ~]#touch /a

[root@k8s-master1 ~]#vim /etc/falco/falco_rules.yaml

3、监控运行交互式Shell的容器(默认规则)
1[root@k8s-master1 ~]#docker run -d --name=web nginx
2[root@k8s-master1 ~]#docker exec -it web bash


4、监控容器创建的不可信任进程(自定义规则)
监控容器创建的不可信任进程规则,在falco_rules.local.yaml文件添加:
[root@k8s-master1 ~]#vim /etc/falco/falco_rules.local.yaml
1- rule: Unauthorized process on nginx containers
2 condition: spawned_process and container and container.image startswith nginx and not proc.name in (nginx)
3 desc: test
4 output: "Unauthorized process on nginx containers (user=%user.name container_name=%container.name
5container_id=%container.id image=%container.image.repository shell=%proc.name parent=%proc.pname
6cmdline=%proc.cmdline terminal=%proc.tty)"
7 priority: WARNING


Falco支持五种输出告警通知的方式
- 输出到标准输出(默认启用)
- 输出到文件
- 输出到Syslog(默认启用)
- 输出到HTTP服务
- 输出到其他程序(命令行管道方式)
告警配置文件:/etc/falco/falco.yaml
例如输出到指定文件:
1file_output:
2 enabled: true
3 keep_alive: false
4 filename: /var/log/falco_events.log
[root@k8s-master1 ~]#vim /etc/falco/falco.yaml



以json格式输出:

测试:
[root@k8s-master1 ~]#touch /a


符合预期。
Falco告警集中化展示

- FalcoSideKick:一个集中收集并指定输出,支持大量方式输出,例如Influxdb、Elasticsearch等
项目地址 https://github.com/falcosecurity/falcosidekick
- FalcoSideKick-UI:告警通知集中图形展示系统
项目地址 https://github.com/falcosecurity/falcosidekick-ui

部署过程:
1、部署Falco UI:
1#本次在k8s-node1节点上部署
2
3#部署falcosidekick-ui
4docker run -d \
5-p 2802:2802 \
6--name falcosidekick-ui \
7falcosecurity/falcosidekick-ui
8
9#部署falcosidekick
10docker run -d \
11-p 2801:2801 \
12--name falcosidekick \
13-e WEBUI_URL=http://192.168.31.71:2802 \
14falcosecurity/falcosidekick
http://172.29.9.32:2802/ui/
2、修改falco配置文件指定http方式输出:
1json_output: true
2json_include_output_property: true
3http_output:
4 enabled: true
5 url: "http://192.168.31.71:2801/"
🍀 老师实验现象






🍀 自己测试过程(==失败了==)
falcosidekick容器启动成功:

但是falcosidekick-ui容器无法启动成功:。。。


最后,启动redislabs/redisearch:2.2.4容器,下载falcosidekick-ui的二进制文件启动成功,但是falcosidekick-ui链接依然访问不了。。。。



https://github.com/falcosecurity/falcosidekick-ui

结束。
3、Kubernetes 审计日志
在Kubernetes集群中,API Server的审计日志记录了哪些用户、哪些服务请求操作集群资源,并且可以编写不同规则,控制忽略、存储的操作日志。
审计日志采用JSON格式输出,每条日志都包含丰富的元数据,例如请求的URL、HTTP方法、客户端来源等,你可以使用监控服务来分析API流量,以检测趋势或可能存在的安全隐患。
这些可能会访问API Server:
- 管理节点(controller-manager、scheduler)
- 工作节点(kubelet、kube-proxy)
- 集群服务(CoreDNS、HPA、Calico等)
- kubectl、API、Dashboard


==💘 案例:Kubernetes 审计日志02923.6.13(测试成功)==

1vi /etc/kubernetes/manifests/kube-apiserver.yaml
2…
3- --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
4- --audit-log-path=/var/log/k8s_audit.log
5- --audit-log-maxage=30
6- --audit-log-maxbackup=10
7- --audit-log-maxsize=100
- 实验环境
1实验环境:
21、win10,vmwrokstation虚机;
32、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
4 k8s version:v1.20.0
5 docker://20.10.7
- 实验软件(无)
1、创建策略文件
1[root@k8s-master1 ~]#mkdir /etc/kubernetes/audit
2[root@k8s-master1 ~]#cd /etc/kubernetes/audit
3[root@k8s-master1 audit]#vim audit-policy.yaml
本次先使用官方给的yaml内容:
https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/audit/
1apiVersion: audit.k8s.io/v1 # 这是必填项。
2kind: Policy
3# 不要在 RequestReceived 阶段为任何请求生成审计事件。
4omitStages:
5 - "RequestReceived"
6rules:
7 # 在日志中用 RequestResponse 级别记录 Pod 变化。
8 - level: RequestResponse
9 resources:
10 - group: ""
11 # 资源 "pods" 不匹配对任何 Pod 子资源的请求,
12 # 这与 RBAC 策略一致。
13 resources: ["pods"]
14 # 在日志中按 Metadata 级别记录 "pods/log"、"pods/status" 请求
15 - level: Metadata
16 resources:
17 - group: ""
18 resources: ["pods/log", "pods/status"]
19
20 # 不要在日志中记录对名为 "controller-leader" 的 configmap 的请求。
21 - level: None
22 resources:
23 - group: ""
24 resources: ["configmaps"]
25 resourceNames: ["controller-leader"]
26
27 # 不要在日志中记录由 "system:kube-proxy" 发出的对端点或服务的监测请求。
28 - level: None
29 users: ["system:kube-proxy"]
30 verbs: ["watch"]
31 resources:
32 - group: "" # core API 组
33 resources: ["endpoints", "services"]
34
35 # 不要在日志中记录对某些非资源 URL 路径的已认证请求。
36 - level: None
37 userGroups: ["system:authenticated"]
38 nonResourceURLs:
39 - "/api*" # 通配符匹配。
40 - "/version"
41
42 # 在日志中记录 kube-system 中 configmap 变更的请求消息体。
43 - level: Request
44 resources:
45 - group: "" # core API 组
46 resources: ["configmaps"]
47 # 这个规则仅适用于 "kube-system" 名字空间中的资源。
48 # 空字符串 "" 可用于选择非名字空间作用域的资源。
49 namespaces: ["kube-system"]
50
51 # 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。
52 - level: Metadata
53 resources:
54 - group: "" # core API 组
55 resources: ["secrets", "configmaps"]
56
57 # 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。
58 - level: Request
59 resources:
60 - group: "" # core API 组
61 - group: "extensions" # 不应包括在内的组版本。
62
63 # 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。
64 - level: Metadata
65 # 符合此规则的 watch 等长时间运行的请求将不会
66 # 在 RequestReceived 阶段生成审计事件。
67 omitStages:
68 - "RequestReceived"

2、配置kube-apiserver
1[root@k8s-master1 ~]#vim /etc/kubernetes/manifests/kube-apiserver.yaml
2 - --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
3 - --audit-log-path=/var/log/k8s_audit.log
4 - --audit-log-maxage=30
5 - --audit-log-maxbackup=10
6 - --audit-log-maxsize=100
7
8……
9 - mountPath: /etc/kubernetes/audit
10 name: audit
11 readOnly: true
12 - mountPath: /var/log/k8s_audit.log
13 name: audit-log
14 hostNetwork: true
15 priorityClassName: system-node-critical
16 volumes:
17 - hostPath:
18 path: /var/log/k8s_audit.log
19 type: FileOrCreate
20 name: audit-log
21 - hostPath:
22 path: /etc/kubernetes/audit
23 type: DirectoryOrCreate
24 name: audit



3、验证
[root@k8s-master1 ~]#tail -f /var/log/k8s_audit.log

可以看到有很多的审计日志,一直在写入。
我们安装下jq工具来解析下这些json数据:
1yum install -y eple-release
2yum install -y jq

- 接下来,我们自定义下规则
1[root@k8s-master1 ~]#vim /etc/kubernetes/audit/audit-policy.yaml
2apiVersion: audit.k8s.io/v1
3kind: Policy
4# 忽略步骤,不为RequestReceived阶段生成审计日志
5omitStages:
6 - "RequestReceived"
7rules:
8 # 不记录日志
9 - level: None
10 users:
11 - system:apiserver
12 - system:kube-controller-manager
13 - system:kube-scheduler
14 - system:kube-proxy
15 - kubelet
16
17 # 针对资源记录日志
18 - level: Metadata
19 resources:
20 - group: ""
21 resources: ["pods"]
22 # - group: "apps"
23 # resources: ["deployments"]
24 # 其他资源不记录日志
25 - level: None

配置后,我们需要重启下kube-apiserver-k8s-master1的。(可以重启这个pod或者kill掉这个容器进程)


tail -f /var/log/k8s_audit.log,发现此时就没有过多的日志输出了。

此时,发一个get请求:







测试结束。😘
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

🍀 微信公众号 《云原生架构师实战》

🍀 语雀
https://www.yuque.com/xyy-onlyone

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎 https://www.zhihu.com/people/foryouone

最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


