IBM Cloud Docs
查看服务,API 服务器和工作程序节点日志

查看服务,API 服务器和工作程序节点日志

通过审计日志,您能够更好地了解集群中的用户启动了哪些操作,这可以帮助您对问题进行故障诊断或报告符合行业和内部标准的情况。

Kubernetes API 服务器审计日志

为了监控用户发起的、Kubernetes 在您的集群内进行的行政活动,您可以收集审计事件并将其转发到 IBM Cloud Logs 或外部服务器,这些审计事件是通过您的 Kubernetes API服务器传递的。

注意事项和先决条件

在设置 Kubernetes API 审计配置之前,请查看以下信息。

  • VPC 群集版本 4.15 及更高版本:审计日志使用 Red Hat OpenShift 审计策略配置文件 default (默认)和 WriteRequestBodies (冗长)。 有关更多信息,请参阅 审计日志策略

  • 所有其他集群版本: 审计日志使用 kube-samples 存储库中的 openshift-audit 策略。

无法修改缺省策略或应用您自己的定制策略。

要开始使用,请遵循指示信息将 Kubernetes API 审计日志 发送到 IBM Cloud 专用网络 中的资源。

将 Kubernetes API审计日志转发到云日志

要将审计日志转发到 IBM Cloud Logs,可使用提供的映像和部署来创建 Kubernetes 审计系统。

以下示例使用 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs 图像将日志转发到 IBM Cloud Logs。 此图片仅供演示之用。 对于生产解决方案,请配置并维护您自己的日志转发映像。

以前,icr.io/ibm/ibmcloud-kube-audit-to-logdna 用于转发日志。 此图片已弃用,支持即将终止。 请更新您的日志转发设置,改为使用 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs

Kubernetes 集群中的审计系统由审计网络钩子、日志收集服务和网络服务器应用程序以及日志代理组成。 Webhook 从集群主节点收集 Kubernetes API 服务器事件。 日志收集服务是 Kubernetes ClusterIP 服务,由公共 IBM Cloud 注册表中的映像创建。 该服务公开了一个简单的 node.js HTTP 网络服务器应用程序,该应用程序仅在专用网络上公开。 网络服务器应用程序会解析来自审计网络钩子的日志数据,并将每条日志创建为唯一的 JSON 行。 最后,日志代理会将日志从网络服务器应用程序转发到 IBM Cloud Logs,您可以在这里查看日志。

开始之前:请确保您已阅读 注意事项和先决条件,并确保您拥有 管理员 IBM Cloud IAM平台访问权限,且该权限 适用于 IBM Cloud Logs。

  1. 将公共 IBM Cloud 映像的全局容器注册表设定为目标。

    ibmcloud cr region-set global
    
  2. 可选:有关 kube-audit 图像的更多信息,请检查 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs

    ibmcloud cr image-inspect icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
    
  3. 创建一个名为 ibmcloud-kube-audit.yaml 的配置文件。 此配置文件可创建日志收集服务和部署,部署会调用 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs 映像来创建日志收集容器。

    OpenShift 集群 (直至 V 4.10 )

    apiVersion: v1
    kind: List
    metadata:
      name: ibmcloud-kube-audit
    items:
      - apiVersion: v1
        kind: Namespace
        metadata:
          name: ibm-kube-audit
      - apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: ibmcloud-kube-audit
          namespace: ibm-kube-audit
          labels:
            app: ibmcloud-kube-audit
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: ibmcloud-kube-audit
          template:
            metadata:
              labels:
                app: ibmcloud-kube-audit
            spec:
              containers:
                - name: ibmcloud-kube-audit
                  image: 'icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs:latest'
                  imagePullPolicy: Always
                  ports:
                    - containerPort: 3000
                  securityContext:
                    allowPrivilegeEscalation: false
                    runAsNonRoot: true
                    capabilities:
                      drop:
                      - ALL
      - apiVersion: v1
        kind: Service
        metadata:
          name: ibmcloud-kube-audit-service
          namespace: ibm-kube-audit
          labels:
            app: ibmcloud-kube-audit
        spec:
          selector:
            app: ibmcloud-kube-audit
          ports:
            - protocol: TCP
              port: 80
              targetPort: 3000
          type: ClusterIP
      - kind: NetworkPolicy
        apiVersion: networking.k8s.io/v1
        metadata:
          name: ibmcloud-kube-audit
          namespace: ibm-kube-audit
        spec:
          podSelector:
            matchLabels:
              app: ibmcloud-kube-audit
          policyTypes:
          - Ingress
          ingress:
          - ports:
            - protocol: TCP
              port: 3000
            from:
            - namespaceSelector:
                matchLabels:
                  kubernetes.io/metadata.name: kube-system
              podSelector:
                matchLabels:
                  app: vpn
    

    OpenShift 集群 V 4.11 和更高版本

    apiVersion: v1
    kind: List
    metadata:
      name: ibmcloud-kube-audit
    items:
      - apiVersion: v1
        kind: Namespace
        metadata:
          name: ibm-kube-audit
          labels:
            pod-security.kubernetes.io/enforce: restricted
            pod-security.kubernetes.io/enforce-version: latest
            pod-security.kubernetes.io/audit: restricted
            pod-security.kubernetes.io/audit-version: latest
            pod-security.kubernetes.io/warn: restricted
            pod-security.kubernetes.io/warn-version: latest
            security.openshift.io/scc.podSecurityLabelSync: "false"
      - apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: ibmcloud-kube-audit
          namespace: ibm-kube-audit
          labels:
            app: ibmcloud-kube-audit
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: ibmcloud-kube-audit
          template:
            metadata:
              labels:
                app: ibmcloud-kube-audit
            spec:
              containers:
                - name: ibmcloud-kube-audit
                  image: 'icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs:latest'
                  imagePullPolicy: Always
                  ports:
                    - containerPort: 3000
                  securityContext:
                    allowPrivilegeEscalation: false
                    runAsNonRoot: true
                    capabilities:
                      drop:
                      - ALL
                    seccompProfile:
                      type: RuntimeDefault
      - apiVersion: v1
        kind: Service
        metadata:
          name: ibmcloud-kube-audit-service
          namespace: ibm-kube-audit
          labels:
            app: ibmcloud-kube-audit
        spec:
          selector:
            app: ibmcloud-kube-audit
          ports:
            - protocol: TCP
              port: 80
              targetPort: 3000
          type: ClusterIP
      - kind: NetworkPolicy
        apiVersion: networking.k8s.io/v1
        metadata:
          name: ibmcloud-kube-audit
          namespace: ibm-kube-audit
        spec:
          podSelector:
            matchLabels:
              app: ibmcloud-kube-audit
          policyTypes:
          - Ingress
          ingress:
          - ports:
            - protocol: TCP
              port: 3000
            from:
            - namespaceSelector:
                matchLabels:
                  kubernetes.io/metadata.name: kube-system
              podSelector:
                matchLabels:
                  app: konnectivity-agent
            - namespaceSelector:
                matchLabels:
                  kubernetes.io/metadata.name: kube-system
              podSelector:
                matchLabels:
                  app: vpn
    
  4. 在群集的 ibm-kube-audit 命名空间中创建部署。

    kubectl create -f ibmcloud-kube-audit.yaml
    
  5. 验证 ibmcloud-kube-audit-service pod 的 STATUS 是否为 Running

    kubectl get pods -n ibm-kube-audit -l app=ibmcloud-kube-audit
    

    示例输出

    NAME                                             READY   STATUS             RESTARTS   AGE
    ibmcloud-kube-audit-c75cb84c5-qtzqd              1/1     Running   0          21s
    
  6. 验证 ibmcloud-kube-audit-service 服务是否已部署在集群中。

    kubectl get svc -n ibm-kube-audit -l app=ibmcloud-kube-audit
    

    示例输出

    NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    ibmcloud-kube-audit-service   ClusterIP   172.21.xxx.xxx   <none>        80/TCP           1m
    
  7. 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定 --admin 选项以将 client-certificateclient-key 文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。

    ibmcloud oc cluster config --cluster <cluster> --admin
    
  8. 查询集群的 certificate-authority 并将其保存到文件中。

    ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
    
  9. 通过运行 oc config view 命令来查看当前配置,并查看 client-certificateclient-key 的输出。

    oc config view --minify
    

    示例输出

    clusters:
    - cluster:
        ...
        ...
        client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem
        client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
    
  10. 配置审计 Webhook 并指定 certificate-authorityclient-certificateclient-key。 在 步骤 8 中检索到 certificate-authority,而在上一步中检索到 client-certificateclient-key

ibmcloud oc cluster master audit-webhook set --cluster CLUSTER --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post --ca-cert CERTIFICATE-AUTHORITY --client-cert CLIENT-CERT --client-key CLIENT-KEY [--policy default|verbose]
  1. 验证是否已在集群中创建审计 Webhook。
ibmcloud oc cluster master audit-webhook get --cluster <cluster_name_or_ID>

示例输出

Server:   https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post   
Policy:   default
  1. 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主节点刷新可能需要几分钟时间。
ibmcloud oc cluster master refresh --cluster <cluster_name_or_ID>
  1. 主节点刷新时,供应 IBM Cloud Logs 的实例,并将日志记录代理程序部署到集群中的每个工作程序节点。 要将日志从集群内部转发到 IBM Cloud Logs 服务,需要日志记录代理程序。 如果已在集群中设置日志记录代理程序,那么可以跳过此步骤。

  2. 主节点刷新完成并且日志记录代理程序在工作程序节点上运行后,可以在 IBM Cloud Logs 中查看 Kubernetes API 审计日志

在集群中设置审计 Webhook 后,可以通过运行 ibmcloud cr image-list --include-ibm | grep ibmcloud-kube-audit-to-ibm-cloud-logs 来监视 kube-audit-to-logdna 映像的版本更新。 要查看当前在集群中运行的映像版本,请运行 oc get pods | grep ibmcloud-kube-audit-to-ibm-cloud-logs 以查找审计 pod 名称,并运行 kubectl describe pod <pod_name> 以查看映像版本。

将 Kubernetes API 审计日志转发到 IBM Cloud 专用网络中的资源

将审计日志转发至集群外的其他资源,该资源可通过 IBM Cloud 专用网络访问,但不是 IBM Cloud Logs。

以下示例使用 haproxytech/haproxy-alpine:2.6 映像来转发日志。 此映像仅用于演示目的,不应在生产环境中使用。 对于生产解决方案,请配置并维护您自己的日志转发映像。

开始之前,请确保已查看 注意事项和先决条件

  1. 创建新目录 kube-audit-forwarder,并在其中创建具有以下内容的文件 haproxy.cfg。 不要忘记将文件中的 <REMOTE-IP>:<REMOTE-PORT> 替换为远程日志使用者的 IP 地址和端口。

    global
      log stdout format raw local0 info
    defaults
      mode http
      timeout client 10s
      timeout connect 5s
      timeout server 10s
      timeout http-request 10s
      log global
    frontend myfrontend
      bind :3000
      default_backend remotelogstash
    # Use remote log consumer IP and port here
    backend remotelogstash
      server s1 <REMOTE-IP>:<REMOTE-PORT> check
    

    如果日志使用者服务器正在实施安全连接 (TLS),那么可以将证书文件添加到此目录,并更改 haproxy.cfg 中的后端部分以使用这些文件。 有关更多信息,请参阅 HAProxy 文档

  2. kube-audit-forwarder 目录的内容创建 configmap。

    kubectl create namespace ibm-kube-audit; kubectl create configmap -n ibm-kube-audit kube-audit-forwarder-cm --from-file=kube-audit-forwarder
    
  3. 创建名为 kube-audit-forwarder-remote-private-ip.yaml 的配置文件。 此配置文件将创建部署和服务,以通过 IBM Cloud 专用网络将审计日志从集群转发到远程资源的 IP 地址。

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      labels:
        app: kube-audit-forwarder
      name: kube-audit-forwarder
      namespace: ibm-kube-audit
    spec:
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: kube-audit-forwarder
      strategy:
        rollingUpdate:
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: kube-audit-forwarder
        spec:
          containers:
          - image: haproxytech/haproxy-alpine:2.6
            imagePullPolicy: IfNotPresent
            name: haproxy
            volumeMounts:
            - name: config-volume
              mountPath: /usr/local/etc/haproxy/haproxy.cfg
              subPath: haproxy.cfg
          volumes:
          - name: config-volume
            configMap:
              name: kube-audit-forwarder-cm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kube-audit-forwarder
      namespace: ibm-kube-audit
    spec:
      selector:
        app: kube-audit-forwarder
      ports:
        - protocol: TCP
          port: 80
          targetPort: 3000
    ---
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: kube-audit-forwarder
      namespace: ibm-kube-audit
    spec:
      podSelector:
        matchLabels:
          app: kube-audit-forwarder
      policyTypes:
      - Ingress
      ingress:
      - ports:
        - protocol: TCP
          port: 3000
        from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: konnectivity-agent
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              app: konnectivity-agent
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              app: vpn
    

    如果在上一步中向 kube-audit-forwarder 添加了证书文件,请不要忘记将 volumeMounts 部分中的那些文件作为 subPath 列出。

  4. 创建部署和服务。

    kubectl create -f kube-audit-forwarder-remote-private-ip.yaml
    
  5. 验证 kube-audit-forwarder 部署和服务是否部署在群集中。

    kubectl get svc -n ibm-kube-audit
    

    示例输出

    NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    ...
    kube-audit-forwarder  ClusterIP   10.xxx.xx.xxx   <none>        80/TCP           1m
    
    kubectl get deployment -n ibm-kube-audit
    

    示例输出

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    ...
    kube-audit-forwarder   1/1     1            1           6m27s
    
  6. 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定 --admin 选项以将 client-certificateclient-key 文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。

    ibmcloud oc cluster config --cluster <cluster> --admin
    
  7. 查询集群的 certificate-authority 并将其保存到文件中。

     ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
    
  8. 通过运行 oc config view 命令来查看当前配置,并查看 client-certificateclient-key 的输出。

    oc config view --minify
    

    示例输出

    clusters:
    - cluster:
        ...
        ...
        client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem
        client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
    
  9. 配置审计 Webhook,并指定在步骤 5-7 中检索到的 certificate-authorityclient-certificateclient-key

    ibmcloud oc cluster master audit-webhook set --cluster <cluster> --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post --ca-cert <certificate-authority> --client-cert <client-certificate> --client-key <client-key> [--policy default|verbose]
    
  10. 验证是否已在集群中创建审计 Webhook。

ibmcloud oc cluster master audit-webhook get --cluster <cluster_name_or_ID>

示例输出

OK
Server:            https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post
Policy:            default
  1. 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主控程序可能需要几分钟才能刷新。
ibmcloud oc cluster master refresh --cluster <cluster_name_or_ID>

在主节点刷新完成后,会将日志发送到日志记录资源的专用 IP 地址。

工作程序节点审计日志

Red Hat OpenShift on IBM Cloud 使用 Linux 审计系统组件 auditd 来监视和记录工作程序节点上的活动。 虽然默认情况下启用工人节点审核,但只有在您将日志转发到 IBM Cloud Logs 实例或外部服务器后,审核数据才可用。

了解工作程序节点审计配置

日志存储在工作程序节点上的 /var/log/audit 目录中。 您可以在 IBM Cloud Logs 或外部服务器上查看日志,前提是您已设置日志转发。

Auditd 收集有关各种事件的日志,包括以下内容:

  • Linux 系统调用 (syscalls)
  • SELinux 拒绝
  • SELinux 策略修改
  • 通过 yum 软件包安装程序进行软件修改
  • Systemd 操作
  • Linux 用户和组修改
  • Netfilter 更改修改
  • SSH 登录

为工作程序节点设置日志转发

参见 将日志转发到 IBM Cloud Logs 实例

服务审计日志

默认情况下,Red Hat OpenShift on IBM Cloud 会生成事件并将其发送至 IBM Cloud Logs。 要查看这些活动,您必须创建一个 IBM Cloud Logs 实例。 欲了解更多信息,请访问 IBM Cloud Logs 活动

在已启用审计的集群中查看 AuditWebhookError 警报

Red Hat OpenShift on IBM Cloud 集群 V 4.10 和更高版本具有在审计 Webhook 崩溃或被删除时触发的 AuditWebhookError 警报。

要查看警报,请执行以下操作:

登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。

  1. 从 Red Hat OpenShift on IBM Cloud中,选择 管理员 视图。
  2. 单击 Observe > Alerting > AuditWebhookError
  3. 要为此警报创建通知,请参阅 将通知发送到外部系统