Verwalten von IAM-Rollen als K8s-Ressourcen

(Naveen M) (10. Juli 2020)

Anwendungen, die in Kubernetes-Clustern unter AWS bereitgestellt werden IAM-Rollen zum Verwalten und Zugreifen auf AWS-Ressourcen. Bei Intuit haben wir mehr als 200 Cluster und mehr als 8000 Namespaces. Bis vor kurzem wurden IAM-Rollen getrennt von Kubernetes-Ressourcen einer zentralisierten Anwendung verwaltet.

Dies funktionierte einwandfrei, aber Entwickler mussten ihre IAM-Richtlinien manuell aktualisieren, bevor sie ihre Anwendung bereitstellen konnten. Manuelle Änderungen, die für IAM-Richtlinienaktualisierungen erforderlich sind, haben zu einer Fehlerquote geführt, bei der Entwickler manchmal vergessen, ihre IAM-Richtlinie zu aktualisieren, während sie in die nächste Staging-Umgebung hochgestuft werden. Dies hat viele Entwickler frustriert.

Wir haben verwendet Um zu steuern, welche Berechtigungen von unserem Clusterverwaltungsdienst zugelassen werden sollen, benötigten einige Plattformanwendungen Ausnahmen, um freizügigere Richtlinien zuzulassen. Wir haben angefangen, die Ausnahme in den Code zu backen, aber bald festgestellt, dass wir eine skalierbarere Lösung benötigen.

Zu diesem Zeitpunkt haben wir den iam-Manager entwickelt. Der iam-manager ist eine k8s-CRD (Custom Resource Definition) zum Verwalten von AWS IAM-Rollen als Kubernetes-Ressourcen. Der iam-Manager ist Open Source als Teil des Keiko-Projekts und ermöglicht es Anwendungen, IAM-Rollen als Teil ihrer Bereitstellungspipeline sicher und bequem zu erstellen und zu verwalten (d. H. kubectl apply) zusammen mit anderen Kubernetes-Ressourcen.

Wie bei jeder Funktion, mit der Rollen und Berechtigungen erstellt oder geändert werden, ist die Sicherheit von größter Bedeutung. Der iam-Manager verwendet AWS IAM-Berechtigungsgrenze zusammen mit anderen Sicherheitsvorkehrungen, um ein angemessenes Maß an Sichtbarkeit und Kontrolle sicherzustellen.

AWS IAM-Berechtigungsgrenze wird gespielt Dies spielt für uns eine wichtige Rolle in Bezug auf die Sicherheit, da Entwickler ohne diese Berechtigung alle IAM-Berechtigungen in die IAMRole-Spezifikation aufnehmen können und eine Anwendung mit einer IAM-Rolle mit den Berechtigungen eks: * oder ec2: * den gesamten Cluster zerstören kann. Wir wollten steuern, welche Berechtigungen an die vom IAM-Manager erstellten Rollen delegiert werden können, und die Berechtigungsgrenze ist die perfekte Wahl für uns. AWS IAM-Berechtigungsgrenze ist ein Konzept, bei dem Sie eine Grenze mit der Liste der maximal zulässigen / (oder verweigerten) IAM-Berechtigungen erstellen können, auf die unabhängig von den Angaben in einer IAM-Rollenrichtlinie zugegriffen werden kann. Kurz gesagt, die tatsächlichen Berechtigungen sind der Schnittpunkt der in der Berechtigungsgrenze und der IAM-Rollenrichtlinie angegebenen Berechtigungen.

Nehmen wir ein Beispiel, in dem eine IAM-Rolle die Richtlinie „ AdministratorAccess “ hat, was bedeutet, dass sie so gut wie allen Zugriff hat, aber wenn wir eine Berechtigungsgrenze anhängen, die hat nur s3: Get * -Zugriff (der NICHT vom Benutzer, sondern nur vom Cluster-Administrator geändert werden kann), diese IAM-Rolle kann nur s3: Get * ausführen, obwohl die Rolle über Administratorberechtigungen verfügt. Mit einfachen Worten, Berechtigungsgrenzen werden verwendet, um die Berechtigungen zu begrenzen, die vom iam-manager CRD delegiert werden können. Weitere Informationen finden Sie in der aws-Dokumentation unter AWS IAM-Berechtigungsgrenze .

Wir haben auch einen Webhook, um die Erstellung von IAM-Rollen abzulehnen, wenn die IAMRole-Spezifikation dies zulässt Eine Richtlinie, die nicht in Richtlinien auf der Whitelist enthalten ist, die wir über die Konfigurationszuordnung konfigurieren können. Dies ist völlig optional , da AWS IAM Permission Boundary übermäßige Berechtigungen berücksichtigt, aber verwendet werden kann, um Richtlinien sehr sauber zu halten.

Und zu guter Letzt mussten wir sehr vorsichtig mit der IAM-Rolle sein, die dem iam-manager-controller-Pod selbst zugewiesen wurde, und wir haben die IAM-Berechtigungsrichtlinie sorgfältig so entworfen, dass sie nur begrenzte Aufgaben ausführen kann. Das heißt, es kann keine IAM-Rolle ohne Anhängen einer vordefinierten Berechtigungsgrenze erstellen, Rollen können nur mit vordefinierten Namen (z. B. k8s- *) erstellt werden und es können auch keine Rollen gelöscht werden, die keine vordefinierten TAGs haben (Wir haben die TAGs zu den Rollen hinzugefügt, die nur von iam-manager erstellt wurden.) Weitere Informationen finden Sie in der iam-manager IAM-Richtlinie .

So installieren und testen Sie 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

Hier ist ein einfaches Beispiel:

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"

Zum Senden wenden Sie kubectl -f iam\_role an .yaml – ns Namespace1

Neben dem Erstellen einer IAM-Rolle und dem ständigen Beibehalten des gewünschten Status wird auch das Erstellen von Rollen für IRSA (IAM-Rolle für Dienstkonten) durch Hinzufügen einer Anmerkung iam.amazonaws.com/irsa-service-account: zur IAM-Rollenspezifikation .

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"

Zusammenfassend bietet das Hinzufügen von iam-manager zu einem Kubernetes-Cluster nicht nur eine sichere und bequeme Lösung für die AWS IAM-Rollenverwaltung innerhalb eines Clusters, sondern ermöglicht auch Anwendungen Teams, die eine IAM-Rolle als Teil ihrer Bereitstellungspipeline zusammen mit anderen Kubernetes-Ressourcen über GitOps erstellen.

Eine vollständige Liste der Funktionen finden Sie im Abschnitt Funktionen unter https://github.com/keikoproj/iam-manager .

Vielen Dank auch an (Ed Lee), (Kshama Jain) und andere Teammitglieder für ihren wertvollen Beitrag zu iam-manager.