Kubernetes 的安全性至關重要,特別是秘密資料的存取控管。我們可以利用 CloudWatch 和 CloudTrail 追蹤 Kubernetes 和 AWS Secrets Manager 的日誌,精確掌握秘密的存取情況。CloudWatch 提供日誌查詢和警示功能,一旦出現異常存取,就能立即收到通知。CloudTrail 則能記錄 Secrets Manager 的操作,例如 GetSecretValue,提供更全面的稽核追蹤。此外,使用 AWS KMS 加密 Secret,能進一步提升安全性,所有加解密操作都會記錄在 CloudTrail 中,方便追蹤和稽核。更進一步,我們可以利用 Azure Key Vault 提供的秘密管理服務,並且 AKS 進行整合。Azure Key Vault 不僅提供秘密儲存和加解密功能,更整合了 Azure RBAC 和存取策略,提供更精細的許可權控管。其高用性和災難復原能力,確保秘密資料的安全性。此外,Azure Key Vault 的日誌記錄、稽核和監控功能,讓管理者能全面掌握秘密的存取情況。

透過 Kubernetes Secrets Store CSI Driver,AKS 叢集能直接從 Azure Key Vault 讀取秘密,簡化應用程式的佈署和管理。我們可以使用 Azure CLI、Terraform 和 kubectl 等工具來操作和管理 AKS 叢集與 Azure Key Vault 的整合。Terraform 可以用於建立和管理 AKS 叢集以及相關的 Azure 資源,而 kubectl 則是用於與 Kubernetes 叢集互動的命令列工具。透過這些工具,我們可以輕鬆地佈署和管理應用程式,同時確保秘密資料的安全。例如,使用 Terraform 建立 AKS 叢集時,可以設定使用 Azure Key Vault 作為秘密的儲存位置。接著,使用 kubectl 佈署應用程式時,應用程式可以透過 CSI Driver 直接從 Azure Key Vault 讀取所需的秘密。如此一來,我們可以避免將秘密直接儲存在程式碼或設定檔中,降低秘密洩露的風險。

監控 Kubernetes 秘密存取

在 Kubernetes 中,有兩種方式可以評估秘密存取:Kubernetes Secret 存取日誌和 AWS Secrets Manager 日誌。這些日誌可以整合到 AWS 提供的 CloudWatch 和 CloudTrail 來進行監控和稽核。

Kubernetes 日誌與 CloudWatch 的整合

CloudWatch 是 AWS 提供的日誌管理解決方案,我們可以透過它來瀏覽 Kubernetes 的日誌。假設我們建立了一個名為 audit-test 的秘密,我們可以在 CloudWatch 的 Logs Insights 中搜尋相關操作。

以下是使用 Logs Insights 查詢的範例:

fields @timestamp, @message, @logStream, @log
| filter @message like 'audit-test'
| sort @timestamp desc
| limit 20

查詢結果會顯示實際的操作記錄,例如:

Field         | Value
---
-
---
-
---
-
---
|
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
@message       | {"kind":"Event",...,"verb":"get","user":{"username":"kubernetes-admin", "uid":"aws-iam-authenticator:274402012893:AIDAILH3OPGRUQEOHAR3O","groups":["system:masters","system:authenticated"],"extra":{"accessKeyId":["AKIAI5INYQBL233Y7J6Q"],"arn":["arn:aws:iam::274402012893:user/gkatzioura"],"canonicalArn": ["arn:aws:iam::274402012893:user/gkatzioura"], "principalId":["AIDAILH3OPGRUQEOHAR3O"],"sessionName":[""]}},"sourceIPs":["90.221.185.67"],"userAgent":"kubectl/v1.25.4 (darwin/arm64) kubernetes/872a965","objectRef":{"resource":"secrets","namespace":"default","name":"audit-test","apiVersion":"v1"},"responseStatus":{"metadata":...}}
@timestamp     | 1692687754591

這些日誌記錄了使用者對秘密進行操作的詳細資訊,包括操作時間、使用者身份、來源 IP 和操作內容等。

CloudWatch 的警示功能

CloudWatch 不僅提供日誌查詢功能,還支援建立警示。如果有未預期的日誌記錄顯示秘密被存取或嘗試存取,我們可以組態 CloudWatch 傳送警示並通知我們。這些通知可以透過電子郵件或其他選定的溝通通路進行。

AWS Secrets Manager 日誌與 CloudTrail 的整合

AWS CloudTrail 是專門用於稽核日誌的服務,我們可以透過它來識別 Kubernetes Secret 的檢索操作。例如,我們可以使用以下 URL 檢視最近在 AWS 帳戶中檢索的秘密:https://console.aws.amazon.com/cloudtrail/home?#/events?EventName=GetSecretValue

在這個頁面上,我們可以看到從 AWS Secrets Manager 檢索秘密的詳細資訊,例如:

{
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "id:secrets-store-csi-driver-provider-aws",
    "arn": "arn:aws:sts::1111111:assumed-role/eks-secret-reader/secrets-store-csi-driver-provider-aws",
    ...
  },
  "eventSource": "secretsmanager.amazonaws.com",
  "eventName": "GetSecretValue",
  ...
  "requestParameters": {
    "secretId": "arn:aws:secretsmanager:eu-west-1:11111111:secret:service_token-93z7he"
  },
  "responseElements": null,
  ...
}

這些日誌記錄了使用者身份、事件名稱以及請求引數等資訊,幫助我們追蹤秘密的存取情況。

AWS KMS 用於 Secret 加密

Kubernetes 提供了指定加密提供者的選項,當將 Secret 儲存在 etcd 時,AWS KMS 可以用作加密提供者。以下是使用 Terraform 建立 KMS 金鑰的範例:

resource "aws_kms_key" "ksm_kms_key" {
  description             = "ksm_kms_key"
  deletion_window_in_days = 30
  enable_key_rotation     = true
}

這個金鑰現在可以單獨使用或與其他 AWS 元件一起使用。

在 EKS 中使用 KMS

在建立 EKS 叢集後,我們可以指定用於解密 Secret 的憑證:

module "ksm_eks" {
  ...
  create_kms_key            = false
  cluster_encryption_config = {
    resources          = ["secrets"]
    provider_key_arn   = aws_kms_key.ksm_kms_key.arn
  }
  ...
}

當我們從 Kubernetes 檢索憑證時,Secret 會使用我們指定的 KMS 金鑰進行解密。我們可以使用 AWS CloudTrail 來識別這些解密操作。例如,我們可以透過以下連結存取 CloudTrail 操作記錄:https://console.aws.amazon.com/cloudtrail/home?#/events?EventName=Decrypt

在此頁面上,我們可以看到解密操作及相關資訊:

{
  "eventSource": "kms.amazonaws.com",
  "eventName": "Decrypt",
  "awsRegion": "eu-west-1",
  "sourceIPAddress": "secretsmanager.amazonaws.com",
  "userAgent": "secretsmanager.amazonaws.com",
  "requestParameters": {
    "encryptionContext": {
      "SecretARN": "arn:aws:secretsmanager:eu-west-1:1212222223:secret:service_token-93z7he",
      "SecretVersionId": "278A157C-EA85-4211-9854-D329D3C9089F"
    },
    "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
  },
  "resources": [
    {
      "ARN": "arn:aws:kms:eu-west-1:111111111:key/aaaaaaa-aaaa-458f-b8d1-aefa58b68d8a"
    }
  ],
  ...
}

這樣,我們就成功地將 Secret 加密儲存在 etcd 上並且能夠監控任何加密/解密操作。

探索Azure雲端秘密儲存

在之前的章節中,玄貓探討了AWS的Secrets Manager。現在,讓我們將焦點轉移到另一個受歡迎的雲端服務提供商—微軟Azure。我們將學習Azure Key Vault,這是Azure提供的一個解決方案,用於儲存秘密並進行加密和解密操作。我們將利用Azure Key Vault來儲存秘密,並將它們應用於Kubernetes的工作負載中。此外,我們也會使用Key Vault來加密儲存在etcd中的秘密。

在這一章中,我們將涵蓋以下主題:

  • Azure Key Vault概述
  • 工作負載身份介紹
  • AKS叢集與Azure Key Vault整合
  • 稽核與日誌記錄
  • 使用Azure Key Vault進行秘密加密

完成本章後,我們應該能夠在Azure Key Vault中儲存秘密,從Kubernetes佈署中檢索它們,透過稽核監控秘密存取,並使用Azure Key Vault加密Kubernetes秘密。

技術需求

為了將概念與實際操作結合起來,玄貓將使用一系列常見工具和平台來與Azure API和Kubernetes互動:

Azure Key Vault概述

Azure Key Vault是一個多功能服務。它可以用作秘密儲存。在Azure Key Vault中,我們可以儲存加金鑰匙。此外,Azure Key Vault還可以用於執行加密和解密操作。由於它是一項受管理的Azure服務,因此受益於Azure預設為其服務提供的一些功能。

以下是我們感興趣的功能:

  • Azure RBAC和存取策略
  • 高用性
  • 日誌記錄、稽核和監控
  • 與其他Azure元件的整合

我們將花一些時間來檢查這些對保護我們秘密至關重要的功能。

Azure RBAC和存取策略

每個Azure上的服務都受到身份存取管理階層的保護,這是由Azure提供的。這層保護以Azure的RBAC和存取策略形式出現。安全主體是具有身份的實體,可以是使用者帳戶、組帳戶或電腦帳戶。傳統方式是透過存取策略將許可權賦予安全主體。推薦的方式是透過根據角色的存取控制(RBAC)來賦予許可權。在本章中進行時,玄貓會選擇使用Azure RBAC來保護Azure Key Vault。透過使用Azure RBAC,我們將透過建立角色分配來控制對資源的存取。

高用性

當我們建立一個Key Vault時,必須指定Key Vault所在的區域。Key Vault內容在此區域內進行複製。此外,Key Vault內容還會複製到次要區域。Azure Key Vault內容在區域內高度可用,同時也支援出廠即備災難還原。

想象一下這樣一種情況:區域變得不可用。當區域變得不可用時,對Azure Key Vault的請求將被自動路由到次要區域。不需要組態任何額外的Azure Key Vault資源或設定回落到另一個區域中的Key Vault。

日誌記錄、稽核和監控

在Azure中,我們有選擇稽核Key Vault使用情況的選項。透過啟用稽核,我們可以識別誰存取了主機在Azure Key Vault上的資料。我們可以透過診斷設定收集日誌來實作這一點。

資源在Azure上產生日誌,而這些日誌包含有關資源及其涉及每個資源的操作的資訊。根據資源的不同,日誌內容可能會有所不同。

診斷設定為我們提供了將這些日誌流向各種位置的選項。預設情況下,日誌將被流向一個Azure儲存帳戶。其他選項是將日誌流向Log Analytics工作區或 Azure Event Hub。

與其他Azure元件的整合

Azure Key Vault的一大好處就是與其他Azure元件的整合。例如: Azure Application Gateway 用於流量加密、或者從 Azure 提供的 SQL Server 加密資料等。其中一個感興趣的是 Azure Kubernetes Service(AKS) 。

這是透過 Kubernetes Secrets Store CSI Driver for Azure Key Vault 來啟用的。 此圖示展示瞭如何進行整合:

調整技術需求(增加詳細)

玄貓在此時進行一些調整。 主要是針對技術需求部分: Terraform 配合 Azure CLI 俱樂部大腕兒建立AKS叢集例項, 繼而利用 Kubectl 做一些測試工作:

terraform init # 初始化 Terraform 組態檔案
terraform apply # 接著執行 terraform 構建 AKS 叢集
小段落標題:程式碼解說
kubectl get pods # 執行後列出所有 pod 的名稱。

以上指令會列出所有 pod 的名稱, 透過 kubectl 將會對各個 pod 進行測試工作。 透過觀察及分析 pod 的狀態, 確認叢集運作狀況正常。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes 秘密存取監控與 Azure Key Vault 整合實踐

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

調整結尾(更自然深刻)

總結而言, 玄貓認為 AKS 和 Azure 的整合效果不錯, 值得長期放入技術堆疊, 透過上面步驟測試後發現, 基本符合預期需求。 未來也會持續關注相關技術動態, 給大家帶來更多技術分享!