使用容器内部操作审计功能

容器内部操作审计功能可以方便您审计组织内成员或应用程序进入容器后执行的命令操作。本文介绍如何使用容器内部操作审计功能,以及如何通过日志服务收集分析审计日志,并根据需求为审计日志设置自定义的告警规则。

计费说明

容器内部操作审计功能当前处于公测中,可以免费使用。开通容器内部操作审计功能后,使用日志服务SLS的相关功能,会产生相关费用。日志服务相关计费信息,请参见计费概述

使用限制

  • 集群类型:仅支持ACK集群Pro版ACK集群基础版ACK专有集群

  • 集群版本及操作系统限制:仅支持内核版本大于4.19的Alibaba Cloud Linux、Ubuntu操作系统。

    • Alibaba Cloud Linux:集群版本为1.18及以上。

    • Ubuntu:

      • 集群版本为1.30及以上。如需升级集群,请参见手动升级集群

      • 目前不支持CPFS存储卷、镜像加速插件、安全加固等功能。

步骤一:启用容器内部操作审计功能

您可以通过安装logtail-ds组件和ack-advanced-audit组件启用容器内部操作审计功能。

  • logtail-ds组件:将审计日志收集到日志服务并创建默认的审计报表。

  • ack-advanced-audit组件:实现容器内操作审计。

容器内部操作审计功能启用后,默认将在logtail-ds组件使用的日志Project中创建一个名为advaudit-${cluster_id}的日志库,用于保存审计日志。该日志库数据的保存时间为180天。如需修改日志保存时间,请参见管理Logstore

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,在日志与监控页签定位logtail-ds组件,在安全页签定位ack-advanced-audit组件,并按照页面提示完成安装。

步骤二:查看审计报表

容器内部操作审计功能启用后,默认将在日志Project下创建一个名为Kubernetes容器内部操作审计的报表。

  1. 登录日志服务控制台

  2. 在Project列表区域,选择集群使用的日志Project,单击名称进入日志Project页面。

  3. 在页面左侧的图标栏单击仪表盘仪表盘图标,然后单击Kubernetes容器内部操作审计查看审计报表内容。

    • 查看进入Pod容器的次数以及相关Pod信息。报表1

    • 执行操作的Kubernetes操作账号信息、进入容器后执行的命令列表以及常见的高危列表。报表2风险列表报表

步骤三:查看详细日志记录

您可以通过以下两种方式查看详细的日志记录。

  • 在审计报表页面查看:适用于查看最近的单个事件的日志记录。

  • 在日志库页面通过查询语句查看:适用于复杂场景,查看更多的历史信息以及历史事件。

在审计报表页面查看

Kubernetes容器内部操作审计报表页面,通过单击风险程序操作列表区域的traceIdeventId表格列的链接,查看对应审计日志的详细信息。

  • 单击traceId表格列的链接,可以查看单次进入容器后执行的所有操作命令的审计日志。

  • 单击eventId表格列的链接,可以查看执行的单个命令的详细信息。

在日志库页面通过查询语句查看

日志库页面,通过查询语句查看详细的审计日志记录。

  1. 登录日志服务控制台

  2. 在Project列表区域,选择集群使用的日志Project,单击名称进入日志Project页面。

  3. 日志存储 > 日志库页签中,单击名为advaudit-${cluster_id}的日志库(Logstore)。

    advaudit-${cluster_id}中,${cluster_id}为您的集群ID。

  4. 在输入框中输入查询和分析语句。

    • 查询进入某个Pod的容器后执行的命令操作审计日志:输入* and k8s.pod.namespace: <namespace> and k8s.pod.name: <pod_name>,将<namespace>替换为Pod所在的命名空间,<pod_name>替换为Pod的名称。

    • 查询执行指定程序的操作审计日志:输入* and process.name: <name>,将<name>替换为待查找的程序名称。

      更多查询统计方式,请参见日志服务查询分析方法

  5. 单击15分钟(相对),设置查询分析的时间范围。

  6. 单击查询/分析,查看查询分析结果。

(可选)步骤四:配置操作审计告警

通过日志服务的告警功能,您可以配置容器内部操作审计的实时告警,便于监控容器内关键的操作事件。告警方式支持短信、钉钉机器人、邮件、自定义Webhook和通知中心。本文以配置钉钉告警的方式,介绍如何配置容器内部操作审计告警。更多告警配置方式,请参见告警

  1. 登录日志服务控制台

  2. 进入Webhook集成页面。

    1. 在Project列表区域,单击目标Project。

    2. 在左侧导航栏中,单击告警

    3. 告警中心页面,单击通知对象页签,然后单击Webhook集成

  3. 创建Webhook。

    1. Webhook集成页面,单击新建

    2. 新建Webhook对话框中,配置如下配置项,然后单击确认

      配置项

      描述

      标识符

      Webhook的唯一标识,不可重复。本示例配置为ack-container-operation-audit-alert

      名称

      Webhook名称。本示例配置为Kubernetes容器内部操作审计告警

      类型

      Webhook类型。本示例选择钉钉

      请求地址

      Webhook URL地址。

      在钉钉侧创建自定义机器人,并获取Webhook URL地址。更多信息,请参见自定义机器人接入

  4. 新建内容模板。

    1. 告警中心页面,单击通知策略页签,然后单击内容模板

    2. 内容模板页面,单击创建

    3. 配置内容模板的ID和名称,然后配置钉钉告警通知的标题和发送内容。

      关于添加内容模板的更多信息,请参见创建内容模板。本文需配置两个内容模板,具体配置内容如下。

      ID

      名称

      标题

      发送内容

      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})]
  5. 配置告警。

    1. Kubernetes容器内部操作审计报表页面,单击告警 > 新建告警

      告警

    2. 告警监控规则页面,配置Kubernetes进入容器告警Kubernetes进入容器后执行风险程序告警的告警规则。配置完成后,单击确定

      以下配置项均为示例值,请根据实际需求设置。

      • Kubernetes进入容器告警的告警规则

        配置项

        描述

        规则名称

        Kubernetes进入容器告警

        检查频率

        固定间隔:1分钟

        查询统计

        单击右侧添加,然后单击高级配置页签,配置如下信息。配置完成后,单击确认

        • 日志库:搜索并选中advaudit-${cluster_id},例如advaudit-c76da730c08ca45adb90fad86fb74****。

        • 查询区间:本示例选中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

        触发条件

        选择当有数据时,严重程度:报告

        告警策略

        极简模式。需配置如下信息。

        • 渠道:选择钉钉

        • 选择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')

        触发条件

        有数据时,严重程度:

        告警策略

        极简模式。需配置如下信息。

        • 渠道:选择钉钉

        • 选择Webhook:选择Kubernetes容器内部操作审计告警

        • 提醒方式:选择不提醒

        • 内容模板:选择Kubernetes进入容器后执行风险程序告警

        • 发送时段:选择任意

        • 自动分派:默认关闭。

  6. 测试告警规则。

    1. 通过kubectl exec -it <pod_name> bash命令进入容器,触发Kubernetes进入容器告警的告警规则。告警信息如下图所示。

      进入容器告警

    2. 进入容器后,通过touch a.txt && rm a.txt命令,触发Kubernetes进入容器后执行风险程序告警的告警规则。告警信息如下图所示。

      命令执行告警

关闭容器内部操作审计功能

您可以通过卸载ack-advanced-audit组件关闭容器内部操作审计功能。

重要

关闭容器内部操作审计功能,不会删除自动创建的advaudit-${cluster_id}日志库,您需要登录日志服务控制台手动删除该日志库,请参见删除Logstore

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击日志与监控页签,找到ack-advanced-audit组件,单击组件右下方的卸载,按照页面提示完成卸载。

相关文档