概览
本文档介绍如何将 Cloud Audit Logs 用于 Google Distributed Cloud(仅限软件)。Google Distributed Cloud 利用 Kubernetes 审核日志记录功能,该功能会按时间顺序记录对集群 Kubernetes API 服务器进行的调用。审核日志对于调查可疑的 API 请求和收集统计信息非常有用。如需了解 GKE On-Prem API 的审核日志记录,请参阅 Cloud API 审核日志记录。
Cloud Audit Logs 简介
审核日志会写入项目中的 Cloud Audit Logs。 Google Cloud 与写入磁盘或在本地日志记录系统中捕获日志相比,写入 Cloud Audit Logs 具有多个优势:
- 所有集群的审核日志都可以集中化。
- 写入 Cloud Audit Logs 的日志条目是不可变的。
- Cloud Audit Logs 条目会保留 400 天。
- Cloud Audit Logs 功能包含在 Google Distributed Cloud 的价格中。
- 您可以配置 Google Distributed Cloud,以将日志写入磁盘或 Cloud Audit Logs。
基于磁盘的审核日志记录
默认情况下,审核日志会写入永久性磁盘,这样虚拟机重启和升级就不会导致日志消失。
如果未启用高级集群:
Google Distributed Cloud 最多可保留 12 GB 的审核日志条目。
如果已启用高级集群
Google Distributed Cloud 最多可保留 1 GB 的审核日志条目。
Cloud Audit Logs
如果您为集群启用 Cloud Audit Logs,则集群的 Kubernetes API 服务器的管理员活动审核日志条目会发送到 Google Cloud(使用您在集群配置文件的 cloudAuditLogging.projectID 字段中指定的 Google Cloud 项目)。此 Google Cloud 项目被称为您的
审核日志记录项目。
审核日志记录项目必须与舰队宿主项目相同。
为了将日志条目缓冲并写入到 Cloud Audit Logs,Google Distributed Cloud 会将一个 audit-proxy Pod 部署到管理员集群中。此组件也可用作用户集群的边车容器。
限制
Cloud Audit Logs 存在以下限制:
- 不支持数据访问日志记录(get、list、watch 请求)。
- 不支持修改 Kubernetes 审核政策。
- Cloud Audit Logs 不能应对长时间的网络中断。如果无法将日志条目导出到 Google Cloud,则它们将缓存在 10GB 磁盘缓冲区中。如果该缓冲区已满,则系统会丢弃最早的条目。
- 一个项目最多可以支持大约 1000 个用于 Cloud Audit Logs 的服务账号。多个集群可以使用同一服务帐号。
启用 Anthos Audit API
在审核日志记录项目中启用 Anthos Audit API。
为 Cloud Audit Logs 创建服务账号
您已经创建了一个或多个服务账号,以便于使用 Google Distributed Cloud。对于此功能,您需要额外创建一个服务账号,称为审核日志记录服务账号。
创建您的审核日志记录服务账号:
gcloud iam service-accounts create audit-logging-service-account
为 Cloud Audit Logs 服务账号创建 JSON 密钥文件:
gcloud iam service-accounts keys create audit-logging-key.json \ --iam-account AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL
其中,AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL 是您的服务账号的电子邮件地址。
将
audit-logging-key.json保存在管理员工作站上其他服务账号密钥所在的位置。
警告:在删除此服务账号之前,务必先在集群配置中将其替换为新服务账号!此过程与为现有用户集群启用 Cloud Audit Logs类似。如果您忘记执行此操作,请按照清理指南进行操作。
创建已启用 Cloud Audit Logs 的管理员集群
只有在一开始创建管理员集群时,您才能为该管理员集群启用 Cloud Audit Logs。您不能修改现有管理员集群来启用 Cloud Audit Logs。
请参阅创建管理员集群。
在管理员集群配置文件中,填写
cloudAuditLogging部分。将
cloudAuditLogging.projectID设置为您的审核日志记录项目的 ID。将
cloudAuditLogging.clusterLocation设置为要存储审核日志的 Google Cloud 区域。为了缩短延迟时间,请选择靠近本地数据中心的区域。将
cloudAuditLogging.serviceAccountKeyPath设置为审核日志记录服务账号的 JSON 密钥文件的路径。
例如:
cloudAuditLogging:
projectID: "my-project"
clusterLocation: "us-west1"
serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"
继续照常创建集群。
创建已启用 Cloud Audit Logs 的用户集群
请参阅创建用户集群。
在用户集群配置文件中,填写
cloudAuditLogging部分。将
cloudAuditLogging.projectID设置为您的审核日志记录项目的 ID。将
cloudAuditLogging.clusterLocation设置为要存储审核日志的 Google Cloud 区域。为了缩短延迟时间,请选择靠近本地数据中心的区域。将
cloudAuditLogging.serviceAccounKeyPath设置为 Cloud Audit Logs 服务账号的 JSON 密钥文件的路径。确保已填写
gkeConnect部分,并且gkeConnect.projectID与cloudAuditLogging.projectID相同。
例如:
gkeConnect:
projectID: "my-project"
registerServiceAccountKeyPath: "/my-key-fokder/connect-register-key.json"
cloudAuditLogging:
projectID: "my-project"
clusterLocation: "us-west1"
serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"
继续照常创建集群。
为现有用户集群启用 Cloud Audit Logs
您只能在注册用户集群的 Google Cloud 项目 中启用 Cloud Audit Logs。
如果现有用户集群未注册,请在启用 Cloud Audit Logs 之前按照以下步骤注册:
将
gkeConnect部分添加到用户集群配置文件中。例如:gkeConnect: projectID: "my-project" registerServiceAccountKeyPath: "/my-key-fokder/connect-register-key.json"更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
注册用户集群后,请按照以下步骤启用 Cloud Audit Logs:
填写用户集群配置文件文件的
cloudAuditLogging部分。如需详细了解各个字段,请参阅创建已启用 Cloud Audit Logs 的用户集群。cloudAuditLogging部分中的projectID必须与gkeConnect部分中的相同。更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
为现有用户集群停用 Cloud Audit Logs
在用户集群配置文件中,删除
cloudAuditLogging部分。更新用户集群:
gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [USER_CLUSTER_CONFIG]
访问审核日志
基于磁盘的审核日志记录
您可以在 /var/log/kube-audit/kube-apiserver-audit.log 下的控制平面节点上查找管理员集群的审核日志。用户集群的审核日志位于名为 kube-audit-kube-apiserver-0 的 PersistentVolumeClaim 中。您可以通过 volumes 条目在您自己的 Pod 中访问此数据:
为管理员集群添加此条目:
volumes:
- name: kube-audit
hostPath:
path: /var/log/kube-audit
type: ""
为用户集群添加此条目:
volumes:
- name: kube-audit
persistentVolumeClaim:
claimName: kube-audit-kube-apiserver-0
如需在相应的管理员集群节点(且仅限此节点)上调度 Pod,您需要在 Pod 规范中添加 nodeSelector 和 tolerations 部分,如下所示:
spec:
nodeSelector:
node-role.kubernetes.io/master: ''
tolerations:
- key: node-role.kubernetes.io/master
value: ""
effect: NoSchedule
对于用户集群,请将 namespace 设置为用户集群名称,然后将 nodeName 设置为与 kube-apiserver-0 相同:
spec:
nodeName: NODE_NAME
如需指出 nodeName 为 kube-apiserver-0,请运行以下命令:
kubectl get pod kube-apiserver-0 -n USER_CLUSTER_NAME --kubeconfig kubeconfig -o jsonpath='{.spec.nodeName}'
每个审核日志的文件名都有一个时间戳,用于指明文件的轮替时间。文件包含该时间和日期之前的审核日志。
访问 Cloud Audit Logs
控制台
在 Google Cloud 控制台中,前往 日志记录 菜单中的 Logs Explorer 页面。
如果旧版日志查看器 页面打开,请从升级 下拉菜单中选择升级到新的 Logs Explorer 。
点击查询 字段,输入查询。
在查询 字段中输入以下查询:
resource.type="k8s_cluster" logName="projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity" protoPayload.serviceName="anthosgke.googleapis.com"将
PROJECT_ID替换为您的项目 ID。点击提交查询 以显示来自已配置为登录此项目的集群的所有审核日志。
gcloud
- 列出项目的管理员活动日志中适用于
k8s_cluster资源类型的前两个日志条目:
gcloud logging read \
'logName="projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity" \
AND resource.type="k8s_cluster" \
AND protoPayload.serviceName="anthosgke.googleapis.com" ' \
--limit 2 \
--freshness 300d
- 将
PROJECT_ID替换为您的项目 ID。
输出内容会显示两个日志条目。请注意,对于每个日志条目,logName 字段的值为 projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity,并且 protoPayload.serviceName 等于 anthosgke.googleapis.com。
审核政策
Kubernetes 审核政策定义将哪些事件应记录为日志条目的规则,并指定日志条目应包含的数据。Cloud Audit Logs 行为由静态配置的 Kubernetes 审核日志记录政策决定。不支持更改此政策以修改 Cloud Audit Logs 行为。