web-dev-qa-db-fra.com

Restreindre l'accès du compartiment S3 à un VPC

J'essaie d'appliquer la stratégie suivante afin de restreindre l'accès de my_bucket à un VPC particulier. 

  1. Lorsque j'essaie d'appliquer ceci en tant que stratégie de compartiment, j'obtiens un Policy has an invalid condition key - ec2:Vpc. Comment puis-je corriger cela?

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Deny",
         "Principal": {
            "AWS": "*"
         },
         "Action":"*",
         "Resource":"arn:aws:s3:::my_bucket/*",
         "Condition":{
            "StringNotEquals":{
               "ec2:Vpc":"arn:aws:ec2:region:account:vpc/vpc-ccccccc"
            }
         }
      }
   ]
}

16
Lelouch Lamperouge

Je viens de recevoir ça au travail. Je devais faire deux choses. 1) Créez la stratégie de compartiment sur le compartiment S3, 2) créez un "point de terminaison VPC"

Ma stratégie de compartiment S3 ressemble à ceci (bien sûr, mettez-la dans le nom de votre compartiment et l'identifiant VPC):

{
    "Version": "2012-10-17",
    "Id": "Policy1234567890123",
    "Statement": [
        {
            "Sid": "Stmt1234567890123",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-12345678"
                }
            }
        }
    ]
}

Le compartiment S3 dispose également d'autorisations en dehors de la stratégie de compartiment pour autoriser l'accès à partir de la console AWS. Faire ce qui précède n'a pas donné accès. Pour obtenir un accès, je devais également accéder à AWS Console -> VPC -> Endpoints, puis créer un endpoint. J'ai attaché le point de terminaison nouvellement créé à la seule politique de routage du compte (à laquelle tous les sous-réseaux sont associés) et j'ai utilisé la politique par défaut de

{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "*",
            "Principal": "*"
        }
    ]
}

Une fois que j'ai créé le point de terminaison, j'ai pu lire le compartiment S3 à partir de n'importe quelle instance EC2 de mon VPC en utilisant simplement wget avec la bonne URL. Je peux toujours accéder au compartiment à partir de la console AWS. Mais si j'essaie d'accéder à l'URL de l'extérieur du VPC, 403 est interdit. Ainsi, l'accès au compartiment S3 est limité à un seul VPC, exactement comme vous le souhaitez.

Ceci est apparemment une nouvelle fonctionnalité. Consultez cette entrée de blog AWS pour plus d'informations.

32
Eddie

Deux choses qui m'ont mordu et qui pourraient être utiles pour ajouter à la réponse d'Eddie sont:

Tout d'abord, vous ne pourrez pas afficher votre compartiment (ni même modifier sa stratégie une fois que vous avez défini la stratégie ci-dessus) dans la console AWS S3, à moins que vous n'accordiez également à vos utilisateurs AWS les autorisations de manipuler le compartiment. Pour ce faire, recherchez votre numéro de compte AWS (affiché en haut à droite ici ) et ajoutez cette instruction à la liste des instructions de stratégie de compartiment:

    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::YOUR_AWS_ACCOUNT_NUMBER:root"
        },
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::my_bucket",
            "arn:aws:s3:::my_bucket/*"
        ]
    },

Deuxièmement, si vous avez plus d'un VPC, dites à vpc-XXXXXX et à vpc-YYYYYY, la déclaration dans la réponse d'Eddie doit être modifiée pour ressembler à ce qui suit (notez le "Autoriser" "StringEquals" et la liste de sourceVPc valeurs:

... 
"Effect": "Allow",
...
"Condition": {
    "StringEquals": {
        "aws:sourceVpc": [
            "vpc-XXXXXXXX",
            "vpc-YYYYYYYY"
        ]
    }
2
JJC