Dein AWS Account ist eines der wertvollsten Dinge wenn du Applikationen in AWS betreibst. Wenn du nur einen einzigen AWS Account verwaltest stellt das ein ernsthaftes Sicherheitsrisiko dar. In diesem Artikel lernst du warum das ein Problem ist und wie du es lösen kannst.
Der riskante Standard: Ein einziger AWS Account
Ein einziger AWS Account verwaltet IAM Benutzer zusammen mit EC2 Instanzen, S3 Buckets, RDS Datenbanken und eine Menge andere Ressourcen die nötig sind um deine Applikation zu betreiben. Du hast im Grunde zwei Möglichkeiten dich als IAM Benutzer anzumelden: Über die webbasierte AWS Management Console (Benutzername + Passwort) oder AWS Access Credentials die von der CLI und SDKs verwendet werden. Die Abbildung verdeutlicht wie du dich mit einem einzigen AWS Account authentifizierst.
Wenn du im Terminal das AWS CLI verwendest, z.B.:
$ aws ec2 describe-instances
werden deine AWS Access Credentials die in der Regel im Benutzerverzeichnis im Irdner .aws
gespeichert sind verwendet um deine Anfrage zu authentifizieren. Du authentifizierst dich im Hintergrund als ein IAM Benutzer. Der IAM Benutzer hat in den meisten Fällen AdministratorAccess
, was so viel heißt wie der Benutzer darf alles. Was für einen Administrator am Anfang auch sinnvoll ist. Allerdings bist du in großen Problemen wenn deine AWS Access Credentials in die falschen Hände geraten.
Du kannst die Situation auf zwei Arten verbessern.
1. Nutze keinen Benutzer mit AdministratorAccess
Nach dem “principle of least privilege”, ist es sehr unwahrscheinlich das du AdministratorAccess
benötigst was dir alle möglichen Aktionen erlaubt. PowerUserAccess
ist eine Verbesserung, da es alles Aktionen erlaubt bis auf Interaktion mit dem IAM Service. Viel besser ist die Nutzung von ReadOnlyAccess
als Standard und Schreibenden Zugriff nur wenn er wirklich benötigt wird. Aber das ist mit IAM Benutzern aufwändig umzusetzen. Du müsstest einen Benutzer für jedes “least privilege” anlegen und die entsprechenden Access Credentials auf deinem Rechner ablegen. Bei jeder Interaktion mit AWS must du dann den richtigen User verwenden. Das wird schnell sehr umständlich wenn mehrere Personen mit einer Vielzahl an AWS Services arbeiten.
2. Benutze Zwei-Faktor-Authentifizierung
AWS unterstützt Zwei-Faktor-Authentifizierung (MFA). Du kannst dein MFA Token entweder mit Hardware oder Software (App für dein Smartphone) erzeugen. Benutzername + Passwort oder AWS Access Credentials müssen dann zusammen mit einem 6-stelligen Token verwenden werden um einen IAM Benutzer zu authentifizieren. Dein AWS Account ist damit viel besser geschützt, da ein Angreifer zusätzlich dein MFA Device entwenden muss.
Lese weiter um zu lernen wie du diese Verbesserungen umsetzen kannst.
Trenne Verantwortungen mit einem Bastion Account
Statt nur einen einzigen AWS Account zu nutzen, legst du einen weiteren AWS Account an. Ich nennen diesen Account deinen Bastion Account. Der Bastion Account wird nur IAM Benutzer verwalten — ansonsten nichts. Die Abbildung verdeutlicht die Idee.
IAM Benutzer im Bastion Account sind stark eingeschränkt in ihren Rechten. Sie dürfen nur temporäre Crendentials erzeugen und eine IAM Rolle einnehmen. Lege dazu eine IAM Gruppe im Bastion Account an mit der Inline Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "*",
"Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
},
{
"Sid": "2",
"Effect": "Allow",
"Action": [
"sts:GetSessionToken"
],
"Resource": "*"
}
]
}
Weiße diese Gruppe allen IAM Benutzern im Bastion Account zu. Stelle sicher, dass die IAM Benutzer sonst keine Policies zugewiesen haben!
Das erste Statement
erlaubt einem IAM Benutzer eine IAM Rolle einzunehmen aber nur dann, wenn die Anfrage über MFA authentifiziert wurde. Das zweite Statement
erlaubt einem Benutzer mit einem MFA-Token temporäre Credentials zu erzeugen. Schauen wir uns das genauer an.
Die sichere Lösung: MFA mit Rollen Delegation
Es wird Zeit die Lösung zusammenzufassen: Wie funktioniert es? Die folgende Abbildung demonstriert den kompletten Ablauf.
- Du hast AWS Access Credentials für deinen IAM Benutzer im Bastion Account auf deinem Rechner (normalerweise im BenutzerVerzeichnis im Ordner
.aws
oder in den Umgebungsvariablen abgelegt). Du stellst eine Anfrage an die AWS API um temporäre Credentials zu bekommen durch Angabe des MFA-Tokens. Wenn das MFA-Token valide ist wird eine temporäre Sitzung mit deinem IAM Benutzer im Bastion Account erzeugt. - Du erhältst Access Credentials für diese Sitzung.
- Mit dem temporären Credentials kannst du jetzt eine IAM Rolle in einem anderen AWS Account einzunehmen. (Das war vorher nicht möglich, da das einnehmen einer Rolle nur für mit MFA authentifizierte Benutzer erlaubt ist.) Um eine Rolle in einem anderen Account einzunehmen muss die Rolle die Account-ID des Bastion Accounts explizit erlauben! Eine Rolle sollte nicht mehr Rechte als
PowerUserAccess
haben, also nicht Zugriff auf den IAM Service gewähren. - Durch das einnehmen einer Rolle erhältst du neue temporäre Credentials die benutzt werden um AWS Anfragen zu authentifizieren.
Implementierung
Um diesen Prozess zu automatisieren kannst du unser mfacli Skript verwenden.
Lese mehr über Amazon Web Services
Willst du mehr über Amazon Web Services lernen? Andreas und Ich schreiben ein Buch mit dem Titel Amazon Web Services in Action. Das Buch erscheint in englischer Sprache und wird von Manning verlegt. Das Buch wurde für Entwickler und Administratoren mit Interesse an der DevOps Bewegung geschrieben. Du lernst wie du verteilte Anwendungen auf der Plattform die AWS bietet betreibst. Es werden keine AWS Kenntnisse vorausgesetzt.