Доступ к S3‑бакету через интернет с помощью белого списка IP

Быстрые ссылки
- Доступ к S3‑бакету через интернет
Задача и когда это подходит
Если нужно дать серверам в вашей сети возможность скачивать файлы из S3, но нельзя делать объекты публичными, то белый список IP в политике бакета — простое и прозрачное решение. Оно полезно, когда:
- Серверы имеют фиксированные или предсказуемые исходящие IP (например, NAT‑шлюз, статический адрес провайдера).
- Вы хотите минимально управлять ключами доступа и ограничить доступ по месту запроса.
Кратко о терминах: S3 bucket — контейнер для объектов (файлов) в AWS S3. Политика бакета (Bucket Policy) — JSON‑правило, которое контролирует доступ к бакету.
Как это работает — обзор
- По умолчанию прямой запрос к публичному URL формата
https://s3.amazonaws.com/bucketname/object.zipбез соответствующей политики вернёт 403, если объект приватный.
- Вставив в политику бакета условие IpAddress для aws:SourceIp, вы разрешаете s3:GetObject только запросам, пришедшим с указанных IP. Это похоже на «приватную подсеть» по отношению к S3, но трафик всё ещё идёт через интернет.
Пошаговая инструкция
- Откройте AWS Console → S3 → выберите бакет.
- Перейдите в вкладку Permissions → Bucket Policy.
- Вставьте политику (ниже) и замените bucketname и IP‑адреса на ваши.

Пример политики, разрешающей только скачивание объектов (GetObject) с указанных IPv4‑адресов:
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::bucketname/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.168.1.1",
"192.168.1.2",
"192.168.1.3"
]
}
}
}
]
}Пояснения к ключевым полям:
- Resource: указывает все объекты в бакете (bucketname/*). Можно сужать до префиксов.
- Action: s3:GetObject — разрешает только скачивание объекта.
- Principal: “*” — политика применяется ко всем, но дальше фильтруется по условию IP.
- Condition.IpAddress.aws:SourceIp — проверка источника запроса.
Если вам нужно разрешать больше действий, можно указать явно нужные API‑операции или (не рекомендуется) s3:* для всех действий.
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketname/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.168.1.1",
"192.168.1.2",
"192.168.1.3"
]
}
}
}
]
}Важно: использование s3:* увеличивает привилегии и обычно не рекомендуется.
Проверка и отладка
- Используйте curl или AWS CLI с сервера, чей IP в белом списке, чтобы убедиться в доступе:
curl -I https://s3.amazonaws.com/bucketname/object.zip- Из машины не из белого списка вы должны получать 403.
- Включите серверный лог S3 (Server Access Logging) или CloudTrail для аудита вызовов и отладки.
Ограничения и когда это не сработает (контрпримеры)
- Динамические исходящие IP: если ваши сервера получают динамические адреса (например, домашние подключения или мобильные устройства), белый список станет неудобным.
- NAT/прокси: если трафик идёт через общий NAT‑шлюз, учитывайте его внешний IP, а не локальные адреса.
- IPv6: условие IpAddress поддерживает IPv6, но укажите корректные адреса/CIDR.
- Клиенты за сторонними прокси или CDN: реальный aws:SourceIp — это адрес ближайшего прокси, а не исходный клиент.
Альтернативы и когда их выбрать
- IAM‑роль для EC2 (рекомендуется для инстансов AWS): нет ключей, проще и безопаснее.
- VPC Gateway Endpoint для S3: трафик остаётся внутри сети AWS и не идёт в интернет — лучший вариант для приватных сетей в AWS.
- Presigned URLs: временные ссылки, подходящие для раздачи отдельного файла пользователям или внешним сервисам.
- CloudFront с подписанными URL или гео/ACL: добавляет кэширование и гибкую авторизацию.
Выбор: если все клиенты в вашей сети находятся за предсказуемыми исходящими IP — используйте политику с IpAddress. Если у вас инфраструктура в AWS — лучше VPC Endpoint или роль.
Безопасность и hardening
- Применяйте принцип наименьших привилегий: давайте только s3:GetObject и ограничьте Resource до префикса, если возможно.
- Включите S3 Block Public Access, чтобы случайно не сделать бакет публичным.
- Используйте HTTPS для всех запросов.
- Ведите аудит через CloudTrail и Server Access Logging.
- Регулярно пересматривайте список IP и автоматически обновляйте его через инфраструктурный код (IaC), если IP меняются.
Роли и чек‑листы
Для администратора:
- Подготовить список исходящих IP (NAT/провайдер).
- Создать резервную копию текущей политики.
- Вставить и сохранить новую политику бакета.
- Проверить доступ с внутри сети и снаружи.
- Включить логирование и мониторинг.
Для разработчика/оператора:
- Тестировать скачивание через CLI/HTTP.
- Автоматизировать обновление IP (если надо).
- Обрабатывать ошибки 403 на клиенте с понятными логами.
Мини‑методология внедрения
- Сформируйте список конечных IP/CIDR и оцените стабильность адресов.
- Создайте политику в редакторе бакета, сначала в тестовом бакете.
- Протестируйте доступ локально и из недоверенной сети.
- Внедрите в продакшн и включите мониторинг.
- Составьте процесс обновления белого списка (кто и как добавляет адреса).
Модель принятия решения (упрощённо)
- Все ресурсы в AWS и нужны приватные запросы → используйте VPC Endpoint или IAM‑роль.
- Клиенты вне AWS, но с фиксированными IP → используйте bucket policy с IpAddress.
- Нужны временные ссылки → presigned URLs.
Риск‑матрица (кратко)
- Утечка доступа при ошибке в политике: высокий — смягчение: ревью, блокировка публичного доступа.
- Недоступность для легитимных клиентов при смене IP: средний — смягчение: мониторинг, уведомления, автоматизация обновлений IP.
- Журналирование/аудит отсутствует: средний — смягчение: включить CloudTrail и S3 Access Logs.
Краткий глоссарий (1‑строчные определения)
- S3: объектное хранилище AWS.
- Bucket Policy: JSON‑правило, управляющее доступом к бакету.
- aws:SourceIp: ключ условия, указывающий IP источника запроса.
- Presigned URL: временная подписанная ссылка на объект S3.
- VPC Endpoint: приватный канал между вашей VPC и сервисом AWS.
Частые вопросы
Работает ли это с IPv6?
Да, поддерживается — указывайте IPv6 адреса или CIDR в aws:SourceIp.
Что, если у меня NAT‑шлюз — какие IP указывать?
Указывайте внешний (публичный) IP NAT‑шлюза, через который уходит трафик.
Как быстро применяется новая политика?
Обычно политика вступает в силу почти мгновенно, но кеширование на клиенте или CDN может задерживать поведение.
Итог
Политика S3 с условием IpAddress — простой и действенный способ разрешить скачивание объектов только с доверенных IP. Она полезна для серверов со стабильными исходящими адресами и минимизирует необходимость управления ключами доступа. Для ресурсов внутри AWS или для большей безопасности рассмотрите VPC Endpoint или IAM‑роли.
Важно: всегда следуйте принципу наименьших привилегий, ведите аудит и планируйте процесс обновления белого списка.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone