稽核記錄功能

總覽

本文說明如何使用 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。

啟用 Anthos Audit API

建立 Cloud 稽核記錄服務帳戶

您已建立一或多個服務帳戶,用於 Google Distributed Cloud。如要使用這項功能,您需要建立額外的服務帳戶,也就是稽核記錄服務帳戶

  1. 建立稽核記錄服務帳戶:

    gcloud iam service-accounts create audit-logging-service-account
  2. 為 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 是服務帳戶的電子郵件地址。

  3. audit-logging-key.json 儲存在管理工作站上,與其他服務帳戶金鑰位於相同位置。

警告:刪除這個服務帳戶前,請務必先在叢集設定中將其替換為新服務帳戶!這個程序與為現有使用者叢集啟用 Cloud 稽核記錄類似。如果忘記這麼做,請按照這份指南進行清理。

建立已啟用 Cloud 稽核記錄的管理員叢集

您只能在首次建立管理員叢集時,為管理員叢集啟用 Cloud 稽核記錄。您無法修改現有管理員叢集,以啟用 Cloud Audit Logs。

  1. 請參閱「建立管理員叢集」。

  2. 在管理員叢集設定檔中,填寫 cloudAuditLogging 區段。

  3. cloudAuditLogging.projectID 設為稽核記錄專案的 ID。

  4. cloudAuditLogging.clusterLocation 設為要儲存稽核記錄的 Google Cloud 區域。如要縮短延遲時間,請選擇靠近地端資料中心的區域。

  5. cloudAuditLogging.serviceAccountKeyPath 設為稽核記錄服務帳戶的 JSON 金鑰檔案路徑。

例如:

cloudAuditLogging:
  projectID: "my-project"
  clusterLocation: "us-west1"
  serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"

繼續照常建立叢集。

建立啟用 Cloud 稽核記錄的使用者叢集

  1. 請參閱「建立使用者叢集」。

  2. 在使用者叢集設定檔中,填寫 cloudAuditLogging 部分。

  3. cloudAuditLogging.projectID 設為稽核記錄專案的 ID。

  4. cloudAuditLogging.clusterLocation 設為要儲存稽核記錄的 Google Cloud 區域。如要縮短延遲時間,請選擇靠近地端資料中心的區域。

  5. cloudAuditLogging.serviceAccounKeyPath 設為 Cloud Audit Logs 服務帳戶的 JSON 金鑰檔案路徑。

  6. 請確認已填寫 gkeConnect 區段,且 gkeConnect.projectIDcloudAuditLogging.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 稽核記錄:

  1. 使用者叢集設定檔中新增 gkeConnect 區段。例如:

    gkeConnect:
      projectID: "my-project"
      registerServiceAccountKeyPath: "/my-key-fokder/connect-register-key.json"
    
  2. 更新叢集:

    gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

註冊使用者叢集後,請按照下列步驟啟用 Cloud Audit Logs:

  1. 填寫使用者叢集設定檔cloudAuditLogging 部分。如要瞭解個別欄位的詳細資料,請參閱「建立已啟用 Cloud 稽核記錄的使用者叢集」。cloudAuditLogging 區段中的 projectID 必須與 gkeConnect 區段中的相同。

  2. 更新叢集:

    gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

為現有使用者叢集停用 Cloud 稽核記錄

  1. 在使用者叢集設定檔中,刪除 cloudAuditLogging 區段。

  2. 更新使用者叢集:

gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [USER_CLUSTER_CONFIG]

存取稽核記錄

以磁碟為基礎的稽核記錄

您可以在 /var/log/kube-audit/kube-apiserver-audit.log 下的控制層節點上,找到管理員叢集的稽核記錄。使用者叢集的稽核記錄位於名為 PersistentVolumeClaimkube-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 規格中加入 nodeSelectortolerations 區段,如下所示:

    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

如要指出 nodeNamekube-apiserver-0,請執行下列指令:

kubectl get pod kube-apiserver-0 -n USER_CLUSTER_NAME --kubeconfig kubeconfig -o jsonpath='{.spec.nodeName}'

每個稽核記錄的檔案名稱都有時間戳記,指出檔案輪替的時間。檔案會包含該時間和日期之前的稽核記錄。

存取 Cloud 稽核記錄

控制台

  1. 前往 Google Cloud 控制台「Logging」選單的「Logs Explorer」頁面。

    前往 Logs Explorer

    如果開啟的是舊版記錄檢視器頁面,請從「升級」下拉式選單中選擇「升級至新的記錄檔探索工具」

  2. 在「Query」(查詢) 欄位中按一下,然後輸入查詢。

  3. 在「Query」(查詢) 欄位中輸入下列查詢:

    resource.type="k8s_cluster"
    logName="projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="anthosgke.googleapis.com"
    

    PROJECT_ID 替換為專案 ID。

  4. 按一下「執行查詢」,即可顯示已設定登入這個專案的叢集中的所有稽核記錄。

gcloud

  1. 列出專案管理員活動記錄中,對應到 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
  1. PROJECT_ID 替換為專案 ID。

輸出會顯示兩個記錄項目。請注意,每個記錄項目的 logName 欄位都有 projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity 值,且 protoPayload.serviceName 等於 anthosgke.googleapis.com

稽核政策

Kubernetes 稽核政策會定義事件記錄為記錄項目時應遵循的規則,並指定記錄項目應納入的資料。Cloud 稽核記錄的行為取決於靜態設定的 Kubernetes 稽核記錄政策。系統不支援變更這項政策,藉此修改 Cloud Audit Logs 行為。