容器内部操作审计功能可以审计组织内成员或应用程序进入容器后执行的命令操作。本文介绍如何使用容器内部操作审计功能,以及如何通过日志服务收集分析审计日志,并根据需求为审计日志设置自定义的告警规则。
计费说明
容器内部操作审计功能可以免费使用。开通容器内部操作审计功能后,使用日志服务SLS的相关功能,会产生相关费用。日志服务相关计费信息,请参见计费概述。
该功能通过白名单开放中,如需使用,请提交工单。
使用限制
集群类型:仅支持ACK托管集群Pro版、ACK托管集群基础版、ACK专有集群。
集群版本及操作系统限制:仅支持内核版本大于4.19的Alibaba Cloud Linux、Ubuntu、ContainerOS操作系统。
Alibaba Cloud Linux:集群版本为1.18及以上。
ContainerOS:集群版本为1.24及以上。
Ubuntu:
集群版本为1.30及以上。如需升级集群,请参见手动升级集群。
节点初始化时,会关闭操作系统自动升级。
节点初始化时,把
/etc/resolv.conf
软连接指向到/run/systemd/resolve/stub-resolv.conf
,将 DNS服务器指向 DHCP配置。目前不支持CPFS存储卷、镜像加速插件、安全加固等功能。
步骤一:启用容器内部操作审计功能
可通过以下步骤开启容器内部操作审计功能。启用此功能后,将安装以下两个组件。
日志采集组件:将审计日志收集到日志服务并创建默认的审计报表。
ack-advanced-audit组件:实现容器内操作审计。
默认将在日志采集组件使用的日志Project中创建一个名为advaudit-${cluster_id}的日志库,用于保存审计日志。该日志库数据的保存时间为180天。如需修改日志保存时间,请参见管理Logstore。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在审计页面单击容器审计页签,然后单击开始安装。
步骤二:查看审计报表
在审计页面单击容器审计页签,然后单击容器内审计概览页签,查看审计报表内容。
查看进入Pod容器的次数以及相关Pod信息。
执行操作的Kubernetes操作账号信息、进入容器后执行的命令列表以及常见的高危列表。
步骤三:查看详细日志记录
可通过以下两种方式查看详细的日志记录。
在审计报表页面查看:适用于查看最近的单个事件的日志记录。
在日志库页面通过查询语句查看:适用于复杂场景,查看更多的历史信息以及历史事件。
在审计报表页面查看
在容器内审计概览报表页面,通过单击风险程序操作列表区域的traceId和eventId表格列的链接,查看对应审计日志的详细信息。
单击traceId表格列的链接,可以查看单次进入容器后执行的所有操作命令的审计日志。
单击eventId表格列的链接,可以查看执行的单个命令的详细信息。
在日志库页面通过查询语句查看
在容器内审计日志查询页面,通过查询语句查看详细的审计日志记录。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在审计页面单击容器审计页签,然后单击容器内审计日志查询页签。
在输入框中输入查询和分析语句。
查询进入某个Pod的容器后执行的命令操作审计日志:输入* and k8s.pod.namespace: <namespace> and k8s.pod.name: <pod_name>,将<namespace>替换为Pod所在的命名空间,<pod_name>替换为Pod的名称。
查询执行指定程序的操作审计日志:输入* and process.name: <name>,将<name>替换为待查找的程序名称。
更多查询统计方式,请参见日志服务查询分析方法。
设置查询分析的时间范围,然后单击查询/分析,查看分析结果。
(可选)步骤四:配置操作审计告警
通过日志服务的告警功能,您可以配置容器内部操作审计的实时告警,便于监控容器内关键的操作事件。告警方式支持短信、钉钉机器人、邮件、自定义Webhook和通知中心。本文以配置钉钉告警的方式,介绍如何配置容器内部操作审计告警。更多告警配置方式,请参见告警。
登录日志服务控制台。
进入Webhook集成页面。
在Project列表区域,单击目标Project。
在左侧导航栏中,单击告警。
在告警中心页面,单击通知对象页签,然后单击Webhook集成。
创建Webhook。
在Webhook集成页面,单击创建。
在新建Webhook对话框中,配置如下配置项,然后单击确认。
配置项
描述
标识符
Webhook的唯一标识,不可重复。本示例配置为ack-container-operation-audit-alert。
名称
Webhook名称。本示例配置为Kubernetes容器内部操作审计告警。
类型
Webhook类型。本示例选择钉钉。
请求地址
Webhook URL地址。
在钉钉侧创建自定义机器人,并获取Webhook URL地址。更多信息,请参见自定义机器人接入。
新建内容模板。
在告警中心页面,单击通知策略页签,然后单击内容模板。
在内容模板页面,单击创建。
配置内容模板的标识符和名称,然后配置钉钉告警通知的标题和发送内容。
关于添加内容模板的更多信息,请参见创建内容模板。本文需配置两个内容模板,具体配置内容如下。
标识符
名称
标题
发送内容
ack-container-operation-audit-alert-enter
Kubernetes进入容器告警
KubernetesKubernetes容器内部操作审计告警
- 告警规则:${alert_name} - 触发时间:${alert_time} - 告警严重度:${severity} - 集群ID:{{ alert.results[0].fire_result['clusterid'] }} 有账号通过 kubectl exec或终端功能进入了容器,请检查是否存在异常。 操作次数:{{ alert.fire_results_count }} 次,下面是其中一次操作的具体信息: - 操作时间:{{ alert.results[0].fire_result['time'] }} {% if alert.results[0].fire_result['k8s.user.aliuid'] -%} - 操作账号:{{ alert.results[0].fire_result['k8s.user.aliuid'] }} {% else -%} - 操作账号:{{ alert.results[0].fire_result['k8s.user.username'] }} {% endif -%} - 命名空间:{{ alert.results[0].fire_result['k8s.pod.namespace'] }} - Pod:{{ alert.results[0].fire_result['k8s.pod.name'] }} - 容器:{{ alert.results[0].fire_result['kubeobject.operation.podexecoptions.container'] }} - 命令:{{ alert.results[0].fire_result['kubeobject.operation.podexecoptions.commandstr'] }} [[详情](${query_url})] [[设置](${alert_url})]
ack-container-operation-audit-alert-run-danger-cmd
Kubernetes进入容器后执行风险程序告警
Kubernetes容器内部操作审计告警
- 告警规则:${alert_name} - 触发时间:${alert_time} - 告警严重度:${severity} - 集群ID:{{ alert.results[0].fire_result['clusterid'] }} 有账号通过 kubectl exec或终端功能进入容器后执行了存在风险的程序命令,请检查是否存在异常。 操作次数:{{ alert.fire_results_count }} 次,下面是其中一次操作的具体信息: - 操作时间:{{ alert.results[0].fire_result['time'] }} {% if alert.results[0].fire_result['k8s.user.aliuid'] -%} - 操作账号:{{ alert.results[0].fire_result['k8s.user.aliuid'] }} {% else -%} - 操作账号:{{ alert.results[0].fire_result['k8s.user.username'] }} {% endif -%} - 命名空间:{{ alert.results[0].fire_result['k8s.pod.namespace'] }} - Pod:{{ alert.results[0].fire_result['k8s.pod.name'] }} - 容器:{{ alert.results[0].fire_result['k8s.container.name'] }} - 操作目录:{{ alert.results[0].fire_result['process.cwd'] }} - 执行的程序命令:{{ alert.results[0].fire_result['process.cmdline'] }} [[详情](${query_url})] [[设置](${alert_url})]
配置告警。
登录日志服务控制台。
在Project列表区域,选择集群使用的日志Project(k8s-log-${cluster_id}),单击名称进入日志Project页面。
在页面左侧的图标栏单击
仪表盘图标,选择仪表盘列表,然后单击Kubernetes容器内部操作审计。
在Kubernetes容器内部操作审计报表页面,单击 。
在告警监控规则页面,分别配置
Kubernetes进入容器告警
和Kubernetes进入容器后执行风险程序告警
的告警规则。配置完成后,单击确定。以下配置项均为示例值,请根据实际需求设置。
Kubernetes进入容器告警
配置项
描述
规则名称
Kubernetes进入容器告警
检查频率
固定间隔:1分钟。
查询统计
单击右侧添加,然后单击高级配置页签,配置如下信息。配置完成后,单击确认。
日志库:搜索并选中
advaudit-${cluster_id}
,例如advaudit-c76da730c08ca45adb90fad86fb******
。查询区间:本示例选中1分钟(相对)。
查询:设置日志库后,会显示该字段。代码配置为:
kind: Kubernetes and kubeObject.operation.kind: PodExec | select "clusterid", "time", "traceId", "eventId", "k8s.user.aliuid", "k8s.user.username", json_extract(k8s, '$.user.groups') as "k8s.user.groups", "host.hostip", "host.nodename", "k8s.pod.namespace", "k8s.pod.name", json_extract(k8s, '$.pod.labels') as "k8s.pod.labels", "kubeobject.operation.podexecoptions.container", json_extract(kubeobject, '$.operation.podExecOptions.command') as "kubeobject.operation.podexecoptions.command", "kubeobject.operation.podexecoptions.commandstr" from log
触发条件
选择当有数据时,严重程度:报告。
输出目标
选择SLS通知。
开启
打开开关。
告警策略
选择极简模式,并配置如下信息。
渠道:选择钉钉。
选择Webhook:选择
Kubernetes容器内部操作审计告警
。提醒方式:选择不提醒。
内容模板:搜索并选择
Kubernetes进入容器告警
。发送时段:选择任意。
Kubernetes进入容器后执行风险程序告警
配置项
描述
规则名称
Kubernetes进入容器后执行风险程序告警
检查频率
固定间隔:1分钟。
查询统计
单击右侧添加,然后单击高级配置页签,配置如下信息。配置完成后,单击确认。
日志库:搜索并选中
advaudit-${cluster_id}
,例如advaudit-c76da730c08ca45adb90fad86fb74****
。查询区间:选中1分钟(相对)。
查询:设置日志库后,才会显示该字段。代码配置为:
kind: Command | select "clusterid", "time", "traceId", "eventId", "k8s.user.aliuid", "k8s.user.username", json_extract(k8s, '$.user.groups') as "k8s.user.groups", "host.hostip", "host.nodename", "k8s.pod.namespace", "k8s.pod.name", json_extract(k8s, '$.pod.labels') as "k8s.pod.labels", "k8s.container.name", "k8s.container.image", "process.cwd", "process.name", "process.cmdline", json_extract(process, '$.pid') as "process.pid", "process.user.uid", json_extract(process, '$.parentPid') as "process.parentpid", "process.parentname" from log where "process.name" in ('rm', 'sudo', 'su', 'nsenter', 'curl', 'wget', 'yum', 'apt-get', 'apt', 'apk', 'dpkg', 'nc', 'ncat', 'ssh', 'scp', 'nmap', 'docker', 'crictl', 'nerdctl', 'podman', 'kubectl', 'helm', 'mysql', 'redis', 'psql', 'redis-cli', 'pip', 'npm', 'gem')
触发条件
当有数据时,严重程度:中。
输出目标
选择SLS通知。
开启
打开开关。
告警策略
选择极简模式,并配置如下信息。
渠道:选择钉钉。
选择Webhook:选择
Kubernetes容器内部操作审计告警
。提醒方式:选择不提醒。
内容模板:选择
Kubernetes进入容器后执行风险程序告警
。发送时段:选择任意。
测试告警规则。
通过
kubectl exec -it <pod_name> -- bash
命令进入容器,触发Kubernetes进入容器告警
的告警规则。告警信息如下图所示。进入容器后,通过
touch a.txt && rm a.txt
命令,触发Kubernetes进入容器后执行风险程序告警
的告警规则。告警信息如下图所示。
关闭容器内部操作审计功能
可通过卸载ack-advanced-audit组件关闭容器内部操作审计功能。
关闭容器内部操作审计功能,不会删除自动创建的advaudit-${cluster_id}日志库,需要登录日志服务控制台手动删除该日志库,请参见停止计费/删除Logstore。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
在组件管理页面,搜索ack-advanced-audit组件,单击组件右下方的卸载,按照页面提示完成卸载。
相关文档
关于ack-advanced-audit的发布记录及说明,请参见ack-advanced-audit。
API Server审计日志功能能够帮助集群管理人员排查“什么人在什么时间对什么资源做了什么操作”,请参见使用集群API Server审计功能。