J'ai un simple compartiment qui ressemble à images.mysite.com
sur mon S3 et d'autres compartiments contenant des sauvegardes, etc.
Je souhaite autoriser un utilisateur spécifique à accéder au compartiment images.mysite.com
afin de télécharger des images. Cependant, je ne veux pas qu’il voie les autres seaux; pas même qu'ils existent.
Je ne pouvais pas faire une politique qui fait cela; chaque fois que j'essaie quelque chose de restrictif, cela bloque la liste des compartiments.
Cela fait un moment que j'essaie de le faire et j'ai finalement trouvé une solution efficace. Vous devez utiliser différentes "ressources" en fonction du type d'action que vous effectuez. J'ai également inclus certaines actions manquantes dans la réponse précédente (comme DeleteObject
) et en restreindre d'autres (comme PutBucketAcl
).
La stratégie IAM suivante fonctionne pour moi maintenant:
{
"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": {}
}
]
}
Les actions concernant un seau et celles concernant des objets doivent avoir une arn différente.
Notre cas d'utilisation: fournir aux clients de notre application de cloud un espace de sauvegarde auquel les clients peuvent accéder directement à l'aide des outils S3 courants. Bien sûr, aucun client ne devrait voir ce que les autres clients ont.
Comme l'explique cloudberryman, "Vous pouvez lister tous les seaux ou aucun.", Nous devons donc trouver un moyen de contourner le problème. Contexte:
L'octroi de droits ListAllMyBuckets à l'utilisateur est nécessaire pour que la console AWS S3 ou S3Fox se connecte sans message d'erreur. Mais ListAllMyBuckets liste tous les compartiments, quels que soient les ressources affectées (en réalité, seul arn: ... ::: * fonctionne). C'est un problème sérieux, si vous me le demandez. Btw. le fait de refuser ListBucket pour tous les compartiments n'empêche pas leur listage, car ListBucket accorde des droits pour répertorier le contenu du compartiment.
Il y a 3 possibilités que j'ai considérées comme un travail autour. J'ai choisi le dernier.
(1) utilisez des noms de compartiment cryptiques, par exemple: GUID
Avantage: facile à mettre en place
Inconvénient: difficile à gérer, surtout pour le client. (Imaginez que vous trouviez un GUID spécifique parmi des milliers d'autres.) Indique également le nombre de compartiments = le nombre de clients utilisant le service de sauvegarde.
(2) utiliser un compartiment avec des dossiers spécifiques au client
C’est ainsi que Amazon suggère, par ses exemples S3/IAM, de fournir un espace d’accès réservé à certains utilisateurs ou groupes d’utilisateurs. Voir: Exemples de stratégies IAM AWS
Avantage: assez facile à configurer, va avec les idées AWS
Inconvénient: oblige à rendre publique l'existence de tous les seaux, afin que le client puisse trouver son seau "à la maison". La comptabilité AWS fournit des statistiques sur l'utilisation du compartiment, mais pas sur l'utilisation du dossier, ce qui rend difficile le calcul du coût par client.
(3) ne pas accorder le droit d'accès à ListAllMyBuckets
Avantage: vous obtenez ce que vous voulez: les clients ne peuvent pas voir les compartiments des autres clients
Inconvénient: le client ne peut pas voir son propre seau. S3Browser est livré avec un message Nice "ne peut pas faire" et demande le nom du compartiment à entrer. S3Fox envoie un message d'erreur lors de la connexion à la racine, mais permet une navigation directe vers le compartiment du client si le nom du compartiment est connu. La console Amazon S3 ne fonctionne pas du tout.
J'espère que cela vous a aidé à gérer S3 IAM lorsque vous en avez besoin.
Essayez cette politique. Tenez également compte du fait qu’il n’ya aucun moyen de laisser l’utilisateur lister uniquement le compartiment sélectionné. Vous pouvez lister tous les seaux ou aucun.
{
"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": {}
}
]
}
Il n'est pas possible de fournir un accès à la console S3 sans accorder l'autorisation ListAllMyBuckets
.
Dans mon cas (et peut-être aussi le vôtre, futur lecteur), une alternative acceptable consiste à rediriger les utilisateurs directement connectés vers le compartiment que vous souhaitez qu'ils voient.
Pour ce faire, ajoutez ce qui suit à votre URL de connexion IAM: /s3/?bucket=bucket-name
URL de connexion complète (remplacez votre-alias et nom-de-compartiment):
https://your-alias.signin.aws.Amazon.com/console/s3/?bucket=bucket-name
Stratégie IAM (remplacez nom de compartiment):
{
"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/*"
]
}
]
}
Pour plus d'informations sur la création d'autorisations spécifiques à un compartiment pour les utilisateurs, consultez le blog suivant: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-Amazon -je suis/
J'interprète cette question comme suit: "Puis-je autoriser l'accès à un compartiment où aucun autre compartiment ne sera accessible et donc invisible." En effet, l'affichage du nom du compartiment auquel aucun accès n'a été accordé équivaut toujours à une fuite d'informations.
Et la bonne réponse est non. L'autorisation requise est ListAllMyBuckets, qui permettra à l'utilisateur de voir TOUS les compartiments. Si vous laissez cette permission, la console deviendra inutilisable.
Vous ne savez pas pourquoi aucune réponse n'a été cochée?
Décomposons chaque déclaration de politique à partir des solutions ci-dessus:
Cette déclaration de stratégie de s'applique au contenu du compartiment, mais pas au buck lui-même. C'est probablement pas ce que la question vous a demandé, car vous ne pouvez pas voir ce qu'il y a dans le seau.
{
"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": {}
}
Cette politique de deux instructions dérivée de donne accès en lecture seule au compartiment à (arn:aws:s3:::your_bucket_here/
) en lecture seule, mais autorise toujours les opérations CRUD sur le contenu du compartiment (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": {}
}
Cependant, la stratégie inclut l'instruction ci-dessous, qui permet à l'utilisateur de voir tous les compartiments du système d'extrémité. Ceci est probablement pas ce que la question demandait.
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
Cependant, ce qui précède est très utile si vous utilisez un client qui navigue dans un magasin S3. Si votre client accède au magasin et non au compartiment directement, vous devez donc accéder à la liste des compartiments situés à la racine.
Il existe un excellent moyen de permettre aux utilisateurs d'accéder à un compartiment spécifique sans connaître les autres compartiments. Une stratégie de groupe semblable à celle ci-dessous permettra aux utilisateurs de ne voir que "compartiment". Le seul problème est que l'utilisateur ne pourra jamais accéder au compartiment que s'il se connecte au point de terminaison du compartiment donné. Pour l'exemple ci-dessous, ce serait bucket-a.s3.amazonaws.com. Pour que cela se produise, il peut également être nécessaire que le compartiment dispose de «utilisateurs authentifiés».
{
"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/*"
]
}
]
}
Cette méthode a été testée avec Cyberduck sur Mac OS/X et en utilisant le package s3cmd.
./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
Il existe un moyen simple ou une solution de contournement de le faire avec AWS Organizations. L'organisation AWS vous permet d'avoir plusieurs comptes d'utilisateur. Votre compte principal peut avoir plusieurs comptes AWS (Sub) et quels que soient les services (s3/EC2/*) ajoutés dans les comptes AWS, seules ces ressources seront visibles.
Veuillez consulter https://aws.Amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/https: //aws.Amazon .com/organisations/
Probablement le cas d'utilisation le plus simple:
{
"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/*"]
}
]
}
J'ai trouvé cette solution:
AWS FLOW:
Politique de seau:
{
"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
]
}
}
}
]
}
Politique IAM:
{
"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 NOM-UTILISATEUR --profile = ExampleProfile
aws iam get-role - nom de rôle ROLE-NAME --profile = ExampleProfile
P.S. soyez prudent avec la politique de compartiment, vous pouvez rester sans autorisations
J'ai réussi à obtenir le travail suivant. Cela signifie que la liste des autres compartiments recevait le message Accès refusé. Mais j'étais toujours capable de voir le seau que je voulais si je me connectais avec le nom du seau défini comme chemin.
{
"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/*"]
}
]
}
J'utilisais Cyberduck pour tester cette connexion.
Bien qu'il ne soit pas possible de restreindre s3:ListAllMyBuckets
action à des compartiments spécifiques, vous pouvez également leur envoyer l'URL de la console pour un compartiment spécifique, par exemple.
https://s3.console.aws.Amazon.com/s3/buckets/BUCKET_NAME/
Source: Liste de restriction des compartiments S3 à partir de la console S3
Pour ce faire, vous devez spécifier le document de stratégie suivant pour un utilisateur ou un groupe donné:
{
"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:::*"
}
]
}
Où my-bucket-1
et my-bucket-2
sont vos compartiments pour donner les accès en lecture et en écriture.
En relation:
Comme il en a été discuté plus haut, il est impossible de répertorier un seul compartiment sur la console. Toutefois, si l'accès au compartiment S3 est associé à un IAM, IAM peut accéder directement au compartiment si l'URL au compartiment est disponible.
https://s3.console.aws.Amazon.com/s3/buckets/BucketName
Où BucketName est le nom du compartiment auquel IAM a accès
J'utilise les éléments suivants pour masquer le contenu du seau aux autres utilisateurs. Cela permet non seulement de masquer d'autres compartiments (n'utilisez pas ListAllMyBuckets), mais également des dossiers du même compartiment lorsque vous créez un compartiment, mais que vous souhaitez que des sous-dossiers lui attribuent les autorisations appropriées à l'utilisateur/sous-dossier IAM.
La stratégie suivante est appliquée au groupe IAM et tous les utilisateurs sont dans ce groupe. Vous devez prendre aws:userid
et créer un sous-dossier du même nom dans le compartiment.
L'ID utilisateur peut être pris: 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"
]
}
]
}
Non, il n'est actuellement pas possible de limiter les utilisateurs à afficher des compartiments sélectifs sous root ou ailleurs. Vous n'avez que ces 3 options pour le moment.
J'ai choisi de demander au client d'utiliser le nom du compartiment de manière explicite.
La solution ci-dessous a fonctionné pour moi. Je souhaitais qu'une stratégie accorde l'accès à un utilisateur spécifique my_iam_user sur un compartiment spécifique my-s3-bucket .
Cette stratégie permet à mon utilisateur de répertorier, supprimer, récupérer et placer des fichiers dans un compartiment s3 spécifique.
{
"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/*"
}
]
}
Ceci est détaillé par Amazon sur http://blogs.aws.Amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-Comment
Je viens d'ajouter un besoin similaire, résolu par ceci:
{
"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/*"
]
}
]
}
Une solution simple et agréable que nous avons proposée consiste à empêcher l’utilisateur de se connecter au répertoire racine. Ils doivent donc se connecter avec le chemin distant défini sur le dossier souhaité.
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::folder-name*",
"Condition": {}
}
]
}
Cela a fonctionné parfaitement pour moi. L'utilisateur peut télécharger, télécharger et obtenir la liste des fichiers mais ne pourra pas voir les fichiers d'un autre compartiment.
{
"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": {}
}
]
}
Essayez cette politique. L'utilisateur ne peut répertorier aucun compartiment, il doit utiliser un lien direct vers le compartiment autorisé.
Par exemple: 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"
}