2017-09-10 2 views
1

Mein übergeordnetes Ziel: Ich habe mehrere Dinge ausprobiert und die relevante AWS-Dokumentation gelesen, kann aber nicht beschreiben, wie eine S3-Bucket-Richtlinie erstellt werden soll, um Zugriff nur auf bestimmte IAM-Rollen und Cloudfront Origin Access Identity (OAI) zu gewähren.Wie schreibe ich eine S3-Bucket-Richtlinie nur an * bestimmte * IAM-Rolle und Cloudfront Origin-Zugriffsidentität?

Was ich bisher versucht: 1. ich diesen Blog gefunden, die zeigen, wie s3 bucket den Zugriff auf bestimmte IAM Rollen beschränken: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/ 2. Basierend auf dem obigen Blog schrieb ich die folgenden Eimer Politik. Mit dieser Richtlinie kann nur MY_IAM_ROLE alle Operationen aufgerufen, einen Eimer ermöglichen ‚myBucket‘:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Deny", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": [ 
       "arn:aws:s3:::myBucket", 
       "arn:aws:s3:::myBucket/*" 
      ], 
      "Condition": { 
       "StringNotLike": { 
        "aws:userId": [ 
         "MY_IAM_ROLE_USER_ID:*" 
        ] 
       } 
      } 
     } 
    ] 
} 
  1. ich nicht in der Lage bin einen aws weiten Schlüssel zu finden - http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html - für das OAI, das ich zusammen mit MY_IAM_ROLE_USER_ID in das Array "aws: userId" stecken könnte. Ich habe versucht, die CanonicalUserId des OAI anzuschließen, aber es hat nicht funktioniert.

Meine Frage: Wie kann ich (1) aws kombinieren: Benutzer-ID von IAM Rollen/Benutzer und (2) OAI-IDs in einer einzigen Police Aussage?

+0

so sind Sie wollen Ihre Cloudfront Herkunft -Zugriffsidentität auf den S3 Eimer ermöglichen, sondern auch ermöglichen, Ihre IAM-Rolle (n) Zugriff? –

+0

@MuhammadHannan Ja, erlaube * nur * spezifische IAM-Rolle und Cloudfront Origin Access Identity, und leugne alle anderen. – ktrace

+0

Ich habe zwei Möglichkeiten, wie Sie dies tun können. Es hängt nur davon ab, wie viele Personen auf Ihre IAM-Rolle zugreifen, die Sie auf die Whitelist setzen. Ich werde es durch den Fall für Sie hinzufügen, damit Sie überprüfen können. Es bricht beides zusammen, ich werde in Kürze antworten. –

Antwort

0

Zur Erinnerung: Sie benötigen eine Bucket-Richtlinie, die den Zugriff auf Ihren S3-Bucket und Inhalt einschränkt, aber den Zugriff auf Ihre Cloudfront Origin-Zugriffsidentität sowie Ihre IAM-Rolle (n) ermöglicht. Ich habe ein paar Möglichkeiten, wie Sie dies tun können, eines mit dem NotPrincipal-Element und das andere mit dem Principal-Element. Dies hängt davon ab, wie viele Personen Ihre IAM-Rolle verwenden oder ob Sie den Umfang des Zugriffs auf die Rolle skalieren möchten. Sie können verhindern, dass IAM-Entitäten (Amazon Identify and Access Management) auf Ihre Amazon S3-Buckets zugreifen, indem Sie Berechtigungen in einer Bucket-Richtlinie mithilfe des NotPrincipal-Elements und des expliziten Deny festlegen. NotPrincipal unterstützt jedoch keine Platzhalter.

In dieser Politik Beispiel müssen Sie die Rolle Sitzungsnamen jedes Benutzer auflisten und jede Instanz-ID, das die Rolle angenommen wird:

"Effect": "Deny", 
"NotPrincipal": { 
"AWS": [ 
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app", 
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/instanceID", 
    "arn:aws:iam::444455556666:role/cross-account-read-only-role", 
    "arn:aws:iam::444455556666:root" 
    ] 
} 

all diese Benutzer und Instanzen zu decken, müssen Sie eine Platzhalter in der Erklärung der angenommenen Rolle zu vertreten:

"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*" 

jedoch Platzhalter sind nicht mit dem NotPrincipal Element unterstützt. Dies funktioniert, wenn Sie nur die Rolle oder eine Instanz zum Beispiel selbst verwenden, aber wenn Sie skalieren, müssen Sie den ARN für Benutzer/Instanz hinzufügen, der die Rolle übernimmt.

Verwenden Sie in diesem Beispiel anstelle von NotPrincipal"Principal": "*" als Zieleinheit in jedem Anweisungsblock, der die Bedingung für jeden Zulassen-Block enthält. Platzhalterzeichen werden in "aws:userid": ["ROLE-ID:*"] verwendet, um alle Namen aufzunehmen, die vom aufrufenden Prozess (z. B. Anwendung, Dienst oder Instanz-ID) übergeben werden, wenn ein Aufruf zum Abrufen temporärer Anmeldeinformationen ausgeführt wird. Weitere Informationen finden Sie unter In allen Anforderungen verfügbare Informationen. Das root-Konto enthalten ist Aussperrung zu verhindern:

"Condition": { 
    "StringLike": { 
     "aws:userid": [ 
      "AROAID2GEXAMPLEROLEID:*", 
      "444455556666" 
     ] 
    } 
} 

StringNotLike im Verweigern Block:

"Condition": { 
    "StringNotLike": { 
     "aws:userid": [ 
      "AROAID2GEXAMPLEROLEID:*", 
      "444455556666" 
     ] 
    } 
} 

Dies ist die komplette Politik:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:ListBucket" 
      ], 
      "Resource": "arn:aws:s3:::myExampleBucket", 
      "Condition": { 
       "StringLike": { 
        "aws:userid": [ 
         "AROAID2GEXAMPLEROLEID:*", 
         "444455556666" 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": [ 
       "s3:DeleteObject", 
       "s3:GetObject", 
       "s3:PutObject" 
      ], 
      "Resource": "arn:aws:s3:::myExampleBucket/*", 
      "Condition": { 
       "StringLike": { 
        "aws:userid": [ 
         "AROAID2GEXAMPLEROLEID:*", 
         "444455556666" 
        ] 
       } 
      } 
     }, 
     { 
      "Sid": "", 
      "Effect": "Deny", 
      "Principal": "*", 
       "Action": "s3:*", 
       "Resource": [ 
        "arn:aws:s3:::myExampleBucket/*", 
        "arn:aws:s3:::myExampleBucket" 
       ], 
       "Condition": { 
        "StringNotLike": { 
         "aws:userid": [ 
          "AROAID2GEXAMPLEROLEID:*", 
          "444455556666" 
         ] 
        } 
       } 
      } 
     ] 
} 

Hinweis:

  • Stellen Sie sicher, dass Sie die Beispielnamen durch Ihre eigenen Rollen-IDs und Bucket-Namen ersetzen.
  • Im obigen Beispiel verwende ich die eindeutige ID für die IAM-Entität.

    aws iam get-role --role-name Test-Role 
    

    Ausgabe::

    { 
        "Role": { 
         "AssumeRolePolicyDocument": "<URL-encoded-JSON>", 
         "RoleId": "AIDIODR4TAW7CSEXAMPLE", 
         "CreateDate": "2013-04-18T05:01:58Z", 
         "RoleName": "Test-Role", 
         "Path": "/", 
         "Arn": "arn:aws:iam::123456789012:role/Test-Role" 
        } 
    } 
    
    http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids

Um Informationen über eine IAM-Rolle Der folgende get-role-Befehl erhält Informationen über die Rolle Namen Test-Rolle zu bekommen

I mportant Hinweis
Grundsätzlich, wenn Sie die Origin -Zugriffsidentität mit der CloundFront API, erstellen erhalten Sie die Benutzer-ID und S3 kanonische ID und Sie werden es diese verwenden, in dem Zustand Zeichenfolge haben zu notieren.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#private-content-creating-oai-api

Wenn Sie derzeit wie vorgeschlagen die ID nicht für die Herkunft -Zugriffsidentität Ihre Cloudfront haben, können Sie einen neuen erstellen und Sie können das ID-Element und S3 Canonical-ID speichern.

+1

@MuhammadHannad danke für das Posten der obigen Antwort, aber es löst nicht mein Problem. Cloudfront Origin Access Identity basiert ** nicht ** auf IAM und hat keinen entsprechenden Wert für "aws: userid". Daher brauche ich eine andere Lösung als die, die Sie vorschlagen. – ktrace

+0

Haben Sie gerade eine wichtige Notiz hinzugefügt, überprüfen Sie das bitte. Hoffentlich führt dies Sie in die richtige Richtung. –

+0

Ich lese deine Notiz. Während der Hinweis vorschlägt, wie man eine Richtlinienanweisung nur mit der OAI UserID/S3CanonicalID schreibt, löst sie nicht das zentrale Problem, wie man (1) aws: Benutzer-ID von IAM-Rollen/Benutzern und (2) OAI-IDs in einem einzigen kombiniert Grundsatzerklärung. – ktrace

0

Es scheint wie ein bisschen ein weit hergeholt, aber der Ursprung -Zugriffsidentität der ID finden (nicht die kanonische Benutzer-ID ... finden die, die mit E beginnt und ungefähr 12 Zeichen lang), und fügen Sie die Politik wie folgt aus:

"StringNotLike": { 
    "aws:userId": [ 
     "MY_IAM_ROLE_USER_ID:*", 
     "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXEXAMPLEXX" 
    ] 
} 

Beachten Sie, dass die Worte „Cloudfront Herkunft -Zugriffsidentität“ einschließlich der Räume, Teil dieser Zeichenfolge in Anführungszeichen sind. Fügen Sie es genau wie gezeigt ein und ändern Sie nur die 12-stellige ID.

Das könnte verhindern, dass diese Richtlinie den Zugriff auf das OAI verweigert. Wenn es eine Möglichkeit gibt, den OAI-Benutzer in einen Bedingungsschlüssel aufzunehmen, scheint dies die einzige mögliche Lösung zu sein.

Unabhängig davon benötigen Sie eine zweite Richtlinienanweisung, die normale Anweisung, die den erforderlichen Zugriff auf das OAI gewährt.

+0

Danke für die klare Anleitung. Ich habe deinen Vorschlag ausprobiert, es funktioniert nicht. – ktrace

+0

Ich werde sehen, ob ich irgendwelche anderen Optionen finden kann. –

0

Meine ältere Antwort würde einige Leute unterstützen, aber möglicherweise nicht Ihre genau. Also, ich schreibe eine andere Antwort, die genau auf Ihre Bedürfnisse eingehen wird.Die folgende Rolle Politik wird der Zugang zu IAM Rolle und OAI ermöglichen und jeden sonst verweigern:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "1", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucketname/*" 
     }, 
     { 
      "Sid": "2", 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": [ 
        "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX", 
        "arn:aws:iam::AWS-account-ID:role/role-name" 
       ] 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::bucketname/*" 
     } 
    ] 
} 
Verwandte Themen