帮助手册

Kubernetes 审计日志

Kubernetes 审计日志按时间顺序记录集群内发生的一切。这包括审计用户活动,以及控制平面、节点守护进程、集群服务等组件向 Kubernetes API 发出的每个调用以及 Kubernetes API 调用本身。

Kubernetes 审计日志是由 API 服务器提供的结构化 JSON 输出,包含丰富的元数据信息。使用 Site24x7 AppLogs 监控 Kubernetes 审计日志,可以更好地了解您的 Kubernetes 集群环境。

启用和监控审计日志可以帮助您:

  • 获取谁在何时何地做了什么的详细信息。
  • 调试集群中的问题。
  • 排查与权限和特权相关的 RBAC 策略问题。

审计策略和审计后端

审计策略和后端是您必须在 API 服务器中设置的两种基本配置,用于输出审计日志。

审计策略:审计策略定义了应记录哪些事件以及应包含哪些数据。audit-policy.yaml 文件定义了包含您要记录的 API 请求类型的规则。审计日志根据审计策略配置进行捕获。

审计后端:审计事件根据策略规则进行处理,后端将审计事件推送到以下外部存储:

  • 日志后端,将事件写入日志文件(在本地部署云端环境中均可使用)。
  • Webhook 后端,将事件发送到外部 HTTP API,而非本地文件。

请参阅此 Kubernetes 审计文档以了解更多信息。

Note

请按照与您要配置的审计后端(日志/Webhook)相关的说明进行操作。

日志后端配置

Kubernetes 审计日志默认情况下处于禁用状态。您可以在以下环境中启用或禁用审计日志:

Note

请按照与您要配置的环境(本地部署/云端)相关的说明进行操作。

本地部署

按照以下三个步骤在本地部署环境中启用和配置审计日志:

步骤 1:创建审计策略

/etc/kubernetes/audit-policy.yaml 文件路径创建策略文件 audit-policy.yaml。由于 API 服务器会处理策略文件中定义的第一条匹配规则,请将特定规则放在顶部,后跟通用规则。

以下是官方 Kubernetes 文档中的示例策略文件。

apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
  - "RequestReceived"
rules:
  # Log pod changes at RequestResponse level
  - level: RequestResponse
    resources:
    - group: ""
      # Resource "pods" doesn't match requests to any subresource of pods,
      # which is consistent with the RBAC policy.
      resources: ["pods"]
  # Log "pods/log", "pods/status" at Metadata level
  - level: Metadata
    resources:
    - group: ""
      resources: ["pods/log", "pods/status"]

  # Don't log requests to a configmap called "controller-leader"
  - level: None
    resources:
    - group: ""
      resources: ["configmaps"]
      resourceNames: ["controller-leader"]
 
  # Don't log watch requests by the "system:kube-proxy" on endpoints or services
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
    - group: "" # core API group
      resources: ["endpoints", "services"]

  # Don't log authenticated requests to certain non-resource URL paths.
  - level: None
    userGroups: ["system:authenticated"]
    nonResourceURLs:
    - "/api*" # Wildcard matching.
    - "/version"

  # Log the request body of configmap changes in kube-system.
  - level: Request
    resources:
    - group: "" # core API group
      resources: ["configmaps"]
    # This rule only applies to resources in the "kube-system" namespace.
    # The empty string "" can be used to select non-namespaced resources.
    namespaces: ["kube-system"]

  # Log configmap and secret changes in all other namespaces at the Metadata level.
  - level: Metadata
    resources:
    - group: "" # core API group
      resources: ["secrets", "configmaps"]

  # Log all other resources in core and extensions at the Request level.
  - level: Request
    resources:
    - group: "" # core API group
    - group: "extensions" # Version of group should NOT be included.

  # A catch-all rule to log all other requests at the Metadata level.
  - level: Metadata
    # Long-running requests like watches that fall under this rule will not
    # generate an audit event in RequestReceived.
    omitStages:
      - "RequestReceived"

步骤 2:定义审计策略和日志文件路径

您只需在主节点上启用审计日志,因为 kube-apiserver 是托管在主节点上的集群控制平面的一部分。在 /etc/kubernetes/manifests/kube-apiserver.yaml 文件中配置以下标志。

--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log

按如下方式更新配置文件中的 volumeMounts 和 volumes 部分:

volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
volumes:
- hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
name: audit
- hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
name: audit-log

步骤 3:在 Site24x7 AppLogs 中创建日志配置文件

  1. 登录您的 Site24x7 账户。
  2. 下载并在 Kubernetes 集群主节点上安装 Site24x7 服务器监控 agent(Linux)。
  3. 转到管理 > AppLogs > 日志配置文件 > 添加日志配置文件
  4. 选择日志类型下拉列表中选择 Kubernetes 审计日志
  5. /var/log/kubernetes/audit/audit.log 添加到要搜索日志的文件列表中。

    就是这样。您已准备好在本地部署环境中使用 Site24x7 AppLogs 监控审计日志。

云端

查看以下内容以启用或禁用以下服务的审计日志:

  • Azure Kubernetes Service(AKS)
  • Amazon Elastic Kubernetes Service(EKS)

Azure Kubernetes Service 日志记录

按照以下说明在 Azure Kubernetes Service(AKS)上启用或禁用日志记录:

步骤 1:创建日志配置文件

在 Site24x7 Web 控制台中,导航到管理 > AppLogs > 日志配置文件 > 添加日志配置文件,并输入以下内容:

  1. 配置文件名称字段中输入日志配置文件的名称
  2. 选择日志类型下拉列表中选择 Kubernetes 审计日志
  3. 日志来源下拉列表中选择 Azure Functions
  4. 日志时区选择 UTC
  5. 单击保存

步骤 2:使用 Azure 资源管理器(ARM)模板配置 Azure 资源

按照 Azure 诊断日志文档中的说明,使用 ARM 模板配置 Azure 资源。在上述文档中填写自定义部署页面中的详情(步骤 7 和 8)时,请确保针对 Kubernetes 审计日志编辑以下特定内容:

  • 资源组:创建一个名称类似于 Site24x7-AKS-Audit-Logs 的新资源组。
  • LogTypeConfig:从您已在 Site24x7 中创建的日志配置文件页面(管理 > AppLogs > 日志配置文件 > <Kubernetes 审计日志配置文件名称>)复制值。

步骤 3:启用审计日志并转发到 Site24x7

  1. 登录您的 Azure 门户。
  2. 转到 Kubernetes 服务,选择您的 Kubernetes 集群,然后单击诊断设置

  3. 日志下选择 Kubernetes 审计,在目标详情下选择流式传输到事件中心,然后选择事件中心命名空间

    现在,您已准备好使用 Site24x7 AppLogs 监控 Azure Kubernetes Service 环境中的审计日志。

Amazon Elastic Kubernetes Service 日志记录

按照以下步骤在 Amazon Elastic Kubernetes Service(EKS)上启用或禁用日志记录:

步骤 1:启用 Amazon EKS 审计日志

请参阅此官方文档中的指南以启用或禁用 Amazon EKS 审计日志

步骤 2:采集 CloudWatch 日志

  • 在 Site24x7 Web 控制台中,导航到管理 > AppLogs > 日志配置文件 > 添加日志配置文件,然后:
    • 配置文件名称字段中输入日志配置文件的名称
    • 选择日志类型下拉列表中选择 Kubernetes 审计日志
    • 日志来源下拉列表中选择 Amazon Lambda
    • 单击保存
  • 按照此文档AWS 设置部分中的说明采集 CloudWatch 日志并在 Site24x7 中查看。但是,请确保选择 Kubernetes 审计日志、其 logtypeconfig,以及将日志组选择为 /aws/eks/<my-cluster>/cluster/,然后继续按文档中定义的说明操作。

现在,您已准备好使用 Site24x7 AppLogs 监控 Amazon Elastic Kubernetes Service 环境中的审计日志。

Webhook 后端配置

按照以下步骤配置 Webhook 后端:

配置步骤

  1. 按照本文档中日志后端配置部分所述,创建并定义审计策略。
  2. 按照此文档中的说明创建日志类型。
    • 对于日志类型,输入 Kubernetes 审计日志。这将自动填充其余字段。
    • 确保已启用 API 上传
    • 复制 HTTPS 端点 URL 以配置 Webhook 后端。
    • 单击保存
  3. 在路径 /etc/kubernetes/pki/audit-webhook.yaml 中创建一个新文件,并复制以下内容。确保在 YAML 文件的 server 键中提供您在上述步骤中复制的 HTTPS 端点 URL。
    apiVersion: v1
    kind: Config
    preferences: {}
    clusters:
    - name: kubernetes
    cluster:
    server: "https://logc.site24x7.com/event/receiver/M3NjE4ODc234242342wfwew3zMDhmMTZkYTVmM2I2N2MxOGZiZC9rdWJlY="
    contexts:
    - context:
    cluster: kubernetes
    user: kubernetes-admin
    name: kubernetes-admin@kubernetes
    current-context: kubernetes-admin@kubernetes
    preferences: {}
    users: []
  4. 要配置后端 Webhook 审计,请在 /etc/kubernetes/manifests/kube-apiserver.yaml 文件中设置以下标志:

    --audit-webhook-config-file=/etc/kubernetes/pki/audit-webhook.yaml flag
Note

您无需为 Webhook 后端配置创建日志配置文件。此外,您也无需定义审计日志路径,因为它将审计事件发送到 HTTPS 端点,而不是本地文件。

现在,您已准备好使用 Site24x7 AppLogs 监控 Amazon Elastic Kubernetes Service 环境中的审计日志。

审计日志使用场景

以下是一个示例审计事件:

以下是上述示例审计日志中存在的几个重要键。请参阅此文档以查看审计事件中所有可用字段。

描述
user 谁(用户或服务账户)发起了请求
sourceIP 请求从哪里发起
verb 执行了什么操作(get、post、list、watch、patch、delete)
requestURI 标识客户端发送给服务器的请求
objectRef 提供与请求关联的 Kubernetes 对象的详细信息
responseStatus 对发起请求的响应
requestReceivedTimestamp API 服务器首次收到请求的时间
responseObject 提供对用户或服务账户发起的请求的响应的洞察
annotations 提供授权决定及其原因的详细信息
  • user、sourceIP、verb、requestURI、objectRef 和 requestReceivedTimestamp 等键提供了谁在何时何地做了什么的详细信息。
  • responseStatus、responseObject 和 annotations 等键提供了授权和收到的响应信息,帮助您排查权限和特权相关问题。

解读仪表板

查看仪表板中的状态码统计小组件时,会看到 400 以上的状态码。

要进一步调查,请单击 4XX 错误码,这将引导您查看导致此错误的事件。您可以使用下面的查询语言过滤器来确定根本原因。

logtype="Kubernetes Audit Logs" and responsestatus_code=403 and verb="list" groupby username
logtype="Kubernetes Audit Logs" and responsestatus_code=403 and verb="list" and username="system:serviceaccount:default:demo"

demo 用户没有访问 pod 的权限,导致了该错误。您可以据此采取相应的补救措施。 

Note

通过 Site24x7 的 Kubernetes 事件日志,您可以查看并管理集群、Pod 和节点的所有事件日志。

故障排除

以下是一些技巧和方法,可帮助您缓解配置期间可能遇到的问题:

如何确认审计日志条目已创建?

日志后端配置

  1. 按照本文档中"日志后端配置"部分定义的说明操作,并等待几秒钟以使对 Kube-apiserver 配置文件的更改生效。
  2. 运行以下命令检查 API 服务器是否正在运行:
    kubectl get pods -n kube-system -w
  3. 现在运行以下命令打开日志文件,并检查审计条目是否已创建:
    sudo cat /var/log/kubernetes/audit/audit.log
  4. 如果您看到类似于上述示例日志的日志,则确认审计条目正在被创建。

Webhook 后端配置

  1. 按照本文档中"Webhook 后端配置"部分定义的说明操作,并等待几秒钟以使对 Kube-apiserver 配置文件的更改生效。
  2. 运行以下命令检查 API 服务器是否正在运行:
    kubectl get pods -n kube-system -w
  3. 由于 Webhook 后端将事件发送到外部 HTTP API,请等待几秒钟(最多一分钟),登录我们的 Web 客户端,并确认审计条目。

审计策略的通用指南

每个 Kubernetes API 调用包含 RequestReceived、ResponseStarted、ResponseComplete 和 Panic 等阶段。日志根据策略中定义的规则和审计级别(None、Metadata、Request 和 RequestResponse)进行记录。

  1. Request 和 RequestResponse 级别可深入了解您的 API 调用,但会增加内存消耗,从而增加审计日志存储空间。
  2. 使用 Metadata 排除敏感信息(如身份验证令牌)。

相关日志类型

本文档对您有帮助吗?

您愿意帮助我们改进文档吗?请告诉我们哪些方面可以做得更好。


很抱歉本文档未能让您满意。我们希望了解可以从哪些方面改进您的体验。


感谢您抽出时间分享反馈。我们将利用您的反馈来改进在线帮助资源。

短链接已复制!