Ограничение доступа к ведомости S3 для VPC

Я пытаюсь применить следующую политику, чтобы ограничить доступ my_bucket к определенному VPC.

  • Когда я пытаюсь применить это как политику ведра, я получаю Policy has an invalid condition key - ec2:Vpc. Как это исправить?

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

Ответ 1

Я просто получил это, чтобы работать. Я должен был сделать две вещи. 1) Создайте политику ведра в ведро S3, 2) создайте "конечную точку VPC"

Моя политика корзины S3 выглядит так (конечно, введите имя вашего ведра и идентификатор 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"
                }
            }
        }
    ]
}

В ведро S3 также есть некоторые разрешения за пределами политики ведра, чтобы разрешить доступ с консоли AWS. Выполнение вышеуказанного не давало доступа. Чтобы получить доступ, мне также пришлось перейти в AWS Console → VPC → Endpoints, а затем создать конечную точку. Я привязал вновь созданную конечную точку к единственной политике маршрутизации, которую имеет учетная запись на данный момент (к которой привязаны все подсетей), и я использовал политику по умолчанию

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

Как только я создал конечную точку, я смог прочитать из ведра S3 из любого экземпляра EC2 в своем VPC, просто используя wget с правильным URL. Я все еще могу получить доступ к ведру с консоли AWS. Но если я попытаюсь получить доступ к URL-адресу из-за пределов VPC, я получаю запрет 403. Таким образом, доступ к ведро S3 ограничен одним VPC, как и то, что вы ищете.

Это, по-видимому, новая функция. Для получения дополнительной информации см. Эту запись в блоге AWS.

Ответ 2

Две вещи, которые меня укусили, и которые могут быть полезны для добавления к Эдди приятного ответа:

Во-первых, вы не сможете просмотреть свой ковш (или даже изменить его политику после установки политики выше) в консоли S3 AWS, если вы также не предоставите разрешениям пользователей AWS управлять ведром. Чтобы сделать это, найдите свой номер учетной записи AWS (отображается в верхнем правом здесь) и добавьте это выражение в операторы политики bucket список:

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

Во-вторых, если у вас есть несколько VPC, скажите vpc-XXXXXX и vpc-YYYYYY, чтобы предоставить доступ, утверждение в ответе Эдди должно быть изменено на что-то вроде следующего (обратите внимание на "Разрешить" "StringEquals" и список значений sourceVpc:

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

Ответ 3

Нет, вы не можете этого сделать.

Здесь другой человек спрашивает то же самое: https://forums.aws.amazon.com/thread.jspa?threadID=102387

Некоторые из них стали чрезмерно творческими с проблемой, пытаясь решить ее с помощью сетей: https://pete.wtf/2012/05/01/how-to-setup-aws-s3-access-from-specific-ips/

Я предпочитаю более простой маршрут, S3 позволяет подписать URL-адреса для решения этой самой проблемы, но внутри вашего VPC вы, возможно, захотите не думать о подписании - или вы просто не могли подписываться, например, вы могли бы использовать wget и т.д. Поэтому я написал эту небольшую микросервис по этой причине: https://github.com/rmmeans/S3-Private-Downloader

Надеюсь, что это поможет!

ОБНОВЛЕНО:

AWS теперь имеет функцию для конечных точек VPC: https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/, вы должны использовать это, а не то, что я ранее предлагал.