webentwicklung-frage-antwort-db.com.de

Gibt es eine S3-Richtlinie zur Einschränkung des Zugriffs, um nur einen Bucket anzuzeigen/darauf zuzugreifen?

Ich habe einen einfachen Bucket, der wie images.mysite.com auf meinem S3 und anderen Buckets aussieht, die Backups usw. enthalten.

Ich möchte, dass ein bestimmter Benutzer auf den Bucket images.mysite.com zugreifen kann, um Bilder hochzuladen. Ich möchte jedoch NICHT, dass er die anderen Eimer sieht. nicht einmal, dass sie existieren.

Ich könnte keine Politik machen, die dies tut. Jedes Mal, wenn ich etwas einschränkendes probiere, blockiert dies die Auflistung aller Buckets.

98
Alex

Ich habe das schon eine Weile ausprobiert und endlich eine funktionierende Lösung gefunden. Sie müssen je nach Art der von Ihnen ausgeführten Aktion unterschiedliche "Ressourcen" verwenden. Ich habe auch einige fehlende Aktionen in die vorige Antwort aufgenommen (wie DeleteObject) und weitere einschränken (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, die sich auf einen Bucket und die Objekte beziehen, müssen unterschiedliche Arten haben.

116
rogercampos

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

Wie Cloudberryman erklärte: "Sie können entweder alle Buckets oder keine auflisten." Wir müssen uns also um die Arbeit kümmern. Hintergrund:

Das Erteilen von ListAllMyBuckets-Rechten für den Benutzer ist erforderlich, damit die AWS S3-Konsole oder S3Fox eine Verbindung ohne Fehlermeldung herstellt. ListAllMyBuckets listet jedoch alle Buckets auf, abhängig von den zugewiesenen Ressourcen (eigentlich funktioniert nur arn: ... ::: *). Das ist ein schwerwiegender Fehler, wenn Sie mich fragen. Übrigens Wenn Sie ListBucket für alle Buckets ablehnen, wird dies nicht verhindert, da ListBucket die Rechte zum Auflisten des Inhalts des Buckets erteilt.

Es gibt 3 Möglichkeiten, die ich als Umgehung betrachte. Ich habe den letzten ausgewählt.

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

Vorteil: einfach einzurichten

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

(2) Verwenden Sie einen Bucket mit clientspezifischen Ordnern

So schlägt Amazon in ihren S3/IAM-Beispielen vor, nur bestimmten Benutzern oder Benutzergruppen Zugriff zu gewähren. Siehe: Beispiel IAM-Richtlinien für AWS

Vorteil: ziemlich einfach einzurichten, passt zu AWS-Ideen

Nachteil: Zwingt, alle Buckets öffentlich zu machen, damit der Client seinen "Home-Bucket" finden kann. Die AWS-Kontoführung bietet Statistiken zur Bucket-Nutzung, nicht jedoch zur Ordner-Nutzung. Dies macht es schwierig, die Kosten nach Client zu berechnen.

(3) Erteilen Sie kein Zugriffsrecht für ListAllMyBuckets

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

Nachteil: Der Kunde kann seinen eigenen Eimer nicht sehen. S3Browser wird mit der Nice-Meldung "Kann nicht" angezeigt und fordert Sie zur Eingabe des Bucket-Namens auf. S3Fox gibt beim Verbindungsaufbau 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 geholfen, S3 IAM so zu handhaben, wie Sie es brauchen.

25

Versuchen Sie es mit dieser Richtlinie. Berücksichtigen Sie auch, dass es keine Möglichkeit gibt, den Benutzer nur ausgewählten Bucket auflisten zu lassen. Sie können entweder alle Buckets oder keine 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": {}
        }
    ]
}
20
cloudberryman

Es ist nicht möglich, Zugriff auf die S3-Konsole bereitzustellen, ohne die Berechtigung ListAllMyBuckets zu erteilen.

In meinem Fall (und vielleicht auch Ihrem zukünftigen Leser) ist es eine akzeptable Alternative, Benutzer bei der Anmeldung direkt an den Bucket umzuleiten, den Sie sehen möchten.

Um dies zu erreichen, hängen Sie Folgendes an Ihr IAM-Zeichen in URL an: /s3/?bucket=bucket-name

Vollständige Anmelde-URL (ersetzen Sie Ihr-Alias ​​ und Bucket-Name):

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

IAM-Richtlinie (ersetzen Sie Bucket-Name):

{
    "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 -ich bin/

13
BFar

Ich interpretiere diese Frage als: "Kann ich den Zugriff auf einen Bucket erlauben, in dem andere Buckets nicht zugänglich und somit nicht sichtbar sind." Das Anzeigen des Namens des Bereichs, für den kein Zugriff gewährt wurde, entspricht immer noch einem Informationsverlust.

Und die richtige Antwort ist nein. Die erforderliche Berechtigung ist ListAllMyBuckets, wodurch der Benutzer ALLE Buckets sehen kann. Das Auslassen dieser Berechtigung macht die Konsole unbrauchbar.

6
user6133521

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

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

Diese Richtlinienerklärung from gilt für den Inhalt des Buckets, nicht jedoch für den Dollar selbst. Dies ist wahrscheinlich nicht nach der Frage, 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 Richtlinie mit zwei Anweisungen abgeleitet von gewährt Readonly-Zugriff auf den Bucket unter (arn:aws:s3:::your_bucket_here/) readonly, erlaubt 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 sehen kann. Dies ist wahrscheinlich nicht, um was die Frage gestellt wurde.

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

Das oben genannte ist jedoch sehr nützlich, wenn Sie einen Client verwenden, der einen S3-Store durchsucht. Wenn Ihr Client auf den Store und nicht direkt auf den Bucket zugreift, benötigen Sie also Zugriff auf die Liste der Buckets im Stammverzeichnis.

6
Donal Lafferty

Es gibt eine großartige Möglichkeit, Benutzern den Zugriff auf einen bestimmten Bucket zu ermöglichen, ohne das Wissen über andere Buckets zu berücksichtigen. Eine Gruppenrichtlinie, die der folgenden ähnelt, ermöglicht Benutzern, nur "Bucket a" anzuzeigen. Der einzige Haken ist, dass der Benutzer nur dann auf den Bucket zugreifen kann, wenn er sich mit dem angegebenen Bucket-Endpunkt verbindet. Für das Beispiel unten wäre das bucket-a.s3.amazonaws.com. Der Bucket muss möglicherweise auch über die Berechtigung "Authentifizierte Benutzer" verfügen. 

{
    "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 mit dem Paket s3cmd getestet

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
5
joevartuli

Es gibt einen einfachen Weg oder eine Problemumgehung, um dies mit AWS Organizations durchzuführen. Die AWS-Organisation ermöglicht Ihnen mehrere Benutzerkonten. Ihr Hauptkonto kann über mehrere AWS-Konten verfügen (Sub), und welche Dienste (s3/EC2/*) zu welchen AWS-Konten hinzugefügt werden, nur die Ressourcen werden angezeigt. 

Bitte beziehen Sie sich auf https://aws.Amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/https: //aws.Amazon .com/organisationen/

Organisation auf meiner Kontoseite

3
Shaik Ismail

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/*"]
    }
  ]
}
3
jjanczyszyn

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

Bucket-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
            "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 - Rollenname ROLE-NAME --profile = ExampleProfile

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

P.S. Seien Sie vorsichtig mit den Bucket-Richtlinien. Sie können ohne Erlaubnis draußen bleiben

2

Ich habe es geschafft, die folgenden Arbeiten zu bekommen. Bedeutet, dass die Auflistung der anderen Buckets die Meldung "Zugriff verweigert" erhalten hat. War aber immer noch in der Lage, den Bucket zu sehen, den ich wollte, wenn ich mich mit dem als Pfad festgelegten Bucketnamen 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 benutzt, um diese Verbindung zu testen.

2
codeplay

Es ist zwar nicht möglich, die Aktion s3:ListAllMyBuckets auf bestimmte Buckets zu beschränken. Als Problemumgehung können Sie ihnen die Konsolen-URL für bestimmte Buckets senden, z.

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

Quelle: Einschränken der Liste der S3-Buckets von der S3-Konsole aus

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-1 und my-bucket-2 sind Ihre Buckets für den Lese- und Schreibzugriff.

Verbunden:

1
kenorb

Wie oben gut diskutiert, ist es nicht möglich, nur einen Bucket auf der Konsole aufzulisten. Wenn der Zugriff von S3-Bucket jedoch mit einem IAM verbunden ist, kann IAM direkt auf den Bucket zugreifen, wenn eine URL für den Bucket verfügbar ist.

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

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

1
Ishan Tomar

Ich verwende das folgende Zeug, um den Inhalt von Bucket vor anderen Benutzern zu verbergen. Dies hilft nicht nur beim Ausblenden anderer Buckets (verwenden Sie nicht ListAllMyBuckets), sondern auch bei Ordnern im selben Bucket, wenn Sie einen Bucket erstellen, aber es soll Unterordner enthalten, die dem IAM-Benutzer/Unterordner die richtigen Berechtigungen zuweisen. 

Die folgende Richtlinie wird auf die IAM-Gruppe angewendet, und alle Benutzer gehören zu dieser Gruppe. Sie müssen aws:userid nehmen und im Bucket einen Unterordner mit demselben Namen erstellen. 

UserID 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"
            ]
        }
    ]
}
0
Andrii Starikov

Nein, es ist derzeit nicht möglich, Benutzer einzuschränken, selektive Buckets unter root oder anderswo anzuzeigen. Sie haben momentan nur diese 3 Optionen.

Ich entschied mich dafür, den Client zu bitten, den Bucket-Namen explizit zu verwenden.

0
foggy_glasses

Die Lösung unten arbeitete für mich. Ich wollte eine Richtlinie, die einem bestimmten Benutzer my_iam_user auf einen bestimmten Bucket my-s3-bucket Zugriff gewährt.

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

{
    "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/*"
        }
    ]
}
0
Carlos Coelho
0

Ich füge nur ein ähnliches Bedürfnis hinzu, das hier 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/*"
        ]
    }
  ]
}
0
Xavinsky

Eine nette einfache Lösung, die wir entwickelt haben, besteht darin, den Benutzer zu blockieren, um sich im Stammverzeichnis anzumelden. Sie müssen sich also mit dem Remote-Pfad im gewünschten Ordner anmelden. 

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

Das hat perfekt für mich funktioniert. Der Benutzer kann Dateien hochladen, herunterladen und abrufen, jedoch keine Dateien aus 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": {}    

}
]
}      
0
s. tait

Versuchen Sie es mit dieser Richtlinie. Der Benutzer kann keinen Bucket auflisten, er muss eine direkte Verbindung zum zulässigen Bucket verwenden.

Beispielsweise: 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"
}
0
Lam