Skip to content

监控、审计和运行时安全

监控、审计和运行时安全

image-20230606062954890

目录

[toc]

1、分析容器系统调用:Sysdig

Sysdig介绍

Sysdig:一个非常强大的系统监控、分析和故障排查工具。

汇聚 strace+tcpdump+htop+iftop+lsof工具功能于一身!

sysdig 除了能获取系统资源利用率、进程、网络连接、系统调用等信息,

只支持本机运行。

还具备了很强的分析能力,例如:

  • 按照CPU使用率对进程排序
  • 按照数据包对进程排序
  • 打开最多的文件描述符进程
  • 查看进程打开了哪些文件
  • 查看进程的HTTP请求报文
  • 查看机器上容器列表及资源使用情况

项目地址:https:curl-s-o/etc/yum.repos.d/draios.repohttps:yuminstallepel-release-yyuminstallsysdig-y/usr/bin/sysdig-probe-loader# 加载驱动模块 注意:我当时安装时,执行这个命令会报错的,但不影响结果。

哪台机器有问题,就在哪台机器上装。

image-20230606064854353

sysdig常用参数

bash
-l,--list:列出可用于过滤和输出的字段-M<num_seconds>:多少秒后停止收集例如:sysdig-M3-p"user:%user.name time:%evt.time proc_name:%proc.name"-p<output_format>,--print=<output_format>:指定打印事件时使用的格式使用-pc或-pcontainer容器友好的格式使用-pk或-pkubernetesk8s友好的格式-c<chiselname><chiselargs>:指定内置工具,可直接完成具体的数据聚合、分析工作-w<filename>:保存到文件中案例:sysdig-M3-p"user:%user.name time:%evt.time proc_name:%proc.name"-wa.sysdig-r<filename>:从文件中读取

sysdig常用命令

案例:sysdig命令

bash
执行sysdig命令,实时输出大量系统调用。示例:5950923:59:19.0230995310kubelet(1738) <epoll_ctl格式:%evt.num%evt.outputtime%evt.cpu%proc.name(%thread.tid) %evt.dir %evt.type %evt.infoevt.num:递增的事件号evt.time:事件发生的时间evt.cpu:事件被捕获时所在的CPU,也就是系统调用是在哪个CPU执行的proc.name:生成事件的进程名字thread.tid:线程的id,如果是单线程的程序,这也是进程的pidevt.dir:事件的方向(direction)>代表进入事件,<代表退出事件evt.type:事件的名称,比如open、stat等,一般是系统调用evt.args:事件的参数。如果是系统调用,这些对应着系统调用的参数自定义格式输出:sysdig-p"user:%user.name time:%evt.time proc_name:%proc.name"

输入sysdig后,就会显示好多log信息的,表示当前系统上哪些进程在进行系统调用。

image-20230606065418193

==案例:自定义格式输出==

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

image-20230606070153161

==sysdig过滤==

bash
sysdig过滤:fd:根据文件描述符过滤,比如fd标号(fd.num)、fd名字(fd.name)process:根据进程信息过滤,比如进程id(proc.id)、进程名(proc.name)evt:根据事件信息过滤,比如事件编号、事件名user:根据用户信息过滤,比如用户id、用户名、用户home目录syslog:根据系统日志过滤,比如日志的严重程度、日志的内容container:根据容器信息过滤,比如容器ID、容器名称、容器镜像查看完整过滤器列表:sysdig-l

示例

bash
示例:1、查看一个进程的系统调用sysdigproc.name=kubelet2、查看建立TCP连接的事件sysdigevt.type=accept3、查看/etc目录下打开的文件描述符sysdigfd.namecontains/etc4、查看容器的系统调用sysdig-M10container.name=web注:还支持运算操作符,=、!=、>=、><、<=、contains、in 、exists、and、or、not
bash
[root@k8s-master1 ~]#docker run -d --name=webnginxsysdig-M10container.name=web[root@k8s-master1 image-policy]#curl 172.17.0.2 #访问容器ip

image-20230606122806087

Chisels(实用的工具箱)

bash
Chisels:实用的工具箱,一组预定义的功能集合,用来分析特定的场景。sysdig–cl列出所有Chisels,以下是一些常用的:topprocs_cpu:输出按照CPU使用率排序的进程列表,例如sysdig-ctopprocs_net:输出进程使用网络TOPtopprocs_file:进程读写磁盘文件TOPtopfiles_bytes:读写磁盘文件TOPnetstat:列出网络的连接情况

sysdig -c topprocs_cpu

image-20230607074102604

sysdig -c topprocs_net

image-20230607074126064

sysdig -c topprocs_files

image-20230607074147652

sysdig -c topfiles_bytes

image-20230607074252994

sysdig -c netstat

image-20230607074335447

其它命令

image-20230607074407815

bash
网络:# 查看使用网络的进程TOPsysdig-ctopprocs_net# 查看建立连接的端口sysdig-cfdcount_byfd.sport"evt.type=accept"-M10# 查看建立连接的端口sysdig-cfdbytes_byfd.sport# 查看建立连接的IPsysdig-cfdcount_byfd.cip"evt.type=accept"-M10# 查看建立连接的IPsysdig-cfdbytes_byfd.cip硬盘:# 查看进程磁盘I/O读写sysdig-ctopprocs_file# 查看进程打开的文件描述符数量sysdig-cfdcount_byproc.name"fd.type=file"-M10# 查看读写磁盘文件sysdig-ctopfiles_bytessysdig-ctopfiles_bytesproc.name=etcd# 查看/tmp目录读写磁盘活动文件sysdig-cfdbytes_byfd.filename"fd.directory=/tmp/"CPU:# 查看CPU使用率TOPsysdig-ctopprocs_cpu# 查看容器CPU使用率TOPsysdig-pc-ctopprocs_cpucontainer.name=websysdig-pc-ctopprocs_cpucontainer.id=web容器:# 查看机器上容器列表及资源使用情况csysdig–vcontainers# 查看容器资源使用TOPsysdig-ctopcontainers_cpu/topcontainers_net/topcontainers_file其他常用命令:sysdig-cnetstatsysdig-cpssysdig-clsof#查看所有打开的文件描述符
bash
# 查看建立连接的端口sysdig-cfdcount_byfd.sport"evt.type=accept"-M10

image-20230607074701400

bash
# 查看建立连接的IPsysdig-cfdcount_byfd.cip"evt.type=accept"-M10

image-20230607074813229

bash
# 查看进程打开的文件描述符数量sysdig-cfdcount_byproc.name"fd.type=file"-M10

image-20230607075049682

bash
# 查看容器CPU使用率TOPsysdig-pc-ctopprocs_cpucontainer.name=websysdig-pc-ctopprocs_cpucontainer.id=web

image-20230607075300925

bash
# 查看容器资源使用TOPsysdig-ctopcontainers_cpu/topcontainers_net/topcontainers_file

image-20230607075442452

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

image-20230607075645239

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

image-20230607075956098

image-20230607080020274

bash
sysdig-clsof#查看所有打开的文件描述符

image-20230608064900642

2、监控容器运行时:Falco

Falco介绍

Falco 是一个 Linux 安全工具,它使用系统调用来保护和监控系统。

Falco最初是由Sysdig开发的,后来加入CNCF孵化器,成为首个加入CNCF的运行时安全项目。

Falco提供了一组默认规则,可以监控内核态的异常行为,例如:

  • 对于系统目录/etc,/usr/bin,/usr/sbin的读写行为
  • 文件所有权、访问权限的变更
  • 从容器打开shell会话
  • 容器生成新进程
  • 特权容器启动

项目地址:https:curl-s-o/etc/yum.repos.d/falcosecurity.repohttps:yuminstallepel-release-y#yum updaterebootyuminstallfalco-ysystemctlstartfalcosystemctlenablefalco#falco是一个守护进程

falco配置文件目录:/etc/falco

安装文档:https:desc:Aneventwilltriggereverytimeyourunsudoinacontainercondition:evt.type=execveandevt.dir=<andcontainer.id!=hostandproc.name=sudooutput:"Sudo run in container (user=%user.name %container.info parent=%proc.pname cmdline=%proc.cmdline)"priority:ERRORtags:[users,container]

参数说明:

image-20230608071710605

威胁场景测试

威胁场景测试:

1、监控系统二进制文件目录读写(默认规则)

2、监控根目录或者/root目录写入文件(默认规则)

3、监控运行交互式Shell的容器(默认规则)

4、监控容器创建的不可信任进程(自定义规则)

使用:falco

验证:tail -f /var/log/messages(告警通知默认输出到标准输出和系统日志)

  • 如果报错了,可以执行falco-driver-loader命令

image-20230610075003992

  • 启用falco

image-20230610094044560

测试过程:

1、监控系统二进制文件目录读写(默认规则)

bash
[root@k8s-master1 ~]#tail -f /var/log/messages[root@k8s-master1 ~]#touch /usr/bin/a

image-20230610094242711

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

image-20230610094635305

2、监控根目录或者/root目录写入文件(默认规则)

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

image-20230610094804860

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

image-20230610094916715

3、监控运行交互式Shell的容器(默认规则)

bash
[root@k8s-master1 ~]#docker run -d --name=webnginx[root@k8s-master1 ~]#docker exec -it web bash

image-20230610100130948

image-20230610100338391

4、监控容器创建的不可信任进程(自定义规则)

监控容器创建的不可信任进程规则,在falco_rules.local.yaml文件添加:

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

yaml
- rule:Unauthorized process on nginx containerscondition:spawned_process and container and container.image startswith nginx and not proc.name in (nginx)desc:testoutput:"Unauthorized process on nginx containers (user=%user.name container_name=%container.name container_id=%container.id image=%container.image.repository shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline terminal=%proc.tty)"priority:WARNING

image-20230610102621064

image-20230610102731935

Falco支持五种输出告警通知的方式

  • 输出到标准输出(默认启用)
  • 输出到文件
  • 输出到Syslog(默认启用)
  • 输出到HTTP服务
  • 输出到其他程序(命令行管道方式)

告警配置文件:/etc/falco/falco.yaml

例如输出到指定文件:

yaml
file_output:enabled:truekeep_alive:falsefilename:/var/log/falco_events.log

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

image-20230610103321021

image-20230610103349072

image-20230610103439017

以json格式输出:

image-20230610104451673

测试:

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

image-20230610103527328

image-20230610104525295

符合预期。

Falco告警集中化展示

image-20230610104755255

  • FalcoSideKick:一个集中收集并指定输出,支持大量方式输出,例如Influxdb、Elasticsearch等

项目地址 https:#部署falcosidekick-uidockerrun-d\-p 2802:2802\--name falcosidekick-ui\falcosecurity/falcosidekick-ui#部署falcosidekickdockerrun-d\-p 2801:2801\--name falcosidekick\-e WEBUI_URL=http:falcosecurity/falcosidekick

http:json_include_output_property:truehttp_output:enabled:trueurl:"http:---audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml---audit-log-path=/var/log/k8s_audit.log---audit-log-maxage=30---audit-log-maxbackup=10---audit-log-maxsize=100

本次先使用官方给的yaml内容:

https:kind:Policy# 不要在 RequestReceived 阶段为任何请求生成审计事件。omitStages:- "RequestReceived"rules:# 在日志中用 RequestResponse 级别记录 Pod 变化。- level:RequestResponseresources:- group:""# 资源 "pods"不匹配对任何 Pod 子资源的请求,# 这与 RBAC 策略一致。resources:["pods"]# 在日志中按 Metadata 级别记录 "pods/log"、"pods/status"请求- level:Metadataresources:- group:""resources:["pods/log","pods/status"]# 不要在日志中记录对名为 "controller-leader"的 configmap 的请求。- level:Noneresources:- group:""resources:["configmaps"]resourceNames:["controller-leader"]# 不要在日志中记录由 "system:kube-proxy"发出的对端点或服务的监测请求。- level:Noneusers:["system:kube-proxy"]verbs:["watch"]resources:- group:""# core API 组resources:["endpoints","services"]# 不要在日志中记录对某些非资源 URL 路径的已认证请求。- level:NoneuserGroups:["system:authenticated"]nonResourceURLs:- "/api*"# 通配符匹配。- "/version"# 在日志中记录 kube-system 中 configmap 变更的请求消息体。- level:Requestresources:- group:""# core API 组resources:["configmaps"]# 这个规则仅适用于 "kube-system"名字空间中的资源。# 空字符串 ""可用于选择非名字空间作用域的资源。namespaces:["kube-system"]# 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。- level:Metadataresources:- group:""# core API 组resources:["secrets","configmaps"]# 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。- level:Requestresources:- group:""# core API 组- group:"extensions"# 不应包括在内的组版本。# 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。- level:Metadata# 符合此规则的 watch 等长时间运行的请求将不会# 在 RequestReceived 阶段生成审计事件。omitStages:- "RequestReceived"

image-20230612104146630

2、配置kube-apiserver

image-20230612105105518

image-20230612105139664

image-20230612105214864

3、验证

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

image-20230612105600258

可以看到有很多的审计日志,一直在写入。

我们安装下jq工具来解析下这些json数据:

image-20230612111206580

image-20230612073047881

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

image-20230613061930723

image-20230613062005422

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

image-20230613062059758

此时,发一个get请求:

image-20230613070329451

image-20230613070336526

image-20230613070423558

image-20230613070545358

image-20230613070603708

image-20230613070646450

image-20230612073055825

测试结束。😘

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

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

image-20230107215126971

🍀 语雀

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新