稽核記錄

本頁面說明如何在 Google Kubernetes Engine 叢集中使用稽核記錄。

總覽

所有由 Kubernetes 提供技術的叢集都有 Kubernetes Audit Logging,會依時間順序記錄對 Kubernetes API 伺服器做出的呼叫。Kubernetes 稽核記錄項目適合用於調查可疑的 API 要求、收集統計資料,或是針對不想要的 API 呼叫建立監控快訊。

GKE 叢集整合 Kubernetes Audit Logging 與 Cloud Audit LoggingStackdriver Logging。您可以在 Google Cloud Platform 專案中查看 Kubernetes 稽核記錄項目。

專案的稽核記錄不只有 Kubernetes 寫入的項目,也會有 Kubernetes Engine 寫入的項目。

GKE 1.11.4 以上版本可使用稽核 GA。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

您的專案中必須要有 Kubernetes Engine 叢集。您可以使用現有的叢集,也可以為本主題中的練習建立新的叢集。如果您選擇使用現有的叢集,請確認叢集最近有一些活動。舉例來說,如果您最近沒有建立過部署,您可以輸入下列指令來建立部署:

kubectl run log-exercise --image nginx

閱讀 Kubernetes Audit Logging 相關資訊。

專案中的稽核記錄

GCP 專案有下列兩種稽核記錄:

  • 管理員活動記錄
  • 資料存取記錄

預設會啟用管理員活動記錄,無需額外付費。

預設會停用資料存取記錄,啟用這項功能會產生額外費用。如要進一步瞭解如何啟用資料存取記錄及相關費用,請參閱設定資料存取記錄

Kubernetes Engine 不支援資料存取透明化控管機制記錄

各種 Google Cloud Platform 服務會在專案記錄中寫入記錄項目。 Kubernetes 服務也會在專案的稽核記錄中寫入記錄項目。針對 Kubernetes Engine 叢集,需要注意的是以下服務寫入的記錄項目:

服務 顯示名稱
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

查看專案的管理員活動記錄

主控台

  1. 在 GCP 主控台中,前往「Logs」(記錄) 選單中的「Logs」(記錄) 頁面。

    前往「Logs」(記錄) 頁面

  2. 在頁面最上方找到用於選取資源類型的下拉式選單。在下拉式選單中選取 [Kubernetes Cluster] (Kubernetes 叢集)

  3. 您可以視需要指定「Location」(位置),也可以選擇 [All location] (所有位置)。如選取位置,可以選取在該位置中的特定叢集。

  4. 右側的下一個選單用於選取記錄。在下拉式選單中選取 [activity] (活動),然後按一下 [OK] (確定)

  5. 根據預設,螢幕會顯示所有記錄層級。如要指定記錄層級 (例如「Warning」(警告)),請在代表記錄層級的下拉式選單中選取。

  6. 螢幕可能只會顯示前一個小時的記錄項目。如果您沒有看到前一個小時的記錄項目,請按一下 [Load older logs] (載入較舊的記錄)

  7. 在「Filter by label or text search」(按標籤或搜尋字詞篩選) 方塊中,按一下記錄層級下拉式選單上方的向下箭號,開啟下拉式選單。在選單中選擇 [Convert to advanced filter] (轉換為進階篩選器)

  8. 文字方塊會顯示類似下方的篩選器:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. 按一下資料行開頭的箭號,開啟其中一個記錄項目。該項目的 logName 欄位會出現 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity 值。

gcloud

列出專案的管理員活動記錄中的前兩個記錄項目:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

其中,[PROJECT_ID] 是您的專案 ID。

輸出會顯示兩個記錄項目。您會注意到,每個記錄項目的 logName 欄位都有 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity 值。

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...

基本和進階篩選器介面

GCP 主控台中的「Logs」(記錄) 頁面有兩個篩選介面:基本和進階。有關這兩個篩選介面的詳情,請參閱記錄檢視器篩選器介面

查看寫入管理員活動記錄的服務

主控台

  1. 在 GCP 主控台中,前往「Logs」(記錄) 選單中的「Logs」(記錄) 頁面。

    前往「Logs」(記錄) 頁面

  2. 如果「Logs」(記錄) 頁面目前並非進階模式,請切換至進階模式。在篩選器方塊中,按一下右方的向下箭號,然後選取 [Convert to advanced filter] (轉換為進階篩選器)

  3. 刪除篩選器方塊中任何現有文字,然後輸入這個篩選條件。

    logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    其中,[PROJECT_ID] 是您的專案 ID。

    按一下 [提交篩選器]

    螢幕會列出管理員活動記錄中,由 k8s.io 服務寫入的所有項目。也就是說,這些項目是由 Kubernetes 控制層寫入。

  4. 現在尋找由 k8s.io 以外的服務所寫入的記錄項目。在篩選器方塊中,將 serviceName="k8s.io" 改為 serviceName!="k8s.io"。按一下 [提交篩選器]

    螢幕會列出管理員活動記錄中,不是由 k8s.io 服務所寫入的記錄項目。

  5. 開啟其中一個記錄項目,然後展開 protoPayload 欄位。查看 serviceName 的值,確認這個記錄項目是由哪一項服務寫入。

  6. 現在尋找 container.googleapis.com 服務所寫入的記錄項目。也就是說,這些項目是由 Kubernetes Engine 控制層寫入。在篩選器方塊中,將 serviceName!="k8s.io" 改成 serviceName="container.googleapis.com"。按一下 [Submit Filter] (提交篩選器)

gcloud

列出專案管理員活動記錄中,由 k8s.io 服務寫入的前兩個記錄項目。也就是說,這些項目是由 Kubernetes 控制層寫入。

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="k8s.io"' \
    --limit 2 \
    --freshness 300d

其中,[PROJECT_ID] 是您的專案 ID。

在輸出中,您會看到 protoPayload:serviceNamek8s.io 值:

protoPayload:
  ...
  serviceName: k8s.io

現在,尋找由 k8s.io 以外的服務所寫入的記錄項目:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName!="k8s.io"' \
    --limit 2 \
    --freshness 300d

輸出會列出管理員活動記錄中,不是由 k8s.io 服務所寫入的記錄項目。

logName: projects/steve-70/logs/cloudaudit.googleapis.com%2Factivity
...
protoPayload:
  ...
  serviceName: compute.googleapis.com
...

在其中一個記錄項目中,查看 protoPayload.serviceName 的值,確認這個記錄項目是由哪個服務寫入。

現在,尋找 container.googleapis.com 服務寫入的記錄項目。也就是說,這些項目是由 Kubernetes Engine 控制層寫入:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="container.googleapis.com"' \
    --limit 2 \
    --freshness 300d

其中,[PROJECT_ID] 是您的專案 ID。

依資源類型篩選管理員活動記錄

管理員活動記錄中的每個記錄項目都對應到一個特定資源類型。以下是與 Kubernetes 叢集最相關的資源類型:

資源類型 顯示名稱
k8s_cluster Kubernetes 叢集
gke_cluster GKE 叢集作業

Kubernetes API 伺服器寫入的記錄項目對應到 k8s_cluster 資源類型。這些記錄項目說明叢集中 Kubernetes 資源上的作業,例如 Pod、部署和密鑰。

Kubernetes Engine API 伺服器寫入的記錄項目對應到 gke_cluster 資源。這些記錄項目說明叢集建立和刪除等作業。

主控台

  1. 在 GCP 主控台中,前往「Logs」(記錄) 選單中的「Logs」(記錄) 頁面。

    前往「Logs」(記錄) 頁面

  2. 如果「Logs」(記錄) 頁面目前並非基本模式,請切換至基本模式。在篩選器方塊中,按一下右方的向下箭號,然後選取 [Clear filters and return to basic mode] (清除篩選器並返回基本模式)

  3. 在用於選取資源類型的下拉式選單中,選取 [Kubernetes Cluster] (Kubernetes 叢集)。這是 k8s_cluster 資源類型的顯示名稱。

  4. 在用於選取記錄的下拉式選單中選取 [activity] (活動),然後按一下 [OK] (確定)

    螢幕會列出管理員活動記錄中,所有對應到 k8s_cluster 資源類型的記錄項目。

  5. 開啟其中一個記錄項目,然後展開 resource 欄位。確認 type 欄位的值是 k8s_cluster

  6. 接著在下拉式選單中選取 [GKE Cluster Operations] (GKE 叢集作業)。這是 gke_cluster 資源類型的顯示名稱。在用於選取記錄的下拉式選單中選取 [activity] (活動),然後按一下 [OK] (確定)

    螢幕會列出管理員活動記錄中,所有對應到 gke_cluster 資源類型的記錄項目。

gcloud

列出在專案的管理員活動記錄中對應到 k8s_cluster 資源類型的前兩個記錄項目:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="k8s_cluster"' \
    --limit 2 \
    --freshness 300d

其中,[PROJECT_ID] 是您的專案 ID。

在輸出中,您會看到 resource:type 欄位具有 k8s_cluster 值:

resource:
  ...
  type: k8s_cluster

接下來,列出在專案的管理員活動記錄中對應到 gke_cluster 資源類型的前兩個記錄項目:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="gke_cluster"' \
    --limit 2 \
    --freshness 300d

在輸出中,您會看到 resource:type 欄位具有 gke_cluster 值:

resource:
  ...
  type: gke_cluster

管理員活動記錄的範例篩選器

以下是一些您可以試著在 GCP 主控台中使用的篩選器範例。在每個案例中,將 [PROJECT_ID] 改成您的專案 ID。

在管理員活動記錄中尋找對應到 k8s_cluster 資源類型的項目,然後說明「建立部署」。

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

在管理員活動記錄中尋找對應到 k8s_cluster 資源類型,且 principalEmail 的值為 system:anonymous 的項目。這些項目可能代表驗證失敗次數。

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

在管理員活動記錄中尋找對應到 gke_cluster 資源類型的項目,然後說明「叢集建立」。

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

在管理員活動記錄中尋找對應到 gke_cluster 資源類型,且 severity 的值為 ERROR 的項目。

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

在管理員活動記錄中尋找對應到 k8s_cluster 資源類型的項目,然後說明「寫入密鑰的要求」:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

在管理員活動記錄中對應到 k8s_cluster 資源類型的項目,然後說明「來自特定使用者的 Pod 要求」:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

如要進一步瞭解如何建構篩選器,請參閱進階記錄篩選器

記錄項目的結構

每個記錄項目都是 LogEntry 類型的物件。詳情請參閱稽核記錄資料類型

啟用資料存取記錄

取得專案的身分與存取權管理 (IAM) 政策:

gcloud projects get-iam-policy [PROJECT_ID] > my-policy.yaml

其中,[PROJECT_ID] 是您的專案 ID。

開啟 my-policy.yaml 以查看您的 IAM 政策。您的政策可能會包含一個類似這樣的 bindings 物件:

bindings:
- members:
  - serviceAccount:xxx.gserviceaccount.com
  - serviceAccount:yyy.gserviceaccount.com
  role: roles/container.clusterAdmin
- members:
  ...

my-policy.yaml 中建立一個 auditConfigs 物件,或新增至現有的 auditConfigs 物件,以在 auditLogConfigs 底下列出 ADMIN_READDATA_WRITEDATA_READ

auditConfigs:
- auditLogConfigs:
  - logType: ADMIN_READ
  - logType: DATA_WRITE
  - logType: DATA_READ
  service: allServices

請勿變更 etag 的值。

將更新的檔案儲存為 my-policy-2.yaml

設定專案的 IAM 政策:

gcloud projects set-iam-policy [PROJECT_ID] my-policy-2.yaml

其中,[PROJECT_ID] 是您的專案 ID。

查看專案的資料存取記錄

主控台

  1. 在 GCP 主控台中,前往「Logs」(記錄) 選單中的「Logs」(記錄) 頁面。

    前往「Logs」(記錄) 頁面

  2. 如果「Logs」(記錄) 頁面目前並非基本模式,請切換至基本模式。在篩選器方塊中,按一下右方的向下箭號,然後選取 [Clear filters and return to basic mode] (清除篩選器並返回基本模式)

  3. 在頁面最上方找到用於選取資源類型的下拉式選單。在下拉式選單中選取 [Kubernetes Cluster] (Kubernetes 叢集)

  4. 在用於選取記錄的選單中選取 [data_access],然後按一下 [OK] (確定)

  5. 在 [Filter by label or text search] (按標籤或搜尋字詞篩選) 方塊中,按一下右側的向下箭號,開啟下拉式選單。在選單中選擇 [Convert to advanced filter] (轉換為進階篩選器)

  6. 文字方塊會顯示類似下方的篩選器:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. 開啟其中一個記錄項目,注意該項目的 logName 欄位是否出現 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access 值。

gcloud

列出專案的資料存取記錄中的前兩個記錄項目:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

其中,[PROJECT_ID] 是您的專案 ID。

輸出會顯示兩個記錄項目。您會注意到,每個記錄項目的 logName 欄位都有 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access 值。

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"
...

匯出及儲存記錄項目

記錄項目在 Stackdriver Logging 中保留一段時間,稱為保留期限。超過期限後,系統就會刪除項目。

如果您要讓記錄項目保留得更久,可以將這些記錄項目匯出至 Cloud Storage、BigQuery 或 Cloud Pub/Sub 等 Google 服務。

設定指標與快訊

您可以使用 Stackdriver Monitoring,根據記錄項目來設定指標。此外,您也可以使用基於記錄的指標,來設定圖表和快訊

稽核政策

Kubernetes 稽核政策會判斷哪些記錄項目是由 Kubernetes API 伺服器匯出。Kubernetes Engine 稽核政策會判斷哪些項目將進入您的管理員活動記錄,哪些則將進入您的資料存取記錄。

如要進一步瞭解 Kubernetes Engine 中的稽核政策,請參閱 Kubernetes Engine 稽核政策

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件