Zarządzanie rolami IAM jako zasobami K8s

(Naveen M) (10 lipca 2020 r.)

Aplikacje wdrożone w klastrach Kubernetes na potrzeby AWS Role IAM umożliwiające zarządzanie zasobami AWS i uzyskiwanie do nich dostępu. W Intuit mamy ponad 200 klastrów i ponad 8000 przestrzeni nazw. Do niedawna role IAM były zarządzane oddzielnie od zasobów Kubernetes ze scentralizowanej aplikacji.

To działało dobrze, ale programiści musieli ręcznie aktualizować swoje zasady IAM przed wdrożeniem aplikacji. Ręczne zmiany wymagane w przypadku aktualizacji zasad stwarzały margines błędu, który powodował, że deweloperzy czasami zapominali o zaktualizowaniu swoich zasad podczas promowania ich do następnego środowiska przejściowego, co powodowało frustrację wielu programistów.

aby kontrolować, jakie uprawnienia powinny być dozwolone w naszej usłudze zarządzania klastrami, ale niektóre aplikacje platformy wymagały wyjątków, aby zezwolić na bardziej liberalne zasady. Zaczęliśmy wstawiać wyjątek do kodu, ale szybko zdaliśmy sobie sprawę, że potrzebujemy bardziej skalowalnego rozwiązania.

Wtedy właśnie wymyśliliśmy iam-manager. iam-manager to CRD k8s (Custom Resource Definition) do zarządzania rolami AWS IAM jako zasobami Kubernetes. Menedżer iam jest open source jako część projektu Keiko i umożliwia aplikacjom bezpieczne i wygodne tworzenie ról IAM oraz zarządzanie nimi w ramach ich procesu wdrażania (tj. kubectl apply) wraz z innymi zasobami Kubernetes.

Podobnie jak w przypadku każdej funkcji, która tworzy lub modyfikuje role i uprawnienia, bezpieczeństwo jest sprawą najwyższej wagi. Menedżer iam korzysta z granicy uprawnień AWS IAM wraz z innymi zabezpieczeniami, aby zapewnić odpowiedni poziom widoczności i kontroli.

Granica uprawnień AWS IAM została odtworzona ważną rolę w kwestii bezpieczeństwa dla nas, ponieważ bez niego programiści mogliby dołączyć wszelkie uprawnienia IAM do specyfikacji IAMRole, a aplikacja z rolą IAM mającą uprawnienia eks: * lub ec2: * mogłaby zniszczyć cały klaster. Chcieliśmy kontrolować, jakie uprawnienia można delegować do ról utworzonych przez IAM Managera, a Granica uprawnień jest dla nas idealnym wyborem. Granica uprawnień AWS IAM to koncepcja, w której można utworzyć granicę z listą maksymalnych dozwolonych / (lub odrzuconych) uprawnień, do których można uzyskać dostęp niezależnie od tego, co określono w zasadach dotyczących roli uprawnień. Krótko mówiąc, rzeczywiste uprawnienia będą przecięciem uprawnień określonych w Granicy uprawnień i zasadach dotyczących roli uprawnień.

Weźmy przykład, w którym rola uprawnień ma zasadę „ AdministratorAccess ”, co oznacza, że ​​ma prawie cały dostęp, ale jeśli dołączymy granicę uprawnień, ma tylko dostęp s3: Get * (którego NIE może zmienić użytkownik, ale tylko Administrator klastra), ta rola IAM może wykonywać tylko s3: Get *, mimo że rola ma uprawnienia „Administrator”. Mówiąc prościej, granice uprawnień służą do ograniczenia uprawnień, które mogą być delegowane przez iam-manager CRD. Aby uzyskać więcej informacji, zapoznaj się z AWS IAM Permission Boundary w dokumentacji aws.

Mamy również webhook do odrzucania tworzenia ról IAM, jeśli specyfikacja IAMRole ma polityka, której nie ma na białej liście, którą możemy skonfigurować za pomocą mapy konfiguracji. Jest to całkowicie opcjonalne , ponieważ granica uprawnień AWS IAM zabezpiecza nadmierne uprawnienia, ale może być używana do utrzymywania bardzo czystych zasad.

I wreszcie, musieliśmy być bardzo ostrożni z rolą IAM przypisaną do samego modułu iam-manager-controller i starannie zaprojektowaliśmy politykę uprawnień IAM w taki sposób, aby mogła wykonywać tylko ograniczone zadania. Oznacza to, że nie może tworzyć żadnej roli IAM bez dołączania predefiniowanych granic uprawnień, może tworzyć role tylko ze wstępnie zdefiniowanymi nazwami (np. K8s- *), a także nie może usuwać żadnych ról, które nie mają wstępnie zdefiniowanych TAGów (dodaliśmy TAG-y do ról utworzonych tylko przez iam-manager). Aby uzyskać więcej informacji, zapoznaj się z iam-manager zasadami IAM .

Aby zainstalować i wypróbować iam-manager:

git clone 
[email protected]:keikoproj/iam-manager.git
cd hack#update config map according to your requirements. please refer #
config map for all the configuration options
vim iammanager.keikoproj.io\_iamroles-configmap.yamlexport KUBECONFIG=/Users/myhome/.kube/[email protected]
export AWS\_PROFILE=admin\_123456789012\_account
#./install.sh [cluster\_name] [aws\_region] [aws\_profile]
./install.sh eks-dev2-k8s us-west-2 aws\_profile

Oto prosty przykład:

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action: "sts:AssumeRole"
Principal:
AWS:
- "arn:aws:iam::XXXXXXXXXXX:role/20190504-k8s-kiam-role"

Aby przesłać, kubectl apply -f iam\_role .yaml – ns namespace1

Oprócz tworzenia roli IAM i utrzymywania żądanego stanu przez cały czas, obsługuje również tworzenie ról dla IRSA (IAM Role for Service Accounts) poprzez dodanie adnotacji
iam.amazonaws.com/irsa-service-account: zgodnie ze specyfikacją roli IAM .

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole-irsa
annotations:
iam.amazonaws.com/irsa-service-account: aws-sa
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"

Podsumowując, dodanie iam-manager do klastra Kubernetes nie tylko zapewnia bezpieczne i wygodne rozwiązanie do zarządzania rolami AWS IAM wewnątrz klastra, ale także umożliwia aplikacjom zespoły do utworzenia roli IAM w ramach procesu wdrażania wraz z innymi zasobami Kubernetes za pośrednictwem GitOps.

Pełną listę funkcji można znaleźć w sekcji funkcji pod adresem https://github.com/keikoproj/iam-manager .

Również wielkie podziękowania dla (Ed Lee), (Kshama Jain) i innych członków zespołu za ich cenny wkład w iam-manager.