监控、审计和运行时安全
监控、审计和运行时安全
目录
[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上安装的。
rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public
curl -s -o /etc/yum.repos.d/draios.repo https://s3.amazonaws.com/download.draios.com/stable/rpm/draios.repo
yum install epel-release -y
yum install sysdig -y
/usr/bin/sysdig-probe-loader # 加载驱动模块 注意:我当时安装时,执行这个命令会报错的,但不影响结果。
哪台机器有问题,就在哪台机器上装。
sysdig常用参数
• -l, --list:列出可用于过滤和输出的字段
• -M <num_seconds> :多少秒后停止收集 例如:sysdig -M 3 -p "user:%user.name time:%evt.time proc_name:%proc.name"
• -p <output_format>, --print=<output_format> :指定打印事件时使用的格式
• 使用-pc或-pcontainer 容器友好的格式
• 使用-pk或-pkubernetes k8s友好的格式
• -c <chiselname> <chiselargs>:指定内置工具,可直接完成具体的数据聚合、分析工作
• -w <filename>:保存到文件中 案例:sysdig -M 3 -p "user:%user.name time:%evt.time proc_name:%proc.name" -w a.sysdig
• -r <filename>:从文件中读取
sysdig常用命令
案例:sysdig命令
执行sysdig命令,实时输出大量系统调用。
示例:59509 23:59:19.023099531 0 kubelet (1738) < epoll_ctl
格式:%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
• evt.num: 递增的事件号
• evt.time: 事件发生的时间
• evt.cpu: 事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的
• proc.name: 生成事件的进程名字
• thread.tid: 线程的 id,如果是单线程的程序,这也是进程的 pid
• evt.dir: 事件的方向(direction),> 代表进入事件,< 代表退出事件
• evt.type: 事件的名称,比如 open、stat等,一般是系统调用
• evt.args: 事件的参数。如果是系统调用,这些对应着系统调用的参数
自定义格式输出:sysdig -p "user:%user.name time:%evt.time proc_name:%proc.name"
输入sysdig
后,就会显示好多log信息的,表示当前系统上哪些进程在进行系统调用。
==案例:自定义格式输出==
自定义格式输出:sysdig -p "user:%user.name time:%evt.time proc_name:%proc.name"
==sysdig过滤==
sysdig过滤:
• fd:根据文件描述符过滤,比如 fd 标号(fd.num)、fd 名字(fd.name)
• process:根据进程信息过滤,比如进程 id(proc.id)、进程名(proc.name)
• evt:根据事件信息过滤,比如事件编号、事件名
• user:根据用户信息过滤,比如用户 id、用户名、用户 home 目录
• syslog:根据系统日志过滤,比如日志的严重程度、日志的内容
• container:根据容器信息过滤,比如容器ID、容器名称、容器镜像
查看完整过滤器列表:sysdig -l
示例
示例:
1、查看一个进程的系统调用
sysdig proc.name=kubelet
2、查看建立TCP连接的事件
sysdig evt.type=accept
3、查看/etc目录下打开的文件描述符
sysdig fd.name contains /etc
4、查看容器的系统调用
sysdig -M 10 container.name=web
注:还支持运算操作符,=
、!=、>=、>、<、<=、contains、in 、exists、and、or、not
[root@k8s-master1 ~]#docker run -d --name=web nginx
sysdig -M 10 container.name=web
[root@k8s-master1 image-policy]#curl 172.17.0.2 #访问容器ip
Chisels(实用的工具箱)
Chisels:实用的工具箱,一组预定义的功能集合,用来分析特定的场景。
sysdig –cl 列出所有Chisels,以下是一些常用的:
• topprocs_cpu:输出按照 CPU 使用率排序的进程列表,例如 sysdig -c
• topprocs_net:输出进程使用网络TOP
• topprocs_file:进程读写磁盘文件TOP
• topfiles_bytes:读写磁盘文件TOP
• netstat:列出网络的连接情况
sysdig -c topprocs_cpu
sysdig -c topprocs_net
sysdig -c topprocs_files
sysdig -c topfiles_bytes
sysdig -c netstat
其它命令
网络:
# 查看使用网络的进程TOP
sysdig -c topprocs_net
# 查看建立连接的端口
sysdig -c fdcount_by fd.sport "evt.type=accept" -M 10
# 查看建立连接的端口
sysdig -c fdbytes_by fd.sport
# 查看建立连接的IP
sysdig -c fdcount_by fd.cip "evt.type=accept" -M 10
# 查看建立连接的IP
sysdig -c fdbytes_by fd.cip
硬盘:
# 查看进程磁盘I/O读写
sysdig -c topprocs_file
# 查看进程打开的文件描述符数量
sysdig -c fdcount_by proc.name "fd.type=file" -M 10
# 查看读写磁盘文件
sysdig -c topfiles_bytes
sysdig -c topfiles_bytes proc.name=etcd
# 查看/tmp目录读写磁盘活动文件
sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"
CPU:
# 查看CPU使用率TOP
sysdig -c topprocs_cpu
# 查看容器CPU使用率TOP
sysdig -pc -c topprocs_cpu container.name=web
sysdig -pc -c topprocs_cpu container.id=web
容器:
# 查看机器上容器列表及资源使用情况
csysdig –vcontainers
# 查看容器资源使用TOP
sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file
其他常用命令:
sysdig -c netstat
sysdig -c ps
sysdig -c lsof #查看所有打开的文件描述符
# 查看建立连接的端口
sysdig -c fdcount_by fd.sport "evt.type=accept" -M 10
# 查看建立连接的IP
sysdig -c fdcount_by fd.cip "evt.type=accept" -M 10
# 查看进程打开的文件描述符数量
sysdig -c fdcount_by proc.name "fd.type=file" -M 10
# 查看容器CPU使用率TOP
sysdig -pc -c topprocs_cpu container.name=web
sysdig -pc -c topprocs_cpu container.id=web
# 查看容器资源使用TOP
sysdig -c topcontainers_cpu/topcontainers_net/topcontainers_file
csysdig #图形化查看 (比top多了FILE和NET2列,其它没啥变化。)
# 查看机器上容器列表及资源使用情况
csysdig –vcontainers
容器命令我这里有报错哎:。。。
sysdig -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:
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 install epel-release -y
#yum update
reboot
yum install falco -y
systemctl start falco
systemctl enable falco
#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):
- rule: The program "sudo" is run in a container
desc: An event will trigger every time you run sudo in a container
condition: evt.type = execve and evt.dir=< and container.id != host and proc.name = sudo
output: "Sudo run in container (user=%user.name %container.info parent=%proc.pname
cmdline=%proc.cmdline)"
priority: ERROR
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、监控系统二进制文件目录读写(默认规则)
[root@k8s-master1 ~]#tail -f /var/log/messages
[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的容器(默认规则)
[root@k8s-master1 ~]#docker run -d --name=web nginx
[root@k8s-master1 ~]#docker exec -it web bash
4、监控容器创建的不可信任进程(自定义规则)
监控容器创建的不可信任进程规则 ,在falco_rules.local.yaml文件添加:
[root@k8s-master1 ~]#vim /etc/falco/falco_rules.local.yaml
- rule: Unauthorized process on nginx containers
condition: spawned_process and container and container.image startswith nginx and not proc.name in (nginx)
desc: test
output: "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
Falco支持五种输出告警通知的方式
- 输出到标准输出(默认启用)
- 输出到文件
- 输出到Syslog(默认启用)
- 输出到HTTP服务