Kubernetes安全篇6:监控、审计和运行时安全

分析容器系统调用: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 命令行和用户进行交互。

Kubernetes安全篇6:监控、审计和运行时安全

centos安装sysdig:

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 # 加载驱动模块

在 Ubuntu 22上安装 Sysdig

步骤 1. 首先,通过在终端中运行以下命令,确保所有系统包都是最新的。
sudo apt update
sudo apt upgrade
sudo apt install software-properties-common apt-transport-https wget ca-certificates dkms gnupg2 ncurses-term

步骤 2. 在 Ubuntu 22.04 上安装 Sysdig。
默认情况下,Sysdig 在 Ubuntu 22.04 基础存储库中不可用。现在运行以下命令将 Sysdig 存储库添加到您的 Ubuntu 系统:
echo 'deb [signed-by=/usr/share/keyrings/sysdig.gpg] https://download.sysdig.com/stable/deb stable-$(ARCH)/' | sudo tee /etc/apt/sources.list.d/sysdig.list
接下来,使用以下命令导入 GPG 密钥:
sudo wget -O- https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public | gpg --dearmor | sudo tee /usr/share/keyrings/sysdig.gpg
启用存储库后,现在使用以下命令安装最新版本的 Sysdig:
sudo apt install sysdig
确认安装并检查已安装的 Sysdig 构建版本:
sysdig --version

步骤 3. 在 Ubuntu 22.04 上访问 Sysdig。
在您的 Ubuntu 系统上成功安装后,在桌面上运行以下路径以打开路径:或使用以下命令通过终端启动它:Activities -> Show Applications -> Sysdig
sudo sysdig
捕获所有系统调用

sysdig常用参数:

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

执行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过滤:

•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

Kubernetes安全篇6:监控、审计和运行时安全

2、查看建立TCP连接的事件
sysdig evt.type=accept

Kubernetes安全篇6:监控、审计和运行时安全

3、查看/etc目录下打开的文件描述符
sysdig fd.name contains /etc

Kubernetes安全篇6:监控、审计和运行时安全

4、查看容器的系统调用
docker run --name web -d nginx
sysdig -M 10 container.name=web
新开一个终端:执行curl 172.17.0.2

Kubernetes安全篇6:监控、审计和运行时安全

注:还支持运算操作符,=、!=、>=、>、<、<=、contains、in 、exists、and、or、not

Chisels:实用的工具箱,一组预定义的功能集合,用来分析特定的场景。

sysdig -cl 列出所有Chisels,以下是一些常用的:

• topprocs_cpu:输出按照 CPU 使用率排序的进程列表,例如sysdig -c topprocs_cpu

Kubernetes安全篇6:监控、审计和运行时安全

• topprocs_net:输出进程使用网络TOP

Kubernetes安全篇6:监控、审计和运行时安全

• topprocs_file:进程读写磁盘文件TOP

Kubernetes安全篇6:监控、审计和运行时安全

• topfiles_bytes:读写磁盘文件TOP

Kubernetes安全篇6:监控、审计和运行时安全

• netstat:列出网络的连接情况

Kubernetes安全篇6:监控、审计和运行时安全

总结:

Kubernetes安全篇6:监控、审计和运行时安全

其他常用命令:
sysdig -c netstat
sysdig -c ps
sysdig -c lsof

csysdig
类似于top,多了网络和文件两个指标

Kubernetes安全篇6:监控、审计和运行时安全

监控容器运行时:Falco

Falco 是一个 Linux 安全工具,它使用系统调用来保护和监控系统。Falco最初是由Sysdig开发的,后来加入CNCF孵化器,成为首个加入CNCF的运行时安全项目。

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

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

项目地址:https://github.com/falcosecurity/falco

Kubernetes安全篇6:监控、审计和运行时安全

centos7安装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
yum install falco -y
systemctl start falco
systemctl enable falco

ubuntu安装falco

# 安装必要的软件包:
sudo apt-get update
sudo apt-get install -y linux-headers-$(uname -r)
# 下载并安装 Falco 的 Debian 包:
curl -s https://s3.amazonaws.com/download.draios.com/stable/install-falco | sudo bash
# 配置 Falco:
/etc/falco/falco.yaml
启动 Falco:
sudo systemctl start falco
# 确保 Falco 在系统启动时启动:
sudo systemctl enable falco

falco配置文件目录:/etc/falco
•falco.yaml falco配置与输出告警通知方式
•falco_rules.yaml 规则文件,默认已经定义很多威胁场景
•falco_rules.local.yaml 自定义扩展规则文件
•k8s_audit_rules.yaml 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.pnamecmdline=%proc.cmdline)"
  priority: ERROR
  tags: [users, container]

参数说明:
• rule:规则名称,唯一
• desc:规则的描述
• condition: 条件表达式
• output:符合条件事件的输出格式
• priority:告警的优先级
• tags:本条规则的 tags 分类

威胁场景测试:

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

Kubernetes安全篇6:监控、审计和运行时安全

监控结果:

Kubernetes安全篇6:监控、审计和运行时安全

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

Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全

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

Kubernetes安全篇6:监控、审计和运行时安全

4、监控容器创建的不可信任进程(自定义规则)
验证:tail -f /var/log/messages(tail -f /var/log/syslog )(告警通知默认输出到标准输出和系统日志)

监控容器创建的不可信任进程规则,在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

condition表达式解读:
•spawned_process 运行新进程
•container 容器
•container.image startswith nginx 以nginx开头的容器镜像
•not proc.name in (nginx) 不属于nginx的进程名称(允许进程名称列表)

重启falco应用新配置文件:
systemctl restart falco

Kubernetes安全篇6:监控、审计和运行时安全

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

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

告警配置文件:/etc/falco/falco.yaml
vi falco.yaml
例如输出到指定文件:

Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全

Falco告警集中化展示:

Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全

•FalcoSideKick:一个集中收集并指定输出,支持大量方式输出,例如Influxdb、Elasticsearch等
项目地址https://github.com/falcosecurity/falcosidekick

•FalcoSideKick-UI:告警通知集中图形展示系统
项目地址https://github.com/falcosecurity/falcosidekick-ui

docker run -d \
-p 2801:2801 \
--name falcosidekick \
-e WEBUI_URL=http://11.0.1.111:2802 \
falcosecurity/falcosidekick
docker run -d \
-p 2802:2802 \
--name falcosidekick-ui \
falcosecurity/falcosidekick-ui

修改falco配置文件指定http方式输出:

json_output: true
json_include_output_property: true
http_output:
  enabled: true
  url: "http://11.0.1.112:2801/"

UI访问地址:http://11.0.1.112:2802/ui/

Kubernetes 审计日志

在Kubernetes集群中,API Server的审计日志记录了哪些用户、哪些服务请求操作集群资源,并且可以编写不同规则,控制忽略、存储的操作日志。审计日志采用JSON格式输出,每条日志都包含丰富的元数据,例如请求的URL、HTTP方法、客户端来源等,你可以使用监控服务来分析API流量,以检测趋势或可能存在的安全隐患。

这些可能服务会访问API Server:
•管理节点(controller-manager、scheduler)
•工作节点(kubelet、kube-proxy)
•集群服务(CoreDNS、Calico、HPA等)
•kubectl、API、Dashboard

事件和阶段:
当客户端向API Server发出请求时,该请求将经历一个或多个阶段:

Kubernetes安全篇6:监控、审计和运行时安全

ApiServer处理请求流程图

Kubernetes安全篇6:监控、审计和运行时安全

Kubernetes审核策略文件包含一系列规则,描述了记录日志的级别,采集哪些日志,不采集哪些日志。规则级别如下表所示:

Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全

日志格式示例:

Kubernetes安全篇6:监控、审计和运行时安全

审计日志支持写入本地文件和Webhook(发送到外部HTTP API)两种方式。

vi /etc/kubernetes/manifests/kube-apiserver.yaml

    - --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
Kubernetes安全篇6:监控、审计和运行时安全
Kubernetes安全篇6:监控、审计和运行时安全

示例:只记录指定资源操作日志
mkdir /etc/kubernetes/audit
vi /etc/kubernetes/audit/audit-policy.yaml

apiVersion: audit.k8s.io/v1
kind: Policy
# 忽略步骤,不为RequestReceived阶段生成审计日志
omitStages:
  - "RequestReceived"
rules:
  # 不记录日志
  - level: None
    users:
      - system:apiserver
      - system:kube-controller-manager
      - system:kube-scheduler
      - system:kube-proxy
      - kubelet
    # 针对资源记录日志
  - level: Metadata
    resources:
    - group: ""
      resources: ["pods"]
    # - group: "apps"
    # resources: ["deployments"]
    # 其他资源不记录日志
  - level: None

apiserver默认配置添加

    - mountPath: /etc/kubernetes/audit/audit-policy.yaml
      name: audit
    - mountPath: /var/log/k8s_audit.log
      name: audit-log
  - name: audit
    hostPath:
      path: /etc/kubernetes/audit/audit-policy.yaml
      type: File
  - name: audit-log
    hostPath:
      path: /var/log/k8s_audit.log
      type: FileOrCreate

tail -f /var/log/k8s_audit.log

Kubernetes安全篇6:监控、审计和运行时安全

执行get pods,然后 jq解析下

Kubernetes安全篇6:监控、审计和运行时安全

执行run web-nginx --image=nginx

Kubernetes安全篇6:监控、审计和运行时安全

calico

Kubernetes安全篇6:监控、审计和运行时安全

分配到node01上

Kubernetes安全篇6:监控、审计和运行时安全

收集审计日志方案:
•审计日志文件+filebeat
•审计webhook+logstash
•审计webhook+falco

发布者:LJH,转发请注明出处:https://www.ljh.cool/34074.html

(0)
上一篇 2023年4月2日 下午4:36
下一篇 2023年4月2日 下午5:47

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注