IAM-rollen beheren als K8s-bronnen

(Naveen M) (10 juli 2020)

Toepassingen geïmplementeerd in Kubernetes-clusters op AWS-behoefte IAM-rollen voor het beheren en openen van AWS-bronnen. Bij Intuit hebben we 200+ clusters en 8000+ naamruimten. Tot voor kort werden IAM-rollen apart beheerd van Kubernetes-bronnen vanuit een gecentraliseerde applicatie.

Dit werkte prima, maar ontwikkelaars moesten hun IAM-beleid handmatig bijwerken voordat ze hun applicatie implementeerden. Handmatige wijzigingen die nodig zijn voor IAM-beleidsupdates creëerden een foutmarge waarbij ontwikkelaars soms vergeten hun IAM-beleid bij te werken terwijl ze het promootten naar de volgende testomgeving, en dit veroorzaakte een frustratie voor veel ontwikkelaars.

We gebruikten om te bepalen welke machtigingen moeten worden toegestaan ​​vanuit onze clusterbeheerservice, maar voor sommige platformtoepassingen waren uitzonderingen nodig om een ​​meer tolerant beleid mogelijk te maken. We begonnen de uitzondering in de code te verwerken, maar realiseerden ons al snel dat we een meer schaalbare oplossing nodig hadden.

Toen kwamen we met de iam-manager. De iam-manager is een k8s CRD (Custom Resource Definition) om AWS IAM-rollen als Kubernetes-resources te beheren. De iam-manager is open source als onderdeel van het Keiko-project en stelt applicaties in staat om veilig en gemakkelijk IAM-rollen te maken en te beheren als onderdeel van hun implementatiepijplijn (bijv. kubectl apply) samen met andere Kubernetes-bronnen.

Zoals met elke functie die rollen en machtigingen creëert of wijzigt, is beveiliging van het grootste belang. De iam-manager gebruikt AWS IAM Permission Boundary samen met andere veiligheidsmaatregelen om de juiste niveaus van zichtbaarheid en controle te garanderen.

AWS IAM Permission Boundary gespeeld een belangrijke rol in termen van beveiliging voor ons, omdat zonder dit, ontwikkelaars alle IAM-machtigingen in de IAMRole-specificatie zouden kunnen opnemen en een toepassing met een IAM-rol met eks: * of ec2: * -machtigingen het hele cluster zou kunnen vernietigen. We wilden bepalen welke machtigingen kunnen worden gedelegeerd aan de rollen die zijn gemaakt door IAM Manager, en Permission Boundary is de perfecte keuze voor ons. AWS IAM-machtigingsgrens is een concept waarbij u een grens kunt creëren met de lijst van maximaal toegestane / (of geweigerde) IAM-machtigingen die toegankelijk zijn, ongeacht wat is gespecificeerd in een IAM-rolbeleid. Kortom, de feitelijke machtigingen zijn de intersectie van de machtigingen die zijn gespecificeerd in de machtigingsgrens en het IAM-rolbeleid.

Laten we een voorbeeld nemen waarin een IAM-rol een “ AdministratorAccess ” -beleid heeft, wat betekent dat deze vrijwel alle toegang heeft, maar als we een machtigingsgrens toevoegen die heeft alleen s3: Get * toegang (die NIET kan worden gewijzigd door de gebruiker maar alleen door de clusterbeheerder), die IAM-rol kan alleen s3: Get * uitvoeren, ook al heeft de rol “Administrator” -rechten. In eenvoudige bewoordingen worden machtigingsgrenzen gebruikt om de machtigingen te beperken die kunnen worden gedelegeerd door de iam-manager CRD. Bekijk de AWS IAM Permission Boundary uit de aws-documentatie voor meer informatie.

We hebben ook een webhook om IAM-rolcreaties te weigeren als IAMRole-specificatie een beleid dat niet is opgenomen in beleid op de witte lijst dat we kunnen configureren via configuratiekaart. Dit is volledig optioneel aangezien AWS IAM Permission Boundary buitensporige permissies regelt, maar kan worden gebruikt om het beleid zeer schoon te houden.

En last but not least, we moesten heel voorzichtig zijn met de IAM-rol die is toegewezen aan de iam-manager-controller pod zelf en we hebben het IAM-toestemmingsbeleid zorgvuldig ontworpen op een manier waarop het slechts beperkte taken kan uitvoeren. Dat wil zeggen, het kan geen IAM-rol maken zonder een vooraf gedefinieerde machtigingsgrens toe te voegen, kan alleen rollen maken met vooraf gedefinieerde namen (bijv. K8s- *) en kan ook geen rollen verwijderen die geen vooraf gedefinieerde TAGs hebben (we hebben de TAGs toegevoegd aan de rollen die alleen door iam-manager zijn gemaakt). Voor meer informatie verwijzen wij u naar het iam-manager IAM-beleid .

Om iam-manager te installeren en uit te proberen:

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 is een eenvoudig voorbeeld:

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"

Om in te dienen, kubectl toepassen -f iam\_role .yaml – ns namespace1

Naast het creëren van een IAM-rol en het constant behouden van de gewenste status, ondersteunt het ook het maken van rollen voor IRSA (IAM-rol voor serviceaccounts) door een annotatie toe te voegen
iam.amazonaws.com/irsa-service-account: naar de IAM-rolspecificatie .

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"

Samenvattend: het toevoegen van iam-manager aan een Kubernetes-cluster biedt niet alleen een veilige en gemakkelijke oplossing voor AWS IAM-rolbeheer binnen een cluster, maar maakt ook toepassingen mogelijk teams om een IAM-rol te maken als onderdeel van hun implementatiepijplijn, samen met andere Kubernetes-bronnen via GitOps.

Voor een volledige lijst met functies kunt u de sectie met functies bekijken op https://github.com/keikoproj/iam-manager .

Ook grote dank aan (Ed Lee), (Kshama Jain) en andere teamleden voor hun waardevolle bijdrage aan iam-manager.