Skip to content

KB Flooris Hosting - Cloudflare CDN Proxy S3 private bucket

De Cloudflare CDN Proxy applicatie is een simpele Laravel waarmee het mogelijk is om assets te laten serveren door Cloudflare, zelfs al is de upstream server niet van ons.

Dit doet hij door de request door te geven aan een upstream server, en de response hiervan weer terug te geven aan Cloudflare. En omdat deze server wel in ons beheer is, kunnen we Cloudflare caching gebruiken om kosten te besparen.

Deze applicatie wordt al een tijdje gebruikt voor diverse applicaties, maar we merkte dat er nog steeds redelijk wat S3 transfer kosten waren. Onze conclusie was dat dit komt omdat iemand letterlijk de S3 URL gebruikt ergens anders, nog voordat we deze CDN hadden geintroduceert.

Om deze verzoeken te blokkeren, willen we de S3 bucket op private zetten en door middel van AWS SigV4 aantonen dat wij wel authorized zijn. Hierdoor kunnen we forceren dat gebruikers door onze CDN heen moeten, en hierdoor dus ook door Cloudflare caching, waardoor de kosten zouden verminderen.

In de Cloudflare CDN Proxy zijn diverse signature drivers beschikbaar, waaronder ook aws_sigv4 beschikbaar is. Hierdoor kunnen wij aan S3 aantonen dat wij het waren en hij alsnog het verzoek toe staat.

Setup

IAM policy aanmaken

Ga naar IAM → Policies → Create policy, schakel over naar JSON en plak het volgende:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::NAAM-VAN-JE-BUCKET/*"
        }
    ]
}

Geef de IAM policy een naam zoals cloudflare_cdn_proxy_<NAAM VAN PROJECT OF BUCKET>. Alleen s3:GetObject rechten zijn nodig, gezien de Cloudflare CDN Proxy alleen zal lezen.

Indien gewenst kan je hier ook nog verder specificeren waar deze IAM policy bij mag voor extra veiligheid. Maar dit is niet vereist, gezien de Cloudflare CDN Proxy zelf ook nog de allowed_path_rules optie heeft.

IAM gebruiker aanmaken

Ga naar IAM → Users → Create user.

Geef de gebruiker een naam zoals cloudflare_cdn_proxy_<NAAM VAN PROJECT OF BUCKET>. Kies bij de permissies voor Attach policies directly en koppel de zojuist aangemaakte policy.

Consoletoegang is niet nodig en is aanbevolen om deze uitgeschakeld te houden voor veiligheid.

API credentials aanmaken

Open de zojuist aangemaakte gebruiker → tabblad Security credentials → Access keys → Create access key.

Kies hier Application running outside AWS als gebruiksscenario.

Kopieer hier de Access key ID en de Secret access key.

Let op

De API credentials zijn maar 1 keer zichtbaar, sla ze op een veilige plek op zoals 1Password.

Proxy configuratie bijwerken

Nu we de API credentials hebben, kunnen we tegen de proxy zeggen dat hij de upstream requests moet voorzien van een signature.

Open de proxy_configuration.json en zoek naar het domein die je wil aanpassen.

Zet dan signature op aws_sigv4 en vul signature_options met de vereiste velden.

Configuratie voorbeeld

{
    "add_proxy_header": true,
    "domains": {
        "cdn-private.example.com": {
            "enabled": true,
            "upstream": "https://private-bucket.s3.eu-central-1.amazonaws.com{path}",
            "signature": "aws_sigv4",
            "signature_options": {
                "region": "eu-central-1",
                "service": "s3",
                "access_key": "AKIAIOSFODNN7EXAMPLE",
                "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
            },
            "allowed_path_rules": [
                "/^\\/product\\/(?:\\d+)\\/conversions\\/(?:[a-zA-Z0-9\\-\\_])+\\.(?:jpg|jpeg|png|webp|gif)$/"
            ]
        }
    }
}

Bucket op private zetten

En eindelijk staan we klaar om de bucket op private te zetten.

Ga in de S3-console naar je bucket → tabblad Permissions → Block public access → Edit → zet alle vier de checkboxes aan → Save.

Hiermee zorg je ervoor dat geen enkele publieke ACL of bucket policy objecten publiek leesbaar kan maken.

Gebruik je Statamic?

Als je Statamic gebruikt, kan deze mogelijk geen assets meer uploaden.

Dit kan gebeuren als de disk visibility op public staat, Statamic probeert dan de asset te uploaden als public, maar S3 weigerd dit verzoek dan uit veiligheid.

Om dit op te lossen, moet je dus de visibility op private zetten in config/filesystems.php. Zo lang de AWS_URL environment variable ingesteld staat naar de CDN server, zal de website er verder niks van moeten merken.