Udostępnij za pośrednictwem


Test porównawczy platformy Kubernetes w usłudze Center for Internet Security (CIS)

Jako bezpieczna usługa usługa Azure Kubernetes Service (AKS) jest zgodna ze standardami SOC, ISO, PCI DSS i HIPAA. W tym artykule opisano wzmocnienie zabezpieczeń stosowane do usługi AKS na podstawie testu porównawczego CIS Kubernetes. Aby uzyskać więcej informacji na temat zabezpieczeń usługi AKS, zobacz Pojęcia dotyczące zabezpieczeń aplikacji i klastrów w usłudze Azure Kubernetes Service (AKS). Aby uzyskać więcej informacji na temat testu porównawczego CIS, zobacz Centrum testów porównawczych zabezpieczeń internetowych (CIS).

Test porównawczy ciS platformy Kubernetes

Poniżej przedstawiono wyniki zaleceń ciS Kubernetes v1.27 Benchmark v1.9.0 w usłudze AKS. Wyniki mają zastosowanie do usługi AKS 1.27.x do usługi AKS 1.29.x.

Poziomy zabezpieczeń

Testy porównawcze CIS zapewniają dwa poziomy ustawień zabezpieczeń:

  • L1 lub Poziom 1 zaleca podstawowe wymagania dotyczące zabezpieczeń, które można skonfigurować w dowolnym systemie i powinny powodować niewielkie przerwy w działaniu usługi lub ograniczonej funkcjonalności.
  • L2 lub Poziom 2 zaleca ustawienia zabezpieczeń dla środowisk wymagających większego bezpieczeństwa, co może spowodować zmniejszenie funkcjonalności.

Stan oceny

Stan oceny jest uwzględniany dla każdego zalecenia. Stan oceny wskazuje, czy dana rekomendacja może być zautomatyzowana, czy wymaga ręcznego wykonania kroków. Oba stany są równie ważne i są określane i obsługiwane zgodnie z poniższymi definicjami:

  • Zautomatyzowane: reprezentuje zalecenia, dla których ocena kontroli technicznej może być w pełni zautomatyzowana i zweryfikowana w stanie pass/fail. Zalecenia będą zawierać niezbędne informacje do zaimplementowania automatyzacji.
  • Ręczne: reprezentuje zalecenia, dla których nie można w pełni zautomatyzować oceny kontroli technicznej i wymaga wykonania wszystkich lub niektórych ręcznych kroków w celu sprawdzenia, czy skonfigurowany stan jest ustawiony zgodnie z oczekiwaniami. Oczekiwany stan może się różnić w zależności od środowiska.

Zautomatyzowane rekomendacje wpływają na ocenę porównawczą, jeśli nie są stosowane, a rekomendacje ręczne nie są stosowane.

Stan zaświadczania

Zalecenia mogą mieć jeden z następujących stanów zaświadczania:

  • Przekazywanie: zalecenie zostało zastosowane.
  • Niepowodzenie: zalecenie nie zostało zastosowane.
  • Nie dotyczy: Zalecenie dotyczy wymagań dotyczących uprawnień pliku manifestu, które nie są istotne dla usługi AKS. Klastry Kubernetes domyślnie używają modelu manifestu do wdrażania zasobników płaszczyzny sterowania, które opierają się na plikach z maszyny wirtualnej węzła. Test porównawczy CIS Kubernetes zaleca, aby te pliki miały pewne wymagania dotyczące uprawnień. Klastry usługi AKS używają wykresu Helm do wdrażania zasobników płaszczyzny sterowania i nie polegają na plikach na maszynie wirtualnej węzła.
  • Zależy od środowiska: zalecenie jest stosowane w określonym środowisku użytkownika i nie jest kontrolowane przez usługę AKS. Zautomatyzowane rekomendacje wpływają na ocenę porównawczą, czy rekomendacja ma zastosowanie do określonego środowiska użytkownika, czy nie.
  • Równoważna kontrola: zalecenie zostało zaimplementowane w inny, równoważny sposób.

Szczegóły testu porównawczego

Identyfikator CIS Opis rekomendacji Stan oceny Poziom Stan
1 Składniki płaszczyzny sterowania
1.1 Pliki konfiguracji węzła płaszczyzny sterowania
1.1.1 Upewnij się, że uprawnienia pliku specyfikacji zasobnika serwera interfejsu API są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.2 Upewnij się, że własność pliku specyfikacji zasobnika serwera interfejsu API jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.3 Upewnij się, że uprawnienia pliku specyfikacji zasobnika menedżera kontrolera są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.4 Upewnij się, że własność pliku specyfikacji zasobnika menedżera kontrolera jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.5 Upewnij się, że uprawnienia pliku specyfikacji zasobnika harmonogramu są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.6 Upewnij się, że własność pliku specyfikacji zasobnika harmonogramu jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.7 Upewnij się, że uprawnienia pliku specyfikacji zasobnika etcd są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.8 Upewnij się, że własność pliku specyfikacji zasobnika etcd jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.9 Upewnij się, że uprawnienia pliku interfejsu sieciowego kontenera są ustawione na 600 lub bardziej restrykcyjne Ręcznie L1 Nie dotyczy
1.1.10 Upewnij się, że własność pliku interfejsu sieciowego kontenera jest ustawiona na root:root Ręcznie L1 Nie dotyczy
1.1.11 Upewnij się, że uprawnienia katalogu danych etcd są ustawione na 700 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.12 Upewnij się, że właściwość katalogu danych etcd została ustawiona na etcd:etcd Zautomatyzowane L1 Nie dotyczy
1.1.13 Upewnij się, że uprawnienia pliku admin.conf są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.14 Upewnij się, że własność pliku admin.conf jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.15 Upewnij się, że uprawnienia pliku scheduler.conf są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.16 Upewnij się, że własność pliku scheduler.conf jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.17 Upewnij się, że uprawnienia pliku controller-manager.conf są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Nie dotyczy
1.1.18 Upewnij się, że własność pliku controller-manager.conf jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.19 Upewnij się, że katalog I własność pliku PKI platformy Kubernetes jest ustawiona na root:root Zautomatyzowane L1 Nie dotyczy
1.1.20 Upewnij się, że uprawnienia pliku certyfikatu PKI platformy Kubernetes są ustawione na 600 lub bardziej restrykcyjne Ręcznie L1 Nie dotyczy
1.1.21 Upewnij się, że uprawnienia pliku klucza PKI platformy Kubernetes są ustawione na 600 Ręcznie L1 Nie dotyczy
1.2 Serwer interfejsu API
1.2.1 Upewnij się, że --anonymous-auth argument ma wartość false Ręcznie L1 Zdane
1.2.2 Upewnij się, że --token-auth-file parametr nie został ustawiony Zautomatyzowane L1 Niepowodzenie
1.2.3 Upewnij się, że --DenyServiceExternalIPs nie ustawiono Ręcznie L1 Niepowodzenie
1.2.4 Upewnij się, że --kubelet-client-certificate argumenty i --kubelet-client-key są ustawione odpowiednio Zautomatyzowane L1 Zdane
1.2.5 Upewnij się, że --kubelet-certificate-authority argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Niepowodzenie
1.2.6 Upewnij się, że --authorization-mode argument nie jest ustawiony na Wartość AlwaysAllow Zautomatyzowane L1 Zdane
1.2.7 Upewnij się, że --authorization-mode argument zawiera węzeł Zautomatyzowane L1 Zdane
1.2.8 Upewnij się, że argument zawiera kontrolę dostępu opartą na rolach --authorization-mode Zautomatyzowane L1 Zdane
1.2.9 Upewnij się, że ustawiono wtyczkę kontroli dostępu EventRateLimit Ręcznie L1 Niepowodzenie
1.2.10 Upewnij się, że wtyczka AlwaysAdmit kontroli dostępu nie jest ustawiona Zautomatyzowane L1 Zdane
1.2.11 Upewnij się, że ustawiono wtyczkę kontroli dostępu AlwaysPullImages Ręcznie L1 Niepowodzenie
1.2.12 Upewnij się, że ustawiono wtyczkę kontroli dostępu ServiceAccount Zautomatyzowane L2 Niepowodzenie
1.2.13 Upewnij się, że ustawiono wtyczkę kontroli dostępu NamespaceLifecycle Zautomatyzowane L2 Zdane
1.2.14 Upewnij się, że ustawiono wtyczkę kontroli dostępu NodeRestriction Zautomatyzowane L2 Zdane
1.2.15 Upewnij się, że --profiling argument ma wartość false Zautomatyzowane L1 Zdane
1.2.16 Upewnij się, że --audit-log-path argument jest ustawiony Zautomatyzowane L1 Zdane
1.2.17 Upewnij się, że --audit-log-maxage argument jest ustawiony na 30 lub odpowiednio Zautomatyzowane L1 Równoważna kontrolka
1.2.18 Upewnij się, że --audit-log-maxbackup argument jest ustawiony na 10 lub odpowiednio Zautomatyzowane L1 Równoważna kontrolka
1.2.19 Upewnij się, że --audit-log-maxsize argument jest ustawiony na 100 lub odpowiednio Zautomatyzowane L1 Zdane
1.2.20 Upewnij się, że --request-timeout argument jest ustawiony zgodnie z potrzebami Ręcznie L1 Zdane
1.2.21 Upewnij się, że --service-account-lookup argument ma wartość true Zautomatyzowane L1 Zdane
1.2.22 Upewnij się, że --service-account-key-file argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
1.2.23 Upewnij się, że --etcd-certfile argumenty i --etcd-keyfile są ustawione odpowiednio Zautomatyzowane L1 Zdane
1.2.24 Upewnij się, że --tls-cert-file argumenty i --tls-private-key-file są ustawione odpowiednio Zautomatyzowane L1 Zdane
1.2.25 Upewnij się, że --client-ca-file argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
1.2.26 Upewnij się, że --etcd-cafile argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
1.2.27 Upewnij się, że --encryption-provider-config argument jest ustawiony zgodnie z potrzebami Ręcznie L1 Zależy od środowiska
1.2.28 Upewnij się, że dostawcy szyfrowania są odpowiednio skonfigurowani Ręcznie L1 Zależy od środowiska
1.2.29 Upewnij się, że serwer api używa tylko silnych szyfrów kryptograficznych Ręcznie L1 Zdane
1.3 Menedżer kontrolera
1.3.1 Upewnij się, że --terminated-pod-gc-threshold argument jest ustawiony zgodnie z potrzebami Ręcznie L1 Zdane
1.3.2 Upewnij się, że --profiling argument ma wartość false Zautomatyzowane L1 Zdane
1.3.3 Upewnij się, że --use-service-account-credentials argument ma wartość true Zautomatyzowane L1 Zdane
1.3.4 Upewnij się, że --service-account-private-key-file argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
1.3.5 Upewnij się, że --root-ca-file argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
1.3.6 Upewnij się, że argument RotateKubeletServerCertificate ma wartość true Zautomatyzowane L2 Zdane
1.3.7 Upewnij się, że --bind-address argument jest ustawiony na 127.0.0.1 Zautomatyzowane L1 Równoważna kontrolka
1.4 Planista
1.4.1 Upewnij się, że --profiling argument ma wartość false Zautomatyzowane L1 Zdane
1.4.2 Upewnij się, że --bind-address argument jest ustawiony na 127.0.0.1 Zautomatyzowane L1 Równoważna kontrolka
2 etcd
2.1 Upewnij się, że --cert-file argumenty i --key-file są ustawione odpowiednio Zautomatyzowane L1 Zdane
2,2 Upewnij się, że --client-cert-auth argument ma wartość true Zautomatyzowane L1 Zdane
2.3 Upewnij się, że --auto-tls argument nie jest ustawiony na true Zautomatyzowane L1 Zdane
2,4 Upewnij się, że --peer-cert-file argumenty i --peer-key-file są ustawione odpowiednio Zautomatyzowane L1 Zdane
2,5 Upewnij się, że --peer-client-cert-auth argument ma wartość true Zautomatyzowane L1 Zdane
2.6 Upewnij się, że --peer-auto-tls argument nie jest ustawiony na true Zautomatyzowane L1 Zdane
2.7 Upewnij się, że używany jest unikatowy urząd certyfikacji itp. Ręcznie L2 Zdane
3 Konfiguracja płaszczyzny sterowania
3.1 Uwierzytelnianie i autoryzacja
3.1.1 Uwierzytelnianie certyfikatu klienta nie powinno być używane dla użytkowników Ręcznie L1 Zdane
3.1.2 Uwierzytelnianie tokenu konta usługi nie powinno być używane dla użytkowników Ręcznie L1 Zdane
3.1.3 Uwierzytelnianie tokenu bootstrap nie powinno być używane dla użytkowników Ręcznie L1 Zdane
3.2 Rejestrowanie
3.2.1 Upewnij się, że utworzono minimalne zasady inspekcji Ręcznie L1 Zdane
3.2.2 Upewnij się, że zasady inspekcji obejmują kluczowe zagadnienia dotyczące zabezpieczeń Ręcznie L2 Zdane
100 Węzły procesu roboczego
4.1 Pliki konfiguracji węzła procesu roboczego
4.1.1 Upewnij się, że uprawnienia pliku usługi kubelet są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Zdane
4.1.2 Upewnij się, że własność pliku usługi kubelet jest ustawiona na root:root Zautomatyzowane L1 Zdane
4.1.3 Jeśli plik kubeconfig serwera proxy istnieje, upewnij się, że uprawnienia są ustawione na 600 lub bardziej restrykcyjne Ręcznie L1 Nie dotyczy
4.1.4 Jeśli plik kubeconfig serwera proxy istnieje, upewnij się, że właściwość jest ustawiona na root:root Ręcznie L1 Nie dotyczy
4.1.5 Upewnij się, że --kubeconfig uprawnienia pliku kubelet.conf są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Zdane
4.1.6 Upewnij się, że --kubeconfig własność pliku kubelet.conf jest ustawiona na root:root Zautomatyzowane L1 Zdane
4.1.7 Upewnij się, że uprawnienia do plików urzędów certyfikacji są ustawione na 600 lub bardziej restrykcyjne Ręcznie L1 Zdane
4.1.8 Upewnij się, że własność pliku urzędu certyfikacji klienta jest ustawiona na root:root Ręcznie L1 Zdane
4.1.9 Jeśli jest używany plik konfiguracji kubelet config.yaml, upewnij się, że uprawnienia są ustawione na 600 lub bardziej restrykcyjne Zautomatyzowane L1 Zdane
4.1.10 Jeśli używany jest plik konfiguracji kubelet config.yaml, upewnij się, że właściwość własności pliku jest ustawiona na root:root Zautomatyzowane L1 Zdane
4.2 Kubelet
4.2.1 Upewnij się, że --anonymous-auth argument ma wartość false Zautomatyzowane L1 Zdane
4.2.2 Upewnij się, że --authorization-mode argument nie jest ustawiony na Wartość AlwaysAllow Zautomatyzowane L1 Zdane
4.2.3 Upewnij się, że --client-ca-file argument jest ustawiony zgodnie z potrzebami Zautomatyzowane L1 Zdane
4.2.4 Upewnij się, że --read-only-port argument ma wartość 0 Ręcznie L1 Zdane
4.2.5 Upewnij się, że --streaming-connection-idle-timeout argument nie jest ustawiony na 0 Ręcznie L1 Zdane
4.2.6 Upewnij się, że --make-iptables-util-chains argument ma wartość true Zautomatyzowane L1 Zdane
4.2.7 Upewnij się, że --hostname-override argument nie został ustawiony Ręcznie L1 Zdane
4.2.8 Upewnij się, że --eventRecordQPS argument jest ustawiony na poziom, który zapewnia odpowiednie przechwytywanie zdarzeń Ręcznie L2 Zdane
4.2.9 Upewnij się, że --tls-cert-file argumenty i --tls-private-key-file są ustawione odpowiednio Ręcznie L1 Zdane
4.2.10 Upewnij się, że --rotate-certificates argument nie jest ustawiony na wartość false Zautomatyzowane L1 Zdane
4.2.11 Sprawdź, czy argument RotateKubeletServerCertificate ma wartość true Ręcznie L1 Niepowodzenie
4.2.12 Upewnij się, że rozwiązanie Kubelet korzysta tylko z silnych szyfrów kryptograficznych Ręcznie L1 Zdane
4.2.13 Upewnij się, że ustawiono limit dla identyfikatorów PID zasobników Ręcznie L1 Zdane
4.3 kube-proxy
4.3.1 Upewnij się, że usługa metryk kube-proxy jest powiązana z hostem lokalnym Zautomatyzowane L1 Zdane
5 Zasady
5,1 Kontrola dostępu oparta na rolach i konta usługi
5.1.1 Upewnij się, że rola administratora klastra jest używana tylko wtedy, gdy jest to wymagane Zautomatyzowane L1 Zależy od środowiska
5.1.2 Minimalizowanie dostępu do wpisów tajnych Zautomatyzowane L1 Zależy od środowiska
5.1.3 Minimalizowanie użycia symboli wieloznacznych w rolach i rolach klastra Zautomatyzowane L1 Zależy od środowiska
5.1.4 Minimalizowanie dostępu do tworzenia zasobników Zautomatyzowane L1 Zależy od środowiska
5.1.5 Upewnij się, że domyślne konta usług nie są aktywnie używane Zautomatyzowane L1 Zależy od środowiska
5.1.6 Upewnij się, że tokeny konta usługi są instalowane tylko w razie potrzeby Zautomatyzowane L1 Zależy od środowiska
5.1.7 Unikaj używania grupy system:masters Ręcznie L1 Zależy od środowiska
5.1.8 Ograniczanie użycia uprawnień wiązania, personifikacji i eskalacji w klastrze Kubernetes Ręcznie L1 Zależy od środowiska
5.1.9 Minimalizowanie dostępu do tworzenia woluminów trwałych Ręcznie L1 Zależy od środowiska
5.1.10 Minimalizuj dostęp do podrzędnego zasobu serwera proxy węzłów Ręcznie L1 Zależy od środowiska
5.1.11 Zminimalizuj dostęp do zasobu podrzędnego zatwierdzania obiektów certificatesigningrequests Ręcznie L1 Zależy od środowiska
5.1.12 Minimalizowanie dostępu do obiektów konfiguracji elementu webhook Ręcznie L1 Zależy od środowiska
5.1.13 Minimalizowanie dostępu do tworzenia tokenu konta usługi Ręcznie L1 Zależy od środowiska
5.2 Standardy zabezpieczeń zasobnika
5.2.1 Upewnij się, że klaster ma co najmniej jeden aktywny mechanizm kontroli zasad Ręcznie L1 Zależy od środowiska
5.2.2 Minimalizuj przyznanie uprzywilejowanych kontenerów Ręcznie L1 Zależy od środowiska
5.2.3 Zminimalizuj przyznanie kontenerów, które chcą udostępnić przestrzeń nazw identyfikatora procesu hosta Ręcznie L1 Zależy od środowiska
5.2.4 Zminimalizowanie wpływu kontenerów, które chcą udostępnić przestrzeń nazw IPC hosta Ręcznie L1 Zależy od środowiska
5.2.5 Zminimalizowanie wpływu kontenerów, które chcą współużytkować przestrzeń nazw sieci hosta Ręcznie L1 Zależy od środowiska
5.2.6 Minimalizowanie wpływu kontenerów na element allowPrivilegeEscalation Ręcznie L1 Zależy od środowiska
5.2.7 Minimalizowanie wpływu kontenerów głównych Ręcznie L2 Zależy od środowiska
5.2.8 Minimalizowanie wpływu kontenerów na NET_RAW możliwości Ręcznie L1 Zależy od środowiska
5.2.9 Minimalizowanie wpływu kontenerów z dodanymi możliwościami Ręcznie L1 Zależy od środowiska
5.2.10 Zminimalizowanie wpływu kontenerów z przypisanymi możliwościami Ręcznie L2 Zależy od środowiska
5.2.11 Minimalizowanie wpływu kontenerów HostProcess systemu Windows Ręcznie L1 Zależy od środowiska
5.2.12 Minimalizuj przyznanie woluminów HostPath Ręcznie L1 Zależy od środowiska
5.2.13 Minimalizowanie wpływu kontenerów korzystających z hostPorts Ręcznie L1 Zależy od środowiska
5.3 Zasady sieci i sieć CNI
5.3.1 Upewnij się, że używana sieć CNI obsługuje zasady sieciowe Ręcznie L1 Zdane
5.3.2 Upewnij się, że wszystkie przestrzenie nazw mają zdefiniowane zasady sieciowe Ręcznie L2 Zależy od środowiska
5,4 Zarządzanie wpisami tajnymi
5.4.1 Preferuj używanie wpisów tajnych jako plików wpisów tajnych jako zmiennych środowiskowych Ręcznie L2 Zależy od środowiska
5.4.2 Rozważ zewnętrzny magazyn wpisów tajnych Ręcznie L2 Zależy od środowiska
5,5 Rozszerzalna kontrola przyjęcia
5.5.1 Konfigurowanie narzędzia Image Provenance przy użyciu kontrolera przyjęcia elementu ImagePolicyWebhook Ręcznie L2 Niepowodzenie
5,6 Zasady ogólne
5.6.1 Tworzenie granic administracyjnych między zasobami przy użyciu przestrzeni nazw Ręcznie L1 Zależy od środowiska
5.6.2 Upewnij się, że profil seccomp jest ustawiony na platformę Docker/default w definicjach zasobników Ręcznie L2 Zależy od środowiska
5.6.3 Stosowanie kontekstu zabezpieczeń do zasobników i kontenerów Ręcznie L2 Zależy od środowiska
5.6.4 Nie należy używać domyślnej przestrzeni nazw Ręcznie L2 Zależy od środowiska

Uwaga

Oprócz testu porównawczego CIS platformy Kubernetes dostępny jest również test porównawczy usługi AKS CIS.

Dodatkowe uwagi

  • System operacyjny ze wzmocnionymi zabezpieczeniami jest kompilowany i obsługiwany specjalnie dla usługi AKS i nie jest obsługiwany poza platformą AKS.
  • Aby jeszcze bardziej zmniejszyć obszar obszaru podatnego na ataki, niektóre niepotrzebne sterowniki modułów jądra są wyłączone w systemie operacyjnym.

Następne kroki

Aby uzyskać więcej informacji na temat zabezpieczeń usługi AKS, zobacz następujące artykuły: