查看服务,API 服务器和工作程序节点日志
通过审计日志,您能够更好地了解集群中的用户启动了哪些操作,这可以帮助您对问题进行故障诊断或报告符合行业和内部标准的情况。
Kubernetes API 服务器审计日志
为了监控用户发起的、Kubernetes 在您的集群内进行的行政活动,您可以收集审计事件并将其转发到 IBM Cloud Logs 或外部服务器,这些审计事件是通过您的 Kubernetes API服务器传递的。
注意事项和先决条件
在设置 Kubernetes API 审计配置之前,请查看以下信息。
-
VPC 群集版本 4.15 及更高版本:审计日志使用 Red Hat OpenShift 审计策略配置文件
default
(默认)和WriteRequestBodies
(冗长)。 有关更多信息,请参阅 审计日志策略。 -
所有其他集群版本: 审计日志使用
kube-samples
存储库中的openshift-audit
策略。
无法修改缺省策略或应用您自己的定制策略。
- 有关 Kubernetes 审计日志和详细信息,请参阅 Kubernetes 文档。
- 只能在集群中创建一个审计 Webhook。
- 您必须具有 Red Hat OpenShift on IBM Cloud 集群的 管理员 IBM Cloud IAM 平台访问角色。
要开始使用,请遵循指示信息将 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。
-
将公共 IBM Cloud 映像的全局容器注册表设定为目标。
ibmcloud cr region-set global
-
可选:有关
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
-
创建一个名为
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
-
在群集的
ibm-kube-audit
命名空间中创建部署。kubectl create -f ibmcloud-kube-audit.yaml
-
验证
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
-
验证
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
-
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定
--admin
选项以将client-certificate
和client-key
文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。ibmcloud oc cluster config --cluster <cluster> --admin
-
查询集群的
certificate-authority
并将其保存到文件中。ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
通过运行
oc config view
命令来查看当前配置,并查看client-certificate
和client-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
-
配置审计 Webhook 并指定
certificate-authority
,client-certificate
和client-key
。 在 步骤 8 中检索到certificate-authority
,而在上一步中检索到client-certificate
和client-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]
- 验证是否已在集群中创建审计 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
- 通过刷新集群主节点,将 Webhook 应用于 Kubernetes API 服务器。 主节点刷新可能需要几分钟时间。
ibmcloud oc cluster master refresh --cluster <cluster_name_or_ID>
-
主节点刷新时,供应 IBM Cloud Logs 的实例,并将日志记录代理程序部署到集群中的每个工作程序节点。 要将日志从集群内部转发到 IBM Cloud Logs 服务,需要日志记录代理程序。 如果已在集群中设置日志记录代理程序,那么可以跳过此步骤。
-
主节点刷新完成并且日志记录代理程序在工作程序节点上运行后,可以在 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
映像来转发日志。 此映像仅用于演示目的,不应在生产环境中使用。 对于生产解决方案,请配置并维护您自己的日志转发映像。
开始之前,请确保已查看 注意事项和先决条件。
-
创建新目录
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 文档。 -
从
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
-
创建名为
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
列出。 -
创建部署和服务。
kubectl create -f kube-audit-forwarder-remote-private-ip.yaml
-
验证
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
-
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。 确保指定
--admin
选项以将client-certificate
和client-key
文件下载到本地计算机。 这些文件稍后用于配置审计 Webhook。ibmcloud oc cluster config --cluster <cluster> --admin
-
查询集群的
certificate-authority
并将其保存到文件中。ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
通过运行
oc config view
命令来查看当前配置,并查看client-certificate
和client-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
-
配置审计 Webhook,并指定在步骤 5-7 中检索到的
certificate-authority
,client-certificate
和client-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]
-
验证是否已在集群中创建审计 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
- 通过刷新集群主节点,将 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 登录
为工作程序节点设置日志转发
服务审计日志
默认情况下,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
警报。
要查看警报,请执行以下操作:
登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 从 Red Hat OpenShift on IBM Cloud中,选择 管理员 视图。
- 单击 Observe > Alerting > AuditWebhookError。
- 要为此警报创建通知,请参阅 将通知发送到外部系统。