Разрешения AWS S3: привязка представления к домену

Я пытаюсь заблокировать просмотр ресурсов S3 - на самом деле только изображений - в домене моего веб-приложения. Например, если кто-то заходит на мой сайт, скажем, example.com, и там есть ссылка src на изображение, я хочу, чтобы его можно было просмотреть. Но если кто-то щелкнет правой кнопкой мыши и откроет изображение прямо в новой вкладке, он не сможет этого сделать.

В сети есть тонны, но я просто не могу найти правильную комбинацию или разрешения. И в большинстве руководств обычно не говорится о настройках «Блокировать общий доступ», и я не уверен, как это подходит.

Вот политика, которую я пытаюсь:

      {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow get requests originating from example.com",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "https://www.example.com/*"
                    ]
                }
            }
        },
        {
            "Sid": "Do not allow requests from anywhere else.",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "https://www.example.com/*"
                    ]
                }
            }
        }
    ]
}

Это, кажется, ничего не делает. Если включена функция «блокировать общий доступ», блокируются оба. Если он выключен, отображаются оба. То есть, несмотря на то, что у меня есть явный список «Запретить» выше, переход прямо к изображению в этом сегменте в браузере работает нормально.

Я также могу редактировать CORS, но тогда я все равно задаюсь вопросом, почему список запрещенных здесь не позаботится об этом сам. Наконец, после реализации политики я сам теряю множество возможностей, таких как настройка CORS, даже при использовании учетной записи пользователя root. Я, вероятно, могу просто сделать что-то в другом порядке, чтобы это произошло, но я хотел бы по-прежнему иметь возможность управлять своими разрешениями после отправки политики.

Спасибо.

1 ответ

Шаг 1. Блокировка всего общего доступа должна быть отключена, чтобы применить параметры политики корзины. Вы можете заблокировать все общедоступные параметры, как показано на изображении выше.

Шаг 2: Организуйте все изображения вашего веб-сайта в одну папку, например «изображения».

Шаг 3: Настройте политику корзины, как показано ниже. В нем два утверждения. Заявление 1 запрещает доступ к папке с изображениями всем, кроме вашего домена. Утверждение 2 позволяет все. Поскольку запрещение перезаписей разрешено, оператор 1 имеет большую силу, чем оператор 2, поэтому он блокирует изображения, которые вызываются из-за пределов вашего домена.

      { 
"Version": "2012-10-17", 
"Id": "http referer policy example", 
"Statement": [ 
    { 
        "Sid": "Deny get requests not originating from www.example.com and example.com.", 
        "Effect": "Deny", 
        "Principal": "*", 
        "Action": "s3:Get*", 
        "Resource": "arn:aws:s3:::your-bucket/images/*", 
        "Condition": { 
            "StringNotLike": { 
                "aws:Referer": [ 
                    "http://www.example.com/*", 
                    "http://www.example.com/" 
                ] 
            } 
        } 
    }, 
    {
        "Sid": "Allow get requests", 
        "Effect": "Allow", 
        "Principal": "*", 
        "Action": "s3:Get*", 
        "Resource": "arn:aws:s3:::your-bucket/*" 
    } 
] }

Шаг 4: Вам нужно немного изменить код внешнего интерфейса, везде, где вы используете теги изображений, вам нужно добавить «referrerpolicy», установленный в «origin», если вы не установите это поле, заголовок реферера не будет перенаправлен. S3 и оценка правила не удались, и произойдет ошибка 403.

Пример: <img src="images/pic_trulli.jpg" alt="Trulli" width="500" height="333" referrerpolicy="origin">

Это решение проверено и работает. Если вам также нужен CORS, вы также можете включить CORS в корзине S3. Но эта политика достаточно хороша, чтобы справиться.

При вызове с доменом -->

При вызове с URL-адресом S3 -->

Если это решение поможет вам, отметьте его как ответ.

Другие вопросы по тегам