Najlepsze rozwiązania dotyczące zabezpieczeń zasobników w usłudze Azure Kubernetes Service (AKS)
Podczas tworzenia i uruchamiania aplikacji w usłudze Azure Kubernetes Service (AKS) bezpieczeństwo zasobników jest kluczowym czynnikiem. Aplikacje powinny być zaprojektowane z myślą o zasadzie najmniejszej liczby wymaganych uprawnień. Zabezpieczanie prywatnych danych jest najważniejsze dla klientów. Nie chcesz, aby poświadczenia, takie jak parametry połączenia bazy danych, klucze lub wpisy tajne i certyfikaty udostępniane światu zewnętrznemu, gdzie osoba atakująca mogła wykorzystać te wpisy tajne do złośliwych celów. Nie dodawaj ich do kodu ani osadzaj ich na obrazach kontenerów. Takie podejście spowodowałoby ryzyko ujawnienia i ograniczenia możliwości rotacji tych poświadczeń, ponieważ obrazy kontenerów będą musiały zostać ponownie skompilowane.
Ten artykuł dotyczący najlepszych rozwiązań koncentruje się na sposobie zabezpieczania zasobników w usłudze AKS. Dowiedz się, jak odbywa się:
- Używanie kontekstu zabezpieczeń zasobnika w celu ograniczenia dostępu do procesów i usług lub eskalacji uprawnień
- Uwierzytelnianie przy użyciu innych zasobów platformy Azure przy użyciu Tożsamość obciążeń Microsoft Entra
- Żądanie i pobranie poświadczeń z magazynu cyfrowego, takiego jak usługa Azure Key Vault
Możesz również zapoznać się z najlepszymi rozwiązaniami dotyczącymi zabezpieczeń klastra i zarządzania obrazami kontenerów.
Zabezpieczanie dostępu zasobnika do zasobów
Wskazówki dotyczące najlepszych rozwiązań — aby uruchomić jako inny użytkownik lub grupę i ograniczyć dostęp do podstawowych procesów i usług węzła, zdefiniuj ustawienia kontekstu zabezpieczeń zasobnika. Przypisz najmniejszą wymaganą liczbę uprawnień.
Aby aplikacje działały poprawnie, zasobniki powinny być uruchamiane jako zdefiniowany użytkownik lub grupa, a nie jako katalog główny. Dla securityContext
zasobnika lub kontenera można zdefiniować ustawienia, takie jak runAsUser lub fsGroup , aby przyjąć odpowiednie uprawnienia. Przypisz tylko wymagane uprawnienia użytkownika lub grupy i nie używaj kontekstu zabezpieczeń jako środka, aby objąć dodatkowe uprawnienia. Ustawienia runAsUser, privilege escalation i inne ustawienia funkcji systemu Linux są dostępne tylko w węzłach i zasobnikach systemu Linux.
Po uruchomieniu jako użytkownik niebędący użytkownikiem głównym kontenery nie mogą powiązać z uprzywilejowanych portów w wersji 1024. W tym scenariuszu usługi Kubernetes Services mogą służyć do ukrywania faktu, że aplikacja działa na określonym porcie.
Kontekst zabezpieczeń zasobnika może również definiować dodatkowe możliwości lub uprawnienia dostępu do procesów i usług. Można ustawić następujące typowe definicje kontekstu zabezpieczeń:
- allowPrivilegeEscalation określa, czy zasobnik może przyjąć uprawnienia główne . Zaprojektuj aplikacje, aby to ustawienie zawsze było ustawione na wartość false.
- Możliwości systemu Linux umożliwiają zasobnikowi dostęp do podstawowych procesów węzłów. Zadbaj o przypisywanie tych możliwości. Przypisz najmniejszą wymaganą liczbę uprawnień. Aby uzyskać więcej informacji, zobacz Możliwości systemu Linux.
- Etykiety SELinux to moduł zabezpieczeń jądra systemu Linux, który umożliwia definiowanie zasad dostępu dla usług, procesów i dostępu do systemu plików. Ponownie przypisz najmniejszą wymaganą liczbę uprawnień. Aby uzyskać więcej informacji, zobacz opcje SELinux na platformie Kubernetes
Poniższy przykładowy manifest YAML ustawia ustawienia kontekstu zabezpieczeń w celu zdefiniowania:
- Zasobnik działa jako identyfikator użytkownika 1000 i część identyfikatora grupy 2000
- Nie można eskalować uprawnień do użycia
root
- Umożliwia systemowi Linux dostęp do interfejsów sieciowych i zegara czasu rzeczywistego hosta (sprzętu)
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
fsGroup: 2000
containers:
- name: security-context-demo
image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
securityContext:
runAsUser: 1000
allowPrivilegeEscalation: false
capabilities:
add: ["NET_ADMIN", "SYS_TIME"]
Skontaktuj się z operatorem klastra, aby określić potrzebne ustawienia kontekstu zabezpieczeń. Spróbuj zaprojektować aplikacje, aby zminimalizować dodatkowe uprawnienia i uzyskać dostęp do zasobnika. Istnieją dodatkowe funkcje zabezpieczeń, które umożliwiają ograniczenie dostępu przy użyciu programu AppArmor i seccomp (bezpiecznego przetwarzania), które mogą być implementowane przez operatory klastra. Aby uzyskać więcej informacji, zobacz Bezpieczny dostęp kontenera do zasobów.
Ograniczanie ujawnienia poświadczeń
Wskazówki dotyczące najlepszych rozwiązań — nie należy definiować poświadczeń w kodzie aplikacji. Użyj tożsamości zarządzanych dla zasobów platformy Azure, aby umożliwić zasobnikowi żądanie dostępu do innych zasobów. Magazyn cyfrowy, taki jak usługa Azure Key Vault, powinien być również używany do przechowywania i pobierania kluczy cyfrowych i poświadczeń. Tożsamości zarządzane przez zasobniki są przeznaczone tylko do użytku z zasobnikami systemu Linux i obrazami kontenerów.
Aby ograniczyć ryzyko ujawnienia poświadczeń w kodzie aplikacji, unikaj używania stałych lub udostępnionych poświadczeń. Poświadczenia lub klucze nie powinny być uwzględniane bezpośrednio w kodzie. Jeśli te poświadczenia zostaną ujawnione, aplikacja musi zostać zaktualizowana i wdrożona ponownie. Lepszym rozwiązaniem jest zapewnienie zasobnikom własnej tożsamości i sposobu uwierzytelniania się lub automatycznego pobierania poświadczeń z magazynu cyfrowego.
Używanie Tożsamość obciążeń Microsoft Entra
Tożsamość obciążenia to tożsamość używana przez aplikację działającą na zasobniku, która może uwierzytelniać się w innych usługach platformy Azure, które ją obsługują, takich jak Storage lub SQL. Integruje się z możliwościami natywnymi dla platformy Kubernetes w celu federacji z zewnętrznymi dostawcami tożsamości. W tym modelu zabezpieczeń klaster usługi AKS działa jako wystawca tokenu, identyfikator Entra firmy Microsoft używa programu OpenID Connect do odnajdywania publicznych kluczy podpisywania i weryfikowania autentyczności tokenu konta usługi przed wymianą go dla tokenu Firmy Microsoft Entra. Obciążenie może wymienić token konta usługi przewidywany na wolumin dla tokenu entra firmy Microsoft przy użyciu biblioteki klienta tożsamości platformy Azure przy użyciu zestawu Azure SDK lub biblioteki Microsoft Authentication Library (MSAL).
Aby uzyskać więcej informacji na temat tożsamości obciążeń, zobacz Konfigurowanie klastra usługi AKS do używania Tożsamość obciążeń Microsoft Entra z aplikacjami
Używanie usługi Azure Key Vault ze sterownikiem CSI magazynu wpisów tajnych
Użycie Tożsamość obciążeń Microsoft Entra umożliwia uwierzytelnianie przed obsługą usług platformy Azure. W przypadku własnych usług lub aplikacji bez tożsamości zarządzanych dla zasobów platformy Azure nadal można uwierzytelnić się przy użyciu poświadczeń lub kluczy. Magazyn cyfrowy może służyć do przechowywania tych wpisów tajnych.
Gdy aplikacje potrzebują poświadczeń, komunikują się z magazynem cyfrowym, pobierają najnowszą zawartość wpisu tajnego, a następnie łączą się z wymaganą usługą. Usługa Azure Key Vault może być tym magazynem cyfrowym. Uproszczony przepływ pracy pobierania poświadczeń z usługi Azure Key Vault przy użyciu tożsamości zarządzanych zasobników przedstawiono na poniższym diagramie:
Usługa Key Vault przechowuje i regularnie wymienia wpisy tajne, takie jak poświadczenia, klucze konta magazynu lub certyfikaty. Usługę Azure Key Vault można zintegrować z klastrem usługi AKS przy użyciu dostawcy usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych. Sterownik CSI magazynu wpisów tajnych umożliwia klastrowi usługi AKS natywne pobieranie zawartości wpisu tajnego z usługi Key Vault i bezpieczne dostarczanie ich tylko do zasobnika żądającego. We współpracy z operatorem klastra w celu wdrożenia sterownika CSI magazynu wpisów tajnych na węzłach roboczych usługi AKS. Możesz użyć Tożsamość obciążeń Microsoft Entra, aby zażądać dostępu do usługi Key Vault i pobrać zawartość wpisu tajnego wymaganą za pośrednictwem sterownika CSI magazynu wpisów tajnych.
Następne kroki
W tym artykule opisano sposób zabezpieczania zasobników. Aby zaimplementować niektóre z tych obszarów, zobacz następujące artykuły:
Azure Kubernetes Service