web-dev-qa-db-fra.com

Existe-t-il une stratégie S3 limitant l'accès pour ne voir/accéder qu'à un seul compartiment?

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.

98
Alex

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.

116
rogercampos

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.

25
Andreas Stankewitz

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

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/

13
BFar

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.

6
user6133521

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.

6
Donal Lafferty

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
5
joevartuli

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/

Organisation Sur la page de mon compte

3
Shaik Ismail

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

J'ai trouvé cette solution:
AWS FLOW:
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

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

P.S. soyez prudent avec la politique de compartiment, vous pouvez rester sans autorisations

2
Constantin Paigin

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.

2
codeplay

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

my-bucket-1 et my-bucket-2 sont vos compartiments pour donner les accès en lecture et en écriture.

En relation:

1
kenorb

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

1
Ishan Tomar

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

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.

0
foggy_glasses

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

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/*"
        ]
    }
  ]
}
0
Xavinsky

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

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

}
]
}      
0
s. tait

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