Jak umożliwić dostęp do zasobów w S3 tylko z określonej witryny?

W wiaderkach S3 często znajdują się publicznie dostępne, statyczne zasoby udostępniane na stronach internetowych – zdjęcia, pliki dźwiękowe albo video. Przeglądający witrynę ma dostęp do nich zarówno przez stronę internetową, jak i bezpośrednio – przez adres URL danego obiektu.

Co zrobić, by umożliwić dostęp do zdjęć lub filmów tylko z witryny, a nie bezpośrednio przez adres URL obiektu w S3?

Rozwiązaniem jest przypisanie odpowiedniej polityki do wiaderka S3. W konsoli znajdziesz tę opcję po wybraniu danego wiaderka, w zakładce Permissions => Bucket Policy:

{
    "Version": "2012-10-17",
    "Id": "http referer policy example",
    "Statement": [
        {
            "Sid": "Allow get requests referred by www.swiatchmury.pl and swiatchmury.pl.",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::swiatchmury-examples/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "https://www.swiatchmury.pl/*",
                        "https://swiatchmury.pl/*"
                    ]
                }
            }
        },
        {
            "Sid": "Allow get requests referred by www.swiatchmury.pl and swiatchmury.pl.",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::swiatchmury-examples/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "https://www.swiatchmury.pl/*",
                        "https://swiatchmury.pl/*"
                    ]
                }
            }
        }
    ]
}

Pierwsza część polityki zezwala na zapytania GET z określonymi wartościami nagłówka referer. Druga część wprost zabrania pobierania obiektów za pomocą zapytań GET bez określonej w polityce wartości tego nagłówka.

Aby przypisać do wiaderka jakąkolwiek politykę zezwalającą na publiczny dostęp, wyłącz blokowanie ustanawiania „publicznych” polityk:

W przeciwnym razie dodanie takiej polityki nie będzie możliwe.

Przykład

Pod adresem https://swiatchmury.pl/chmury/ znajduje się krótki film video. Jeśli w przeglądarce włączysz podgląd źródła strony i odnajdziesz odpowiedni fragment, zobaczysz, że adres URL obiektu w S3 to

https://swiatchmury-examples.s3-eu-west-1.amazonaws.com/video/clouds.mp4

Bez ustawionej polityki dostępu film byłby dostępny bezpośrednio również pod tym adresem. Teraz – gdy użyjesz adresu URL obiektu w zapytaniu, otrzymasz komunikat AccessDenied:

Więcej przykładów polityk dostępu do wiaderek S3 znajdziesz w dokumentacji.