Цель:
Разрешить публичный доступ на чтение для всех объектов в S3 корзине только используя VPN подключение, для подключения с мира объекты должны быть не публичными. В качестве сервиса VPN используется OpenVPN, который может быть развернут где угодно, поэтому разрешающие правило будем строить на проверки IP адреса.
Для начала нужно узнать список сетей, которые относятся к эндпоинтам S3 сервиса в нужном нам регионе, чтобы не заворачивать весь траффик через VPN. Для это скачиваем актуальный список сетей и парсим его:
jq '.prefixes[] | select(.region=="eu-central-1") | select(.service=="S3") | .ip_prefix' < ip-ranges.json
Где, "eu-central-1" регион, в котором находится нужная S3 корзина.
Вы должны получить результат вида:
"52.219.170.0/23" "52.219.168.0/24" "3.5.136.0/22" "52.219.72.0/22" "52.219.44.0/22" "52.219.169.0/24" "52.219.140.0/24" "54.231.192.0/20" "3.5.134.0/23" "3.65.246.0/28" "3.65.246.16/28"
Теперь переводим маску подсети в 4-х байтный формат и добавляем в конфигурацию OpenVPN сервера, как "push" параметры:
push "route 52.219.170.0 255.255.254.0" push "route 52.219.168.0 255.255.255.0" push "route 3.5.136.0 255.255.252.0" push "route 52.219.72.0 255.255.252.0" push "route 52.219.44.0 255.255.252.0" push "route 52.219.169.0 255.255.255.0" push "route 52.219.140.0 255.255.255.0" push "route 54.231.192.0 255.255.240.0" push "route 3.5.134.0 255.255.254.0" push "route 3.65.246.0 255.255.255.240" push "route 3.65.246.16 255.255.255.240"
Перезапускаем сервис OpenVPN сервера и после переподключения мы должны получить список необходимых сетей и траффик будет идти через VPN подключение.
Теперь осталось добавить следующую политику к S3 корзине:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow only from VPN", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::artem-services", "arn:aws:s3:::artem-services/*" ], "Condition": { "IpAddress": { "aws:SourceIp": "1.2.3.4" } } } ] }
Где, "artem-services" — имя S3 корзины, а "1.2.3.4" — IP адрес OpenVPN сервера.