Gibt es eine S3-Richtlinie zum Beschränken des Zugriffs auf nur einen Bucket?

123

Ich habe einen einfachen Bucket, der images.mysite.comauf meinem S3 und anderen Buckets mit Backups usw. aussieht .

Ich möchte einem bestimmten Benutzer ermöglichen, auf den images.mysite.comBucket zuzugreifen , um Bilder hochzuladen. Ich möchte jedoch nicht, dass er einen der anderen Eimer sieht. nicht einmal, dass sie existieren.

Ich konnte keine Politik machen, die dies tut; Jedes Mal, wenn ich etwas Restriktives versuche, blockiert es die Auflistung von Eimern.

Alex
quelle
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da sie bei Superusers
Tonny Madsen
Eine Richtlinie könnte hier unter awspolicygen.s3.amazonaws.com/policygen.html
Suhail Gupta
1
Warum nicht einfach die URL des Buckets teilen - https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/. Auf diese Weise verhindern Sie, dass sie die gesamte Liste sehen, und ändern nichts an Ihrer aktuellen Richtlinie.
Baumcoder

Antworten:

119

Ich habe es eine Weile versucht und schließlich eine funktionierende Lösung gefunden. Sie müssen je nach Art der ausgeführten Aktion unterschiedliche "Ressourcen" verwenden. Außerdem habe ich einige fehlende Aktionen in die vorherige Antwort aufgenommen (wie DeleteObject) und einige weitere eingeschränkt (wie PutBucketAcl).

Die folgende IAM-Richtlinie funktioniert jetzt für mich:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::itnighq",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::itnighq/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

Die Aktionen in Bezug auf einen Bucket und die in Bezug auf Objekte müssen unterschiedliche Arn haben.

Rogercampos
quelle
9
Dies ist eine großartige Antwort, danke. Es kann erwähnenswert sein, dass die Berechtigung s3: ListAllMyBuckets impliziert, dass der Empfänger dieser Richtlinie alle Ihre (Root-) Buckets sehen kann. Es erfolgt keine direkte Offenlegung von Daten, es kann jedoch zu Sensibilität / Verwirrung bei Bucket-Namen kommen. Es ist möglich, diese spezielle Berechtigung zu entfernen, und die Dinge sollten weiterhin funktionieren (obwohl "s3cmd ls" usw. den Ziel-Bucket nicht zurückgeben).
Mike Repass
91
Dies hindert den Benutzer nicht daran, andere Bucket-Namen zu sehen!
Metdos
2
@metdos Sie können verhindern, dass Benutzer andere Bucket-Namen sehen, indem Sie die letzte Richtlinie entfernen.
Hendra Uzia
20
Um die Liste der Buckets in der Konsole anzuzeigen (und daher die Konsole für den Bucket-Zugriff zu verwenden), müssen Sie ListAllMyBucketsund GetBucketLocationfür alle S3-Buckets ( "arn:aws:s3:::*"funktioniert nicht "*"für die Ressource) gewähren . In diesem AWS-Blogbeitrag heißt es: "Abgesehen davon können Sie bestimmte Buckets derzeit nicht selektiv herausfiltern. Daher müssen Benutzer die Berechtigung haben, alle Buckets für den Konsolenzugriff aufzulisten."
Jwadsack
10
Das ist ein schrecklicher Rat. Es ist gefährlich und genau das, was das OP nicht wollte. In den Antworten von Andreas Stankewitz und BFar finden Sie mögliche Problemumgehungen .
AndreKR
37

Unser Anwendungsfall: Stellen Sie Backup-Speicherplatz für Clients unserer Cloud-Anwendung bereit, auf den die Clients direkt mit gängigen S3-Tools zugreifen können. Natürlich sollte kein Kunde sehen, was andere Kunden haben.

Wie Cloudberryman erklärte: "Sie können entweder alle oder keine Eimer auflisten.", Also müssen wir eine Lösung finden. Hintergrund:

Das Gewähren von ListAllMyBuckets-Rechten für den Benutzer ist erforderlich, damit die AWS S3-Konsole oder S3Fox ohne Fehlermeldung eine Verbindung herstellen können. ListAllMyBuckets listet jedoch alle Buckets auf, unabhängig von den zugewiesenen Ressourcen (tatsächlich funktioniert nur arn: ... ::: *). Das ist ein schwerwiegender Fehler, wenn Sie mich fragen. Übrigens. Das Verweigern von ListBucket für alle Buckets verhindert nicht, dass sie aufgelistet werden, da ListBucket Rechte zum Auflisten des Bucket-Inhalts gewährt.

Es gibt 3 Möglichkeiten, die ich als Workaround angesehen habe. Ich habe den letzten gewählt.

(1) Verwenden Sie kryptische Bucket-Namen, z. B. GUIDs

Vorteil: einfach einzurichten

Nachteil: schwer zu verwalten, insbesondere für den Kunden. (Stellen Sie sich vor, Sie finden eine bestimmte GUID unter Tausenden von anderen.) Zeigt auch die Anzahl der Buckets = Anzahl der Clients an, die den Sicherungsdienst verwenden.

(2) Verwenden Sie einen Bucket mit clientspezifischen Ordnern

Auf diese Weise schlägt Amazon anhand seiner S3 / IAM-Beispiele vor, nur bestimmten Benutzern oder Benutzergruppen Speicherplatz für den Zugriff bereitzustellen. Siehe: AWS-Beispiel-IAM-Richtlinien

Vorteil: ziemlich einfach einzurichten, passt zu AWS-Ideen

Nachteil: Erzwingt die Veröffentlichung aller Eimer, damit der Kunde seinen "Heimat" -Eimer finden kann. Die AWS-Buchhaltung bietet Statistiken zur Bucket-Nutzung, jedoch nicht zur Ordner-Nutzung, was es schwierig macht, die Kosten nach Client zu berechnen.

(3) Gewähren Sie kein Zugriffsrecht für ListAllMyBuckets

Vorteil: Sie bekommen, was Sie wollen: Kunden können die Eimer anderer Kunden nicht sehen

Nachteil: Der Kunde kann seinen eigenen Eimer nicht sehen. S3Browser wird mit einer netten Meldung "Kann nicht" geliefert und fragt nach der Eingabe des Bucket-Namens. S3Fox gibt beim Herstellen einer Verbindung zum Root eine Fehlermeldung aus, ermöglicht jedoch die direkte Navigation zum Bucket des Clients, wenn der Bucket-Name bekannt ist. Die Amazon S3-Konsole funktioniert überhaupt nicht.

Ich hoffe, dies hat dazu beigetragen, S3 IAM so zu handhaben, wie Sie es brauchen.

Andreas Stankewitz
quelle
1
Wenn Sie für Lösung (1) Webhosting mit einem Bucket verwenden möchten, muss der Bucket-Name mit dem Domain-Namen übereinstimmen.
Andy Fusniak
31

Es ist nicht möglich, ohne Erteilung der ListAllMyBucketsBerechtigung Zugriff auf die S3-Konsole zu gewähren .

In meinem Fall (und vielleicht auch bei Ihrem zukünftigen Leser) besteht eine akzeptable Alternative darin, Benutzer bei der Anmeldung direkt in den Eimer umzuleiten, den sie sehen sollen.

Fügen Sie dazu Folgendes an Ihre IAM-Anmelde-URL an: /s3/?bucket=bucket-name

Vollständige Anmelde-URL (ersetzen Sie Ihren Alias und den Bucket-Namen ):

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

IAM-Richtlinie ( Bucket-Name ersetzen ):

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

Weitere Informationen zum Erstellen von Bucket-spezifischen Berechtigungen für Benutzer finden Sie in diesem Blog: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam /.

BFar
quelle
1
Das funktioniert gut. Wäre optimal, wenn Benutzer nicht außerhalb der Bucket-Ansicht erkunden könnten ... Aber ich werde es nehmen. Danke @BFar.
Jamie Popkin
Dies ist die EINE RICHTIGE Antwort. Alle anderen listen jeden Bucket auf - der sollte gemäß der ursprünglichen Anfrage ausgeblendet werden.
Steve Horvath
Genau das, was ich brauche. Vielen Dank.
Di Zhang
20

Versuchen Sie diese Richtlinie. Berücksichtigen Sie auch, dass es nicht möglich ist, dass der Benutzer nur den ausgewählten Bucket auflistet. Sie können entweder alle oder keine Eimer auflisten.

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:PutBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your_bucket_here/*",
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {}
        }
    ]
}
Cloudberryman
quelle
2
Es funktioniert super! Ich musste Änderungen vornehmen s3:*, um es für mich zum Laufen zu bringen. Ich hatte es auch "Resource": ["arn:aws:s3:::your_bucket_here", "arn:aws:s3:::your_bucket_here/*"], aber das könnte nicht nötig sein.
Michael Yagudaev
3
s3: * gewährt Zugriff auf alles, einschließlich Löschen eines Buckets. Sicher willst du das?
Dave Gregory
10

Ich interpretiere diese Frage wie folgt: "Kann ich den Zugriff auf einen Eimer zulassen, in dem andere Eimer nicht zugänglich und somit unsichtbar sind?" Denn das Anzeigen des Namens des Buckets, auf den kein Zugriff gewährt wurde, entspricht immer noch einem Informationsverlust.

Und die richtige Antwort ist nein. Die erforderliche Berechtigung ist ListAllMyBuckets, mit der der Benutzer ALLE Buckets anzeigen kann. Wenn Sie diese Berechtigung weglassen, wird die Konsole unbrauchbar.


quelle
6

Es gibt eine großartige Möglichkeit, Benutzern den Zugriff auf einen bestimmten Bucket zu ermöglichen, ohne Kenntnisse über andere Buckets zu haben. Mit einer Gruppenrichtlinie wie der folgenden können Benutzer nur "Bucket a" sehen. Der einzige Haken ist, dass der Benutzer nur dann auf den Bucket zugreifen kann, wenn er eine Verbindung zum angegebenen Bucket-Endpunkt herstellt. Für das folgende Beispiel wäre das Bucket-a.s3.amazonaws.com. Für den Bucket müssen möglicherweise auch "Authentifizierte Benutzer" zugelassen sein, damit dies geschieht.

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_SID>",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucket-a/*"
      ]
     }
   ]
}

Diese Methode wurde mit Cyberduck unter Mac OS / X und unter Verwendung des s3cmd-Pakets getestet

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
Joevartuli
quelle
Ich kann immer noch die Liste aller Eimer sehen. Funktioniert nicht :(
Rishikesh Chandra
5

Verwirrt darüber, warum keine Antwort überprüft wurde?

Lassen Sie uns jede Richtlinienerklärung aus den oben genannten Lösungen aufschlüsseln:

Diese Richtlinienerklärung von gilt für den Inhalt des Buckets, nicht jedoch für den Buck selbst. Dies ist wahrscheinlich nicht das, wonach die Frage gestellt wurde, da Sie nicht sehen können, was sich im Eimer befindet.

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

Diese von abgeleitete Richtlinie mit zwei Anweisungen ermöglicht schreibgeschützten Zugriff auf den Bucket bei ( arn:aws:s3:::your_bucket_here/) schreibgeschützt , ermöglicht jedoch weiterhin CRUD-Operationen für den Inhalt des Buckets ( arn:aws:s3:::your_bucket_here/*).

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:ListBucketMultipartUploads"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here",
  "Condition": {}
},
{
  "Effect": "Allow",
  "Action": [
    "s3:AbortMultipartUpload",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:GetObject",
    "s3:GetObjectAcl",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionAcl",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectAclVersion"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here/*",
  "Condition": {}
}

Die Richtlinie enthält jedoch die folgende Anweisung, mit der ein Benutzer alle Buckets am Endpunkt anzeigen kann. Dies ist wahrscheinlich nicht das, wonach die Frage gestellt wurde.

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

Dies ist jedoch sehr nützlich, wenn Sie einen Client verwenden, der einen S3-Speicher durchsucht. Wenn Ihr Client direkt auf das Geschäft und nicht auf den Bucket zugreift, benötigen Sie Zugriff auf die Liste der Buckets im Stammverzeichnis.

Donal Lafferty
quelle
3

Wahrscheinlich der einfachste Anwendungsfall:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::bucket-name"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::bucket-name/*"]
    }
  ]
}
jjanczyszyn
quelle
1
AWS antwortet:This policy contains the following error: The policy must contain a valid version string
MaximeBernard
das ist richtig - ich habe meine Antwort korrigiert -> <br/> hier gibt es nur zwei mögliche Werte: <br/> * 2012-10-17 * und 2008-10-17 . <br/> Weitere Informationen finden Sie hier: <br/> docs.aws.amazon.com/IAM/latest/UserGuide/…
jjanczyszyn
Haben Sie eine Idee, (listing included)wie man nur den Bucket auflistet, in den der Benutzer gelangen darf? Bisher (und nach allen anderen Antworten) scheint es, als würde AWS Sie das nicht zulassen.
MaximeBernard
3

Es gibt eine einfache Möglichkeit oder Problemumgehung, dies mithilfe von AWS-Organisationen zu tun. In der AWS-Organisation können Sie mehrere Benutzerkonten haben. Ihr Hauptkonto kann mehrere AWS-Konten (Sub) haben, und welche Dienste (s3 / EC2 / *) auch immer in den AWS-Konten hinzugefügt werden, nur diese Ressourcen sind sichtbar.

Weitere Informationen finden Sie unter https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/

Organisation Auf meiner Kontoseite

Shaik Ismail
quelle
3

Ich habe diese Lösung gefunden:
AWS FLOW:
AWS FLOW

Bucket Policy:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

IAM-Richtlinie:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",  #Role ID
            "AIDAEXAMPLEID",  #UserID
            "111111111111"  #AccountID
          ]
        }
      }
    }
  ]
}

aws iam get-user -–user-name USER-NAME --profile = ExampleProfile

aws iam get-role --role-name ROLE-NAME --profile = ExampleProfile

Quelle: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

PS Seien Sie vorsichtig mit Bucket-Richtlinien, Sie können ohne Berechtigungen draußen bleiben

Constantin Paigin
quelle
2

Wie oben ausführlich erläutert, ist es nicht möglich, nur einen Bucket auf der Konsole aufzulisten. Wenn der Zugriff des S3-Buckets jedoch an einen IAM angehängt ist, kann der IAM direkt auf den Bucket zugreifen, wenn die URL zum Bucket verfügbar ist. Die S3-Bucket-URL lautet wie folgt:

https://s3.console.aws.amazon.com/s3/buckets/BucketName

Wobei BucketName der Name des Buckets ist, auf den IAM Zugriff hat

Ishan Tomar
quelle
1
Ich denke, dies ist auch 2018 die einzig mögliche Lösung.
Saurabh
1

Ich habe es geschafft, Folgendes zum Laufen zu bringen. Bedeutete, dass das Auflisten anderer Buckets die Nachricht "Zugriff verweigert" erhielt. Konnte aber immer noch den gewünschten Bucket sehen, wenn ich mich mit dem als Pfad festgelegten Bucket-Namen verband.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::test"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test/*"]
    }
  ]
}

Ich habe Cyberduck verwendet, um diese Verbindung zu testen.

Codeplay
quelle
1

Während es nicht möglich ist, s3:ListAllMyBucketsAktionen auf bestimmte Buckets zu beschränken , können Sie ihnen zur Problemumgehung eine Konsolen-URL für einen bestimmten Bucket senden, z

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

Quelle: Einschränken der Liste der S3-Buckets in der S3-Konsole

Dazu müssen Sie das folgende Richtliniendokument für einen bestimmten Benutzer oder eine bestimmte Gruppe angeben:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1",
                "arn:aws:s3:::my-bucket-2"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1/*",
                "arn:aws:s3:::my-bucket-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

Wo my-bucket-1und my-bucket-2sind Ihre Eimer, um den Lese- und Schreibzugriff zu ermöglichen.

Verbunden:

Kenorb
quelle
1

Versuchen Sie diese Richtlinie. Der Benutzer kann keinen Bucket auflisten, sondern muss einen direkten Link zum zulässigen Bucket verwenden.

Zum Beispiel: s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}
Lam
quelle
1

Ähnlich wie bei anderen oben beschriebenen:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket"
         ],
         "Resource":"arn:aws:s3:::awsexamplebucket"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject"
         ],
         "Resource":"arn:aws:s3:::awsexamplebucket/*"
      }
   ]
}

Hier ist jedoch das fehlende Stück. Während es nicht möglich ist, über S3-> Home auf den Bucket zuzugreifen, ist es möglich, über eine direkte Verbindung nur auf den gewünschten Bucket zuzugreifen.

https://s3.console.aws.amazon.com/s3/buckets/yourawsbucket/

Weitere Informationen finden Sie im folgenden Beitrag:

https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/

crandorf80s
quelle
0

Die unten stehende Lösung hat bei mir funktioniert. Ich wollte eine Richtlinie, die einem bestimmten Benutzer my_iam_user Zugriff auf einen bestimmten Bucket my-s3-Bucket gewährt .

Diese Richtlinie ermöglicht es meinem Benutzer, Dateien in einem bestimmten s3-Bucket aufzulisten, zu löschen und abzulegen.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket"
        },
        {
            "Sid": "AddDeleteFiles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*"
        }
    ]
}
Carlos Coelho
quelle
0

Ich füge nur ein ähnliches Bedürfnis hinzu, das dadurch gelöst wird:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:Put*",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }
  ]
}
Xavinsky
quelle
0

Ich benutze die folgenden Dinge, um den Inhalt des Buckets vor anderen Benutzern zu verbergen. Dies hilft nicht nur, andere Buckets auszublenden (verwenden Sie ListAllMyBuckets nicht), sondern auch Ordner im selben Bucket, wenn Sie einen Bucket erstellen, sondern möchte Unterordner darin haben, die dem IAM-Benutzer / Unterordner die richtigen Berechtigungen zuweisen.

Die folgende Richtlinie wird auf die IAM-Gruppe angewendet und alle Benutzer befinden sich in dieser Gruppe. Sie müssen aws:userideinen gleichnamigen Unterordner in den Bucket aufnehmen und erstellen.

Benutzer-ID kann genommen werden: aws iam get-user --user-name "user_name_for_folder_access":

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name/${aws:userid}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name"
            ]
        }
    ]
}
Andrii Starikov
quelle
0

Eine nette einfache Lösung, die wir uns ausgedacht haben, besteht darin, den Benutzer für die Anmeldung im Stammverzeichnis zu blockieren. Sie müssen sich also mit dem Remote-Pfad anmelden, der auf den gewünschten Ordner eingestellt ist.

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}
GEDEIHEN
quelle
0

Nein, es ist derzeit nicht möglich, Benutzer darauf zu beschränken, ausgewählte Buckets unter root oder anderswo anzuzeigen. Sie haben momentan nur diese 3 Optionen.

Ich habe den Client gebeten, den Bucket-Namen explizit zu verwenden.

foggy_glasses
quelle
-1

Das hat perfekt für mich funktioniert. Der Benutzer kann Dateien hochladen, herunterladen und abrufen, kann jedoch keine Dateien aus einem anderen Bucket sehen.

 {    

"Statement": [    

{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:PutBucketAcl",
        "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",
    "Condition": {}
},
{
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*",
    "Condition": {}
},
{
    "Effect": "Deny",
    "Action": [
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",    

    "Condition": {}    

}
]
}      
s. tait
quelle
-2

Füge hinzu ein Deny Klausel für die Buckets hinzu, auf die Sie nicht zugreifen möchten. Denken Sie daran, dass sie möglicherweise noch aufgelistet sind, Sie jedoch nicht auf die darin enthaltenen Inhalte zugreifen können.

{
    "Version": "2012-10-17",
    "Aussage": [
        {
            "Effekt": "Zulassen",
            "Aktion": "s3: *",
            "Ressource": "*"
        },
        {
            "Effekt": "Verweigern",
            "Aktion": "s3: *",
            "Ressource": [
                "arn: aws: s3 ::: Bucket-Name",
                "arn: aws: s3 ::: Bucket-Name / *"
            ]]
        }}
    ]]
}}
Baumkodierer
quelle
1
Sie sollten explizit Zugriff auf Ressourcen gewähren. Wenn Sie standardmäßig Zugriff auf alle Ressourcen gewähren, können Sie versehentlich Ressourcen weglassen, die Sie privat halten möchten. Durch die Gewährung des Zugriffs auf alle S3-Aktionen kann der Benutzer Ressourcen öffentlich machen oder statisches Hosting einrichten oder andere schädliche Dinge tun.
Ondrej Galbavý