使用 MITRE 政策限制

Policy Controller 隨附預設的限制範本庫,可以與 MITRE 政策套裝組合搭配使用,根據實際觀察結果,評估叢集資源是否符合 MITRE 知識庫中攻擊防範策略和技巧的某些部分。

本頁說明如何手動套用政策組合。 或者,您也可以直接套用政策組合

MITRE 政策套裝組合限制

限制名稱 限制說明
mitre-v2024-apparmor 限制 Pod 的 AppArmor 設定檔。
mitre-v2024-block-all-ingress 限制 Ingress 物件的建立。
mitre-v2024-cronjob-restrict-repos CronJob 的容器映像檔限制為允許的 `repos` 清單。
mitre-v2024-no-anonymous 禁止將 ClusterRoleRole 資源與 system:anonymous 使用者和 system:unauthenticated 群組建立關聯。
mitre-v2024-host-namespaces-host-pid-ipc 容器無法在 hostPIDhostIPC 設為 true 的情況下執行。
mitre-v2024-host-namespaces-hostnetwork 容器無法在 hostNetwork 設為 true 的情況下執行。
mitre-v2024-host-ports 應禁止存取 HostPorts,或是至少限縮為已知清單中的項目。
mitre-v2024-no-secrets-as-env-vars 限制在容器定義中使用密鑰做為環境變數。
mitre-v2024-privileged-containers 限制容器,並將 securityContext.privileged 設為 true
mitre-v2024-proc-mount-type 預設 /proc 遮罩可減少受攻擊面,且為必要項目。
mitre-v2024-require-binauthz 需要二進位授權驗證許可控制器 Webhook。
mitre-v2024-require-namespace-networkpolicy 叢集中定義的每個命名空間都必須有 NetworkPolicy。
mitre-v2024-restrict-admission-controller 限制動態准入控制器和 Webhook 的使用。
mitre-v2024-restrict-automountserviceaccounttoken 限制服務帳戶權杖的使用。
mitre-v2024-restrict-capabilities 您無法新增超出清單範圍的功能。
mitre-v2024-restrict-cluster-admin-role 限制使用 cluster-admin 角色。
mitre-v2024-restrict-hostpath-volumes 限制使用 HostPath 磁碟區。
mitre-v2024-restrict-kubernetes-dashboard-namespace 限制使用 kubernetes-dashboard 命名空間。
mitre-v2024-restrict-pods-exec 限制在 RolesClusterRoles 中使用 pods/exec
mitre-v2024-restrict-rbac-subjects 限制 RBAC 主體只能使用允許值。
mitre-v2024-restrict-repos 將容器映像檔限制在允許的 repos 清單中。
mitre-v2024-restrict-role-secrets 限制在 RolesClusterRoles 中使用密鑰。
mitre-v2024-restrict-windows-hostprocess 限制執行 Windows HostProcess 容器 / Pod
mitre-v2024-seccomp Seccomp 設定檔不得設為「Unconfined」。
mitre-v2024-selinux 無法設定 SELinux 類型,或設定自訂 SELinux 使用者或角色選項。
mitre-v2024-sysctls 容器只能設定 allowedSysctls 欄位中列出的 sysctls。

事前準備

  1. 安裝並初始化 Google Cloud CLI,其中提供這些操作說明中使用的 gcloudkubectl 指令。如果您使用 Cloud Shell,Google Cloud CLI 會預先安裝。
  2. 在叢集上安裝 Policy Controller 1.17.2 以上版本,並使用預設的限制範本庫。此外,由於這個套件組合包含參照限制,您也必須啟用參照限制的支援功能

設定 Policy Controller 的參照限制

  1. 將下列 YAML 資訊清單儲存為 policycontroller-config.yaml 檔案。 資訊清單會設定 Policy Controller,監控特定種類的物件。

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
          - group: "admissionregistration.k8s.io"
            version: "v1"
            kind: "ValidatingWebhookConfiguration"
    
  2. 套用 policycontroller-config.yaml 資訊清單:

    kubectl apply -f policycontroller-config.yaml
    

稽核 MITRE 政策套裝組合

您可以透過 Policy Controller,對 Kubernetes 叢集強制執行政策。如要測試工作負載是否符合上表列出的 MITRE 政策,您可以「稽核」模式部署這些限制,找出違規事項,更重要的是,在 Kubernetes 叢集強制執行限制前修正這些問題。

您可以使用 kubectl、kptConfig Sync,將 spec.enforcementAction 設為 dryrun 來套用這些政策。

kubectl

  1. (選用) 使用 kubectl 預覽政策限制:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  2. 使用 kubectl 套用政策限制:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    

    輸出內容如下:

    k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos created
    k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress created
    k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos created
    k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars created
    k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities created
    k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls created
    k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes created
    k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers created
    k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type created
    k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp created
    k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess created
    k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy created
    k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller created
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken created
    k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace created
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects created
    k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role created
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec created
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets created
    
  3. 確認已安裝政策限制,並檢查叢集是否發生違規情形:

    kubectl get constraints -l policycontroller.gke.io/bundleName=mitre-v2024
    

    輸出結果會與下列內容相似:

    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos   dryrun               0
    
    NAME                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress   dryrun               0
    
    NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos   dryrun               0
    
    NAME                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous   dryrun               0
    
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars   dryrun               0
    
    NAME                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor   dryrun               0
    
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities   dryrun               0
    
    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes   dryrun               0
    
    NAME                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork   dryrun               0
    k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports                    dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers   dryrun               0
    
    NAME                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type   dryrun               0
    
    NAME                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp   dryrun               0
    
    NAME                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess   dryrun               0
    
    NAME                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz   dryrun               0
    
    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller   dryrun               0
    
    NAME                                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace   dryrun               0
    
    NAME                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects   dryrun               0
    
    NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role   dryrun               0
    
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec      dryrun               0
    k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets   dryrun               0
    

KPT

  1. 安裝及設定 kpt。這些操作說明會使用 kpt 自訂及部署 Kubernetes 資源。

  2. 使用 kpt 從 GitHub 下載 MITRE 政策套裝組合:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  3. 執行 set-enforcement-action kpt 函式,將政策的強制執行動作設為 dryrun

    kpt fn eval mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. 使用 kpt 初始化工作目錄,這會建立資源來追蹤變更:

    cd mitre-v2024
    kpt live init
    
  5. 使用 kpt 套用政策限制:

    kpt live apply
    
  6. 確認已安裝政策限制,並檢查叢集是否發生違規情形:

    kpt live status --output table --poll-until current
    

    狀態為 CURRENT,表示限制已成功安裝。

Config Sync

  1. 安裝及設定 kpt。這些操作說明會使用 kpt 自訂及部署 Kubernetes 資源。

如果運算子使用 Config Sync 將政策部署至叢集,可以按照下列指示操作:

  1. 變更為 Config Sync 的同步目錄:

    cd SYNC_ROOT_DIR
    

    如要使用 resourcegroup.yaml 建立或附加 .gitignore

    echo resourcegroup.yaml >> .gitignore
    

  2. 建立專屬的 policies 目錄:

    mkdir -p policies
    
  3. 使用 kpt 從 GitHub 下載 MITRE 政策套裝組合:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 policies/mitre-v2024
    
  4. 執行 set-enforcement-action kpt 函式,將政策的強制執行動作設為 dryrun

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (選用) 預覽要建立的政策限制:

    kpt live init policies/mitre-v2024
    kpt live apply --dry-run policies/mitre-v2024
    
  6. 如果 Config Sync 的同步目錄使用 Kustomize,請將 policies/mitre-v2024 新增至根目錄 kustomization.yaml。否則請移除 policies/mitre-v2024/kustomization.yaml 檔案:

    rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml
    
  7. 將變更推送至 Config Sync 存放區:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy audit enforcement'
    git push
    
  8. 驗證安裝狀態:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    如果狀態為 SYNCED,表示政策已安裝完成。

查看政策違規事項

在稽核模式下安裝政策限制後,您可以使用 Policy Controller 資訊主頁,在 UI 中查看叢集違規情形。

您也可以使用 kubectl,透過下列指令查看叢集上的違規事項:

kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

如有違規事項,您可以透過下列方式查看每個限制的違規訊息清單:

kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

變更 MITRE 政策套裝組合強制執行動作

查看叢集中的政策違規事項後,您可以考慮變更強制執行模式,讓 Admission Controller warndeny 阻止不符規定的資源套用至叢集。

kubectl

  1. 使用 kubectl 將政策的強制執行動作設為 warn

    kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. 確認政策限制強制執行動作已更新:

    kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024
    

KPT

  1. 執行 set-enforcement-action kpt 函式,將政策的強制執行動作設為 warn

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. 套用政策限制:

    kpt live apply
    

Config Sync

如果運算子使用 Config Sync 將政策部署至叢集,可以按照下列指示操作:

  1. 變更為 Config Sync 的同步目錄:

    cd SYNC_ROOT_DIR
    
  2. 執行 set-enforcement-action kpt 函式,將政策的強制執行動作設為 warn

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. 將變更推送至 Config Sync 存放區:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy bundle warn enforcement'
    git push
    
  4. 驗證安裝狀態:

    nomos status
    

    叢集應顯示 SYNCED 狀態,並列出已安裝的政策。

測試政策強制執行

使用下列指令在叢集上建立不符規定的資源:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF

准入控制器應會產生警告,列出這項資源違反的政策,如下列範例所示:

Warning: [mitre-v2024-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/gke-on-prem-release/", "gcr.io/gke-multi-cloud-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"]
pod/wp-non-compliant created

移除 MITRE 政策套裝組合

如有需要,可以從叢集中移除 MITRE 政策套裝組合。

kubectl

  • 使用 kubectl 移除政策:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=mitre-v2024
    

KPT

  • 移除政策:

    kpt live destroy
    

Config Sync

如果運算子使用 Config Sync 將政策部署至叢集,可以按照下列指示操作:

  1. 將變更推送至 Config Sync 存放區:

    git rm -r SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Removing MITRE policies'
    git push
    
  2. 確認狀態:

    nomos status
    

    叢集應會顯示 SYNCED 狀態,且資源已移除。