Wer entscheidet, welche Tür aufgeht?
Der Schülerausweis öffnet die Tür zur Bibliothek, aber nicht die zum Lehrerzimmer. Jemand hat aufgeschrieben, welche Türen jeder Ausweis öffnen darf.
In der Cloud ist es genauso. Eine IAM-Policy ist die geschriebene Liste dessen, was eine Person oder ein Programm tun darf. Diese Lektion zeigt, wie Sie eine Policy lesen und sagen, ob ein Aufruf erlaubt ist.
Am Ende dieser Lektion
Notiz
Ich kann eine Policy lesen und sagen, ob ein Aufruf erlaubt ist.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Policy | ein Dokument, das aufführt, was getan werden darf und was nicht | |
| Statement | eine einzelne Regel innerhalb einer Policy | |
| Effect | ob ein Statement erlaubt oder verweigert | |
| Action | der Aufruf, der gemacht wird | s3:GetObject |
| Resource | das, worauf der Aufruf gemacht wird | |
| Minimalprinzip | nur den Zugriff geben, den eine Aufgabe braucht |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Policy ist eine Liste von Statements
Eine Policy ist ein JSON-Dokument. Es hat eine Version und eine Liste namens Statement. Jedes Statement sagt drei Dinge: den Effect, die Action und die Resource.
Der Effect ist Allow oder Deny. Die Action ist der Aufruf, etwa s3:GetObject, der eine Datei liest. Die Resource ist das, worauf der Aufruf geht, benannt durch einen langen Text, einen ARN. Diese Policies sind erfunden. Nichts hier braucht ein Konto.
Run: eine Policy lesen
policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::fotos-demo/*",
},
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": "arn:aws:s3:::fotos-demo/privat/*",
},
],
}
for anweisung in policy["Statement"]:
print(anweisung["Effect"], anweisung["Action"], anweisung["Resource"])
# Ändern Sie "Deny" in "Allow". Das Programm liest es trotzdem. Ändert sich die Bedeutung?
Ein Stern passt auf jede Zeichenfolge
Jeden Dateinamen aufzuschreiben, würde ewig dauern. Darum darf ein Muster einen Stern enthalten. Ein Stern passt auf jede Folge von Zeichen, auch auf gar keine.
Die Resource "arn:aws:s3:::fotos-demo/" passt auf jedes Objekt in diesem Bucket. Die Action "s3:" passt auf jeden S3-Aufruf. Ein Muster ohne Stern muss genau übereinstimmen.
Beispiel: auf welche Texte ein Muster passt
| Muster | Text | Passt? |
|---|---|---|
| s3:* | s3:GetObject | Ja |
| s3:* | sqs:SendMessage | Nein, es beginnt nicht mit s3: |
| s3:Get* | s3:GetObject | Ja |
| s3:Get* | s3:PutObject | Nein |
| fotos/* | fotos/ | Ja, der Stern passt auf nichts |
| *.jpg | katze.jpg | Ja |
| s3:GetObject | s3:GetObjectAcl | Nein, kein Stern, also genau |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Deny gewinnt immer
Um einen Aufruf zu entscheiden, suchen Sie jedes Statement, dessen Action und Resource beide auf ihn passen. Wenden Sie dann drei Regeln an.
Sagt ein passendes Statement Deny, wird der Aufruf verweigert. Das ist ein ausdrückliches Deny, und es gewinnt gegen jedes Allow. Verweigert keins, aber eins erlaubt, ist der Aufruf erlaubt. Passt nichts, wird er trotzdem verweigert. Das ist ein stilles Deny.
Beispiel: drei Aufrufe auf der Fotos-Policy
| Aufruf | Passende Statements | Ergebnis |
|---|---|---|
| s3:GetObject auf fotos-demo/katze.jpg | nur Allow | Erlaubt |
| s3:GetObject auf fotos-demo/privat/ausweis.jpg | Allow und Deny | Verweigert: ausdrückliches Deny gewinnt |
| sqs:SendMessage auf eine Warteschlange | keine | Verweigert: stilles Deny |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Aufruf sei erlaubt, solange keine Policy ihn verbietet. Es ist umgekehrt. Ein Aufruf wird verweigert, solange kein Statement ihn erlaubt, und ein Deny schlägt jedes Allow.
Run: drei Regeln in Code
passend = ["Allow", "Deny"]
if "Deny" in passend:
ergebnis = "verweigert: ausdrückliches Deny"
elif "Allow" in passend:
ergebnis = "erlaubt"
else:
ergebnis = "verweigert: stilles Deny"
print(ergebnis)
# Ändern Sie passend in ["Allow"], dann in []. Was gibt jede Fassung aus?
Nur das Wenigste geben, das funktioniert
Eine Foto-Seite muss Fotos lesen und hinzufügen. Löschen muss sie nicht, und die Warteschlangen braucht sie auch nicht. Darum nennt ihre Policy nur diese zwei Actions, und nur für diesen einen Bucket.
Das ist das Minimalprinzip. Wird die Seite einmal missbraucht, endet der Schaden bei dem, was die Policy erlaubte.