Proteger mediante CloudFlare un sitio alojado en S3
Tags: aws, s3, security
Published: 2024-07-17 09:22:17

Cuando creamos un sitio web, como por ejemplo una landing page estática, y queremos alojarla en un sitio rápido y rentable sin servidor, podemos utilizar directamente un bucket de aws s3.

Esta funcionalidad es bien conocida, pero por si acaso te dejo la propia documentación de aws dónde explica cómo hacerlo: [aws hosting s3](https://docs.aws.amazon.com/es_es/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html)

En esa documentación se indica que directamente podremos hacer accesible el contenido del bucket de forma pública, adjuntando una politica tal que así:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpj8ag14hhao4wps3dy4.png)

## CDN y WAF de Cloudflare

Si queremos añadir capacidades de CDN y WAF podríamos utilizar el servicio de CloudFront de AWS, o alguna alternativa como puede ser [Cloudflare](https://www.cloudflare.com/es-es/) que nos permite también empezar con un nivel gratuito de protección para nuestro site, además de otras capacidades de protección en email y DNS.

El problema es que si alguien accede al bucket de s3 directamente, podrá acceder como un bypass sin la protección de Cloudflare. Es decir, en vez de acceder por el dominio protegido por Cloudflare www.example.com podría usar http://www.example.com.s3-website.eu-central-1.amazonaws.com que como tiene una politica de permitir todo es accesible igualmente.

### ¿Cómo podemos evitarlo?

Cloudflare publica una lista de Ips desde las que accede a los servicios:
[IP List Cloudflare](https://www.cloudflare.com/es-es/ips/)

Podemos crear una política que permita solo esas ip's para el acceso a S3 dando un 403 si no llamas desde cloudflare.

La política viene a sustituir a la anterior por defecto, y os dejo el código json para que podáis copiar y pegar:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFlareIP",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:getObject",
            "Resource": [
                "arn:aws:s3:::Bucket-Name",
                "arn:aws:s3:::Bucket-Name/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "2c0f:f248::/32",
                        "2a06:98c0::/29",
                        "2803:f800::/32",
                        "2606:4700::/32",
                        "2405:b500::/32",
                        "2405:8100::/32",
                        "2400:cb00::/32",
                        "198.41.128.0/17",
                        "197.234.240.0/22",
                        "190.93.240.0/20",
                        "188.114.96.0/20",
                        "173.245.48.0/20",
                        "172.64.0.0/13",
                        "162.158.0.0/15",
                        "141.101.64.0/18",
                        "131.0.72.0/22",
                        "108.162.192.0/18",
                        "104.16.0.0/12",
                        "103.31.4.0/22",
                        "103.22.200.0/22",
                        "103.21.244.0/22"
                    ]
                }
            }
        }
    ]
}
```

Sustituid _Bucket-Name_ por el nombre de vuestro bucket.

Esta es una forma sencilla de alojar y proteger un sitio estático ya de por sí tremendamente seguro y rápido. Añadiendo capacidad de CDN y WAF haremos que nuestro site literalmente vuele.

Espero que haya sido útil, y nos vemos en otros post.