131 votes

Stratégie S3 limitant l'accès à un seul compartiment (liste incluse)

J'ai un seau simple qui ressemble à images.mysite.com sur mon S3 et d'autres seaux contenant des sauvegardes, etc. Je souhaite autoriser un utilisateur spécifique à pouvoir accéder au seau images.mysite.com pour télécharger des images. Cependant, je ne veux pas qu’il voie les autres seaux, pas même leur existence.

Je ne pouvais pas faire une politique qui fasse ça ... tout ce que j'essaye est restrictif et finit par bloquer l'inscription de tous les seaux ...

Des idées ?

Alex

120voto

rogercampos Points 653

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 (telle que DeleteObject) et en restreint d'autres (comme PutBucketAcl).

La stratégie IAM suivante fonctionne pour moi maintenant:

 {
  "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:PutObjectAclVersion"
      ],
      "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.

39voto

Notre cas d'utilisation: Fournir de l'espace de sauvegarde pour les clients de notre application en nuage peut être consulté par les clients directement à l'aide de communes S3 outils. Bien sûr, aucun client ne devrait voir ce que d'autres clients ont.

Comme cloudberryman expliqué, "Vous pouvez soit la liste de tous les compartiments ou" aucun".", nous avons donc à venir avec un travail autour de. Arrière-plan:

L'octroi de ListAllMyBuckets droits de l'utilisateur est nécessaire pour que les AWS S3 console ou S3Fox connecter sans un message d'erreur. Mais ListAllMyBuckets les listes de tous les compartiments, quel que soit les ressources affectées (en fait, seulement arn:...:::* travaux). C'est un grave bug, si vous me demandez. Btw. nier ListBucket pour tous les seaux ne les empêche pas de l'être, comme ListBucket accorde des droits à la liste le contenu du seau.

Il y a 3 possibilités-je considéré comme un travail autour de. J'ai choisi la dernière.

(1) l'utilisation cryptique seau noms, par exemple, Guid

Avantage: facile à mettre en place

Inconvénient: difficile à gérer, surtout pour le client. (imaginer de trouver un GUID parmi des milliers d'autres.) Montre également le nombre de seaux = nombre de clients utilisant le service de sauvegarde.

(2) l'utilisation d'un seau avec le client des dossiers spécifiques

C'est de cette façon Amazon suggère par leur S3/IAM exemples de prévoir de l'espace pour l'accès à certains utilisateurs ou groupes d'utilisateurs. Voir: AWS Exemple des Politiques IAM

Avantage: assez facile à mettre en place, va de pair avec AWS idées

Inconvénient: les forces pour faire de l'existence de tous les compartiments du public, de sorte que le client peut trouver leur "maison" seau. AWS comptabilité fournit des statistiques de seau d'utilisation, mais pas de dossier d'utilisation, ce qui rend difficile de calculer le coût par client.

(3) n'accordent pas de droit d'accès pour ListAllMyBuckets

Avantage: vous obtenez ce que vous voulez: les clients ne peuvent pas voir d'autres clients seaux

Inconvénient: le client ne peut pas voir son propre seau. S3Browser est livré avec un joli "ne peut pas faire" message et vous demande pour le seau nom à l'entrée. S3Fox jette un message d'erreur lors de la connexion à la racine, mais permet une navigation directe vers le client seau si le seau nom est connu. Amazon S3 console ne fonctionne pas du tout.

Espérons que cela a aidé à gérer S3 IAM que vous en avez besoin.

22voto

cloudberryman Points 1760

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": {}
}
]
}
 

7voto

joevartuli Points 51

Il est un excellent moyen pour permettre aux utilisateurs d'accéder à un compartiment spécifique, sans compromettre la connaissance des autres compartiments. Une stratégie de groupe qui est comme celui-ci permettra aux utilisateurs de ne voir que les "seau". Le seul hic, c'est que l'utilisateur ne jamais être en mesure d'accéder le seau si ils se connectent à le seau d'extrémité. Pour l'exemple ci-dessous qui serait bucket-a.s3.amazonaws.com. Le seau peut également avoir "Utilisateurs Authentifiés" permet ce à survenir.

{
    "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 la s3cmd paquet

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

5voto

Donal Lafferty Points 1390

Confus au sujet de pourquoi aucune réponse n'a été vérifié?

Nous allons casser vers le bas de chaque déclaration de politique générale de solutions ci-dessus:

Cette déclaration de politique de s'applique au contenu du seau, mais pas le mâle lui-même. Ce n'est probablement pas ce que la question posée, parce que vous ne pouvez pas voir ce qui est 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 double déclaration de politique dérivée de donne accéder en lecture seule à le seau à (arn:aws:s3:::your_bucket_here/) en lecture seule, mais permet toujours de CRUD ops sur le seau du contenu (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 politique inclut la déclaration ci-dessous, qui permet à un utilisateur de voir tous les seaux à l'extrémité. Ce n'est probablement pas ce que la question posée.

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

Cependant, le ci-dessus est très utile si vous utilisez un client navigateurs un S3 magasin. Si votre client accède au magasin et non sur le seau directement, de sorte que vous devez accéder à la liste des seaux à la racine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X