部署 NCP 時,請務必要採取保護 Kubernetes 與 NSX-T Data Center 環境的相關步驟。

將 NCP 限制在指定的節點上執行

NCP 具有 NSX-T Data Center 管理平面的存取權,因此應受到限制而僅能在指定的基礎結構節點上執行。您可以使用適當標籤識別這些節點。接著,應將此標籤的 nodeSelector 套用至 NCP ReplicationController 規格。例如,

  nodeSelector:
      nsx-infra: True

您也可以使用其他機制 (例如相似性) 將網繭指派給節點。如需詳細資訊,請參閱https://kubernetes.io/docs/concepts/configuration/assign-pod-node

確定 Docker Engine 為最新版本

Docker 會定期發行安全性更新。您應實作自動化程序來套用這些更新。

不允許不受信任容器的 NET_ADMIN 和 NET_RAW

攻擊者可以利用 Linux 功能 NET_ADMIN 和 NET_RAW 來入侵網繭網路。您應停用不受信任容器的這兩項功能。依預設,系統並不會對不具權限的容器授與 NET_ADMIN 功能。請留意網繭規格是否明確加以啟用,或將容器設定為在特殊權限模式中執行。此外,對於不受信任的容器,請在容器規格的 SecurityContext 組態中的捨棄功能清單中指定 NET_RAW 來停用 NET_RAW。例如,

    securityContext:
       capabilities:
          drop:
            - NET_RAW
            - ...

角色型存取控制

Kubernetes 會使用角色型存取控制 (RBAC) API 控制授權決定,讓管理員能夠動態設定原則。如需詳細資訊,請參閱https://kubernetes.io/docs/admin/authorization/rbac

一般而言,叢集管理員是唯一具有存取權和角色權限的使用者。對於使用者和服務帳戶,授與存取權時必須遵循最低權限的原則。

建議採用下列準則:

  • 將 Kubernetes API Token 的存取權限制在需要這些 Token 的網繭。
  • 將 NCP ConfigMap 和 NSX API 用戶端憑證 TLS 密碼的存取權限制在 NCP 網繭。
  • 封鎖不需要存取 Kubernetes 網路 API 的網繭對此類 API 的存取。
  • 新增 Kubernetes RBAC 原則以指定有權存取 Kubernetes API 的網繭。

針對 NCP 網繭而建議的 RBAC 原則

在 ServiceAccount 下建立 NCP 網繭,並給予此帳戶最低的權限集。此外,不要允許其他網繭或 ReplicationController 存取為 NCP ReplicationController 和 NSX 節點代理程式掛接為磁碟區的 ConfigMap 和 TLS 密碼。

下列範例說明如何指定 NCP 的角色和角色繫結:

  # Create a ServiceAccount for NCP namespace
  apiVersion: v1
  kind: ServiceAccount
  metadata:
   name: ncp-svc-account
   namespace: nsx-system
  
  ---
  
  # Create ClusterRole for NCP
  kind: ClusterRole
  # Set the apiVersion to v1 while using OpenShift
  apiVersion: rbac.authorization.k8s.io/v1beta1
  metadata:
   name: ncp-cluster-role
  rules:
   - apiGroups:
     - ""
     - extensions
     - networking.k8s.io
     resources:
       - deployments
       - endpoints
       - pods
       - pods/log
       - namespaces
       - networkpolicies
       # Move 'nodes' to ncp-patch-role when hyperbus is disabled.
       - nodes
       - replicationcontrollers
       # Remove 'secrets' if not using Native Load Balancer.
       - secrets
     verbs:
       - get
       - watch
       - list
  
  ---
  
  # Create ClusterRole for NCP to edit resources
  kind: ClusterRole
  # Set the apiVersion to v1 while using OpenShift
  apiVersion: rbac.authorization.k8s.io/v1beta1
  metadata:
   name: ncp-patch-role
  rules:
   - apiGroups:
     - ""
     - extensions
     resources:
       - ingresses
       - services
     verbs:
       - get
       - watch
       - list
       - update
       - patch
   - apiGroups:
     - ""
     - extensions
     resources:
       - ingresses/status
       - services/status
     verbs:
       - replace
       - update
       - patch
  ---
  
  # Bind ServiceAccount created for NCP to its ClusterRole
  kind: ClusterRoleBinding
  # Set the apiVersion to v1 while using OpenShift
  apiVersion: rbac.authorization.k8s.io/v1beta1
  metadata:
   name: ncp-cluster-role-binding
  roleRef:
   # Comment out the apiGroup while using OpenShift
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
   name: ncp-cluster-role
  subjects:
   - kind: ServiceAccount
     name: ncp-svc-account
     namespace: nsx-system
  
  ---
  
  # Bind ServiceAccount created for NCP to the patch ClusterRole
  kind: ClusterRoleBinding
  # Set the apiVersion to v1 while using OpenShift
  apiVersion: rbac.authorization.k8s.io/v1beta1
  metadata:
   name: ncp-patch-role-binding
  roleRef:
   # Comment out the apiGroup while using OpenShift
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
   name: ncp-patch-role
  subjects:
   - kind: ServiceAccount
     name: ncp-svc-account
     namespace: nsx-system
備註: 使用 Kubernetes API 為 NSX-T Data Center 用戶端憑證與私密金鑰配對建立的 TLS 密碼,可供任何有權存取 Kubernetes API 伺服器的網繭存取。同樣地,如果網繭並非使用任何服務帳戶所建立,則該網繭將自動指派至相同命名空間中會自動掛接 Token 以存取 Kubernetes API 的預設服務帳戶。因此,必須限制需要使用的網繭才能存取這些 Token。