启用审计日志功能:参考文档
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
...
volumeMounts:
...
- mountPath: /etc/kubernetes/audit/audit-policy.yaml
name: audit
- mountPath: /var/log/k8s_audit.log
name: audit-log
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/k8s_audit.log
type: FileOrCreate
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
收集审计日志方案:
•
审计日志文件+filebeat
•
审计webhook+logstash
•
审计webhook+falco
Falco 是一个 Linux 安全工具,它使用系统调用来保护和监控系统。
Falco最初是由Sysdig开发的,后来加入CNCF孵化器,成为首个加入CNCF的运行时安全项目。
Falco提供了一组默认规则,可以监控内核态的异常行为,例如:
•
对于系统目录/etc, /usr/bin, /usr/sbin的读写行为
•
文件所有权、访问权限的变更
•
从容器打开shell会话
•
容器生成新进程
•
特权容器启动
项目地址:
https://github.com/falcosecurity/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
yum install falco -y
systemctl start falco
systemctl enable 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
告警规则示例(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、监控容器创建的不可信任进程(自定义规则)
验证:tail -f /var/log/messages(告警通知默认输出到标准输出和系统日志)
监控容器创建的不可信任进程规则,在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
Falco支持五种输出告警通知的方式:
• 输出到标准输出(默认启用)
• 输出到文件
• 输出到Syslog(默认启用)
• 输出到HTTP服务
• 输出到其他程序(命令行管道方式)
告警配置文件:/etc/falco/falco.yaml
例如输出到指定文件:
file_output:
enabled: true
keep_alive: false
filename: /var/log/falco_events.log