Сайт S3 с ограниченным доступом к конечной точке VP C получает 403 изнутри VPC - PullRequest
2 голосов
/ 07 января 2020

Я хотел бы создать корзину S3, которая настроена для работы в качестве веб-сайта, и я бы хотел ограничить доступ к веб-сайту S3 запросами, приходящими только из определенного VP C.

Я использую Cloudformation для настройки корзины и политики корзины.

В контейнере CF включено WebsiteConfiguration и для AccessControl установлено значение PublicRead.

  ContentStorageBucket:
    Type: AWS::S3::Bucket
    Properties: 
      AccessControl: PublicRead
      BucketName: "bucket-name"
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html

Политика сегмента включает в себя два условия: одно условие предоставляет полный доступ к ведро, когда на офисном IP, и другое условие предоставляет доступ через конечную точку VP C. Код выглядит следующим образом:

  ContentStorageBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref ContentStorageBucket
      PolicyDocument:
        Id: BucketPolicy
        Version: '2012-10-17'
        Statement:
        - Sid: FullAccessFromParticularIP
          Action:
          - s3:*
          Effect: "Allow"
          Resource:
          - !GetAtt [ ContentStorageBucket, Arn ]
          - Fn::Join:
            - '/'
            - - !GetAtt [ ContentStorageBucket, Arn ]
              - '*'
          Principal: "*"
          Condition:
            IpAddress:
              aws:SourceIp: "x.x.x.x"
        - Sid: FullAccessFromInsideVpcEndpoint
          Action:
          - s3:*
          Effect: "Allow"
          Resource:
          - !GetAtt [ ContentStorageBucket, Arn ]
          - Fn::Join:
            - '/'
            - - !GetAtt [ ContentStorageBucket, Arn ]
              - '*'
          Principal: "*"
          Condition:
            StringEquals:
              aws:sourceVpce: "vpce-xxxx"

Чтобы проверить вышеуказанные условия политики, я сделал следующее:

  • Я добавил файл с именем json.json в S3 ведро;
  • Я создал экземпляр EC2 и поместил его в VP C, указанный в корзине.
  • Я сделал запрос скручивания к конечной точке файла http://bucket-name.s3-website-us-east-1.amazonaws.com/json.json изнутри занесенного в белый список IP-адреса, и запрос завершается ;
  • Я сделал запрос скручивания к конечной точке файла изнутри экземпляра EC2 (помещенного в VP C ), и запрос не выполняется с 403 Отказано в доступе

Примечания:

  • Я убедился, что экземпляр EC2 находится в правильном VP C .
  • aws:sourceVpce не использует значение идентификатора VP C, но использует значение идентификатора конечной точки соответствующего VP C.
  • У меня есть также использовал aws:sourceVpc с идентификатором VP C вместо использования aws:sourceVpce с идентификатором конечной точки, но это дало те же результаты, что и упомянутый выше.

Учитывая это, я в настоящее время не уверен, как продолжить дальнейшую отладку этого. Есть ли у вас какие-либо предложения о том, в чем может быть проблема? Пожалуйста, дайте мне знать, если вопрос не ясен или что-то требует уточнения. Спасибо за помощь!

1 Ответ

1 голос
/ 08 января 2020

Чтобы ресурсы могли использовать конечную точку VP C для S3, маршрутизатор VP C должен направить весь трафик c, предназначенный для S3, на конечную точку VP C. Вместо того, чтобы поддерживать список всех блоков CIDR, которые S3 задают самостоятельно c, AWS позволяет вам использовать списки префиксов BGP, которые являются первоклассным ресурсом в AWS.

Чтобы найти список префиксов для S3, выполните следующую команду (ваши выходные данные должны совпадать с моими, так как это должно быть в одном регионе для всех учетных записей, но лучше проверить). Используйте регион вашего VP C.

aws ec2 describe-prefix-lists --region us-east-1

Я получаю следующий вывод:

{
    "PrefixLists": [
        {
            "Cidrs": [
                "54.231.0.0/17",
                "52.216.0.0/15"
            ],
            "PrefixListId": "pl-63a5400a",
            "PrefixListName": "com.amazonaws.us-east-1.s3"
        },
        {
            "Cidrs": [
                "52.94.0.0/22",
                "52.119.224.0/20"
            ],
            "PrefixListId": "pl-02cd2c6b",
            "PrefixListName": "com.amazonaws.us-east-1.dynamodb"
        }
    ]
}

Для com.amazon aws .us-east-1.s3, идентификатор списка префиксов - pl-63a5400a,

, чтобы вы могли затем создать маршрут в любой таблице маршрутов, обслуживающей рассматриваемый су bnet. Пункт назначения должен быть списком префиксов (pl-63a5400a), а целью должен быть идентификатор конечной точки VP C (vpce-XXXXXXXX) (который можно найти с помощью aws ec2 describe-vpc-endpoints).

Это тривиально с консоли. Я не помню, как это сделать из командной строки, я думаю, что вы должны отправить cli-input- json с чем-то вроде ниже, но я не проверял. это оставлено в качестве упражнения для читателя.

{
  "DestinationPrefixListId": "pl-63a5400a",
  "GatewayId": "vpce-12345678",
  "RouteTableid": "rt-90123456"
}
...