#php #laravel #amazon-web-services #amazon-s3
#php #laravel #amazon-web-сервисы #amazon-s3
Вопрос:
У меня есть частная корзина в S3. Я могу загружать файлы в S3, но когда я хочу просмотреть / загрузить файл, я получаю сообщение «Доступ запрещен».
Прямо сейчас у меня нет возможности использовать signedURL.
Я хотел бы разрешить загрузку моего файла на основе IP-адреса / домена моего сервера. Возможно ли управлять этим на уровне политики корзины? Все, что я нашел в Интернете, превратило мое ведро в общедоступное, чего я не хочу.
Комментарии:
1. Как обслуживаются файлы? Они обслуживаются непосредственно через браузер или вы загружаете их в частном порядке на сервер?
2. Я не уверен, я должен исследовать компонент, который я использую…
Ответ №1:
Возможно, вы могли бы использовать aws:Referer, как показано здесь:
{
"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":[
{
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":["s3:GetObject","s3:GetObjectVersion"],
"Resource":"arn:aws:s3:::awsexamplebucket1/*",
"Condition":{
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
}
}
]
}
Однако это довольно легко обойти защиту, и на нее не следует полагаться для абсолютной безопасности:
aws: referer не следует использовать для предотвращения неавторизованных сторон от прямых запросов AWS. Предлагается только для того, чтобы позволить клиентам защищать свой цифровой контент, такой как контент, хранящийся в Amazon S3, от ссылок на несанкционированные сторонние сайты.
Комментарии:
1. Я сделал это вчера, но обнаружил, что мое ведро было общедоступным после применения этой политики…
2. @Juliatzin Конечно, это общедоступно, только для данного реферера. Если вы не хотите использовать предварительно выделенный URL-адрес, единственным другим вариантом является сервер ваших файлов через CloudFront.
Ответ №2:
В зависимости от того, как вы хотите его использовать, вам доступны следующие опции.
Подписанные файлы cookie
Если вы пытаетесь ограничить доступ к ресурсам, если только кто-то не имеет публичного доступа к вашему веб-сайту, идеальным решением было бы добавить CloudFront перед вашей корзиной S3 (предпочтительно с использованием источника для S3 и другого для вашего приложения, но все в одном домене).
Как только вы перейдете к этому подходу, вы можете использовать подписанные файлы cookie, которые будут обеспечивать, как минимум, доступ к пользователю через безопасный подписчик. В отличие от подписанных URL-адресов, это делается один раз и не влияет на существующую кодовую базу (нет пользовательских URL-адресов для ресурсов).
Заголовок ссылки
Хотя это и не идеально, вы можете использовать заголовок refererer либо как условие политики корзины, либо как правило WAF при подключении к дистрибутиву CloudFront. Чтобы было ясно, это всего лишь заголовок, который может быть установлен кем угодно. Если какая-либо информация является конфиденциальной, не используйте эту опцию.
Более подробная информация об этой опции доступна в разделе Как предотвратить горячие ссылки с помощью AWS WAF, Amazon CloudFront и документации по проверке ссылок.
Конечная точка шлюза VPC
Предпочтительный способ сохранить вашу корзину S3 закрытой, если единственная связь с S3 осуществляется через экземпляр, подключающийся к API S3 (например, через SDK или CLI). Это не сработает, если вы предоставляете контент пользователю публично в браузере с S3.
Создав конечную точку шлюза для S3, вы можете создать условие в политике корзины S3, для aws:SourceVpce
которого вы сможете ограничить GetObject
действие только этим соединением.
IP-адрес
Так же, как вы можете внести в белый список по referer
заголовку, вы можете внести в белый список по исходному IP-адресу. Этот параметр подходит только в том случае, если источником доступа к объекту является фиксированный IP-адрес, примером является экземпляр EC2, подключающийся к исходящему через NAT. Если вы используете общедоступный веб-сайт и ресурс обслуживается в браузере, этот вариант нежизнеспособен, поскольку IP-адрес, который должен быть внесен в белый список, относится к клиентам, а не к серверам.
Это можно выполнить либо с помощью политики корзины, используя IpAddress
условие, либо путем присоединения IPSet к WAF, который подключен к CloudFront.
Краткие сведения
Все вышеперечисленные варианты доступны с некоторыми предпочтительными по сравнению с другими. Все будет зависеть от того, как вы используете S3, и возможно, что вы можете использовать несколько из них, чтобы заблокировать его дальше.
Ответ №3:
Не уверен, есть ли у нас все подробности, чтобы узнать, в чем заключаются ваши проблемы, например, Являетесь ли вы владельцем корзины и т. Д.
Учитывая, что вы спрашиваете о белом списке IP, вот руководство по этому поводу: https://www.cloudsavvyit.com/5761/how-to-whitelist-ip-addresses-to-access-an-aws-s3-bucket /
Так что да, все это должно быть возможно, если у вас есть необходимые права собственности на s3
Ответ №4:
Вы можете использовать условие NotIpAddress для ограничения определенных IP-адресов в корзине. Если вы все еще получаете отказ в доступе, проверьте, что содержимое файлов не шифруется с помощью ключа KMS, это остановит загрузку файлов пользователем через пользовательский интерфейс, если у вас нет разрешения на доступ к ключу KMS.
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::awsexamplebucket1",
"arn:aws:s3:::awsexamplebucket1/*"
],
"Condition": {
"NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"}
}
}
]
}
Комментарии:
1. NotIpAddress не означает, что это черный список?
2. Следующий пример запрещает любому пользователю выполнять какие-либо операции Amazon S3 с объектами в указанном сегменте S3, если запрос не исходит из диапазона IP-адресов, указанных в условии. docs.aws.amazon.com/AmazonS3/latest/dev /…
3. Это больше похоже на белый список, запрещающий все, но разрешающий этот IP
4. Эта политика будет запрещать даже аутентифицированный доступ, если он не исходит из этого диапазона IP. Цель состоит в том, чтобы разрешить неаутентифицированный доступ с определенного IP (т. Е. Разрешить
s3:GetObject
С определенного IP). Совсем другое.5. В его вопросе не говорится об аутентифицированном / неаутентифицированном доступе