總覽
本文說明如何使用 Google Distributed Cloud (僅限軟體) 的 Cloud 稽核記錄。Google Distributed Cloud 會使用 Kubernetes 稽核記錄,依時間順序記錄對叢集 Kubernetes API 伺服器發出的呼叫。稽核記錄可用於調查可疑的 API 要求,以及收集統計資料。如要瞭解 GKE On-Prem API 的稽核記錄,請參閱「Cloud API 稽核記錄」。
關於 Cloud 稽核記錄
稽核記錄會寫入 Google Cloud 專案的 Cloud 稽核記錄。與寫入磁碟或在本機記錄系統中擷取記錄檔相比,寫入 Cloud 稽核記錄具有多項優點:
- 所有叢集的稽核記錄都可以集中管理。
- 寫入 Cloud 稽核記錄的記錄項目無法變更。
- Cloud 稽核記錄項目會保留 400 天。
- Google Distributed Cloud 的價格已包含 Cloud Audit Logs 功能。
- 您可以設定 Google Distributed Cloud,將記錄寫入磁碟或 Cloud 稽核記錄。
以磁碟為基礎的稽核記錄
根據預設,稽核記錄會寫入永久磁碟,因此 VM 重新啟動和升級不會導致記錄消失。
如果未啟用進階叢集:
Google Distributed Cloud 最多會保留 12 GB 的稽核記錄項目。
如果啟用進階叢集
Google Distributed Cloud 最多會保留 1 GB 的稽核記錄項目。
Cloud 稽核記錄
如果為叢集啟用 Cloud Audit Logs,叢集 Kubernetes API 伺服器的管理員活動稽核記錄項目會傳送至 Google Cloud,並使用您在叢集設定檔的 cloudAuditLogging.projectID 欄位中指定的 Google Cloud 專案。這個專案稱為「稽核記錄專案」 Google Cloud 。
稽核記錄專案必須與車隊主機專案相同。
為緩衝處理記錄項目並寫入 Cloud 稽核記錄,Google Distributed Cloud 會將 audit-proxy Pod 部署至管理員叢集。這個元件也可做為使用者叢集上的補充資訊容器。
限制
Cloud 稽核記錄有下列限制:
- 不支援資料存取記錄 (取得、列出、監看要求)。
- 不支援修改 Kubernetes 稽核政策。
- Cloud 稽核記錄無法在長時間網路中斷期間正常運作。如果記錄項目無法匯出至 Google Cloud,系統會將這些項目緩存在 10 GB 的磁碟緩衝區中。如果緩衝區已滿,系統就會捨棄最舊的項目。
- 一個專案最多可支援約 1000 個服務帳戶,用於 Cloud 稽核記錄。多個叢集可使用同一個服務帳戶。
啟用 Anthos Audit API
在稽核記錄專案中啟用 Anthos Audit API。
建立 Cloud 稽核記錄服務帳戶
您已建立一或多個服務帳戶,用於 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 稽核記錄類似。如果忘記這麼做,請按照這份指南進行清理。
建立已啟用 Cloud 稽核記錄的管理員叢集
您只能在首次建立管理員叢集時,為管理員叢集啟用 Cloud 稽核記錄。您無法修改現有管理員叢集,以啟用 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 稽核記錄的使用者叢集
請參閱「建立使用者叢集」。
在使用者叢集設定檔中,填寫
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 稽核記錄
只有在註冊使用者叢集的 Google Cloud 專案中,才能啟用 Cloud 稽核記錄。
如果現有使用者叢集尚未註冊,請先按照下列步驟註冊,再啟用 Cloud 稽核記錄:
在使用者叢集設定檔中新增
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 稽核記錄的使用者叢集」。cloudAuditLogging區段中的projectID必須與gkeConnect區段中的相同。更新叢集:
gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
為現有使用者叢集停用 Cloud 稽核記錄
在使用者叢集設定檔中,刪除
cloudAuditLogging區段。更新使用者叢集:
gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [USER_CLUSTER_CONFIG]
存取稽核記錄
以磁碟為基礎的稽核記錄
您可以在 /var/log/kube-audit/kube-apiserver-audit.log 下的控制層節點上,找到管理員叢集的稽核記錄。使用者叢集的稽核記錄位於名為 PersistentVolumeClaim 的 kube-audit-kube-apiserver-0 中。您可以在自己的 Pod 中透過 volumes 項目存取這項資料:
為管理員叢集新增這個項目:
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 稽核記錄
控制台
前往 Google Cloud 控制台「Logging」選單的「Logs Explorer」頁面。
如果開啟的是舊版記錄檢視器頁面,請從「升級」下拉式選單中選擇「升級至新的記錄檔探索工具」。
在「Query」(查詢) 欄位中按一下,然後輸入查詢。
在「Query」(查詢) 欄位中輸入下列查詢:
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 稽核記錄的行為取決於靜態設定的 Kubernetes 稽核記錄政策。系統不支援變更這項政策,藉此修改 Cloud Audit Logs 行為。