Pruebo mi sitio web usando https://observatory.mozilla.org/analyze y obtuve una calificación F.
Las razones son:
Content Security Policy (CSP) header not implemented X-XSS-Protection header not implemented X-Frame-Options (XFO) header not implemented ...Sirvo mi sitio web usando CloudFront.
¿Dónde pongo esos encabezados que faltan en CloudFront?
Actualización 23 junio 2021
Acabo de descubrir que si bien la solución a continuación parece excelente, puede que no sea lo suficientemente buena, especialmente para agregar encabezados de seguridad porque si Cloudfront recibe un error desde el origen, la función no se invocará.
Códigos de estado HTTP CloudFront no invoca funciones perimetrales para eventos de respuesta del espectador cuando el origen devuelve el código de estado HTTP 400 o superior.
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html
A partir de mayo de 2021, parece que la mejor opción serían las funciones de Cloudfront recientemente introducidas, que tienen un precio de 1/6 del precio de Lambda@Edge según esta entrada de blog https://aws.amazon.com/blogs/aws/introducing -cloudfront-functions-ejecuta-tu-código-en-el-borde-con-baja-latencia-a-cualquier-escala/
Un ejemplo de la documentación en https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/example-function-add-security-headers.html
function handler(event) { var response = event.response; var headers = response.headers; // Set HTTP security headers // Since JavaScript doesn't allow for hyphens in variable names, we use the dict["key"] notation headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; // Return the response to viewers return response; }Si está implementando esto ahora, entonces está de suerte. Es mucho más simple a partir de noviembre de 2021. Amazon ha agregado un encabezado de seguridad de forma nativa a través de políticas de encabezado de respuesta, es decir, no tenemos que crear un lambda solo para agregar encabezados de respuesta a la aplicación. Detalles https://aws.amazon.com/blogs/networking-and-content-delivery/amazon-cloudfront-introduces-response-headers-policies/ .
El proveedor de Terraform AWS comenzó a admitir aws_cloudfront_response_headers_policy desde 3.64.0 https://github.com/hashicorp/terraform-provider-aws/blob/main/CHANGELOG.md#3640-november-04-2021 .
Este es un ejemplo para agregar encabezados de seguridad a la respuesta de aws cloudfront a través del proveedor terraform aws.
resource "aws_cloudfront_response_headers_policy" "security_headers_policy" { name = "my-security-headers-policy" security_headers_config { content_type_options { override = true } frame_options { frame_option = "DENY" override = true } referrer_policy { referrer_policy = "same-origin" override = true } xss_protection { mode_block = true protection = true override = true } strict_transport_security { access_control_max_age_sec = "31536000" include_subdomains = true preload = true override = true } content_security_policy { content_security_policy = "frame-ancestors 'none'; default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'" override = true } } }Recomendaría usar Lambda@Edge para agregar cualquier encabezado que esté buscando a su respuesta de origen antes de que se devuelva al espectador.
Se puede hacer de manera tan simple como el siguiente ejemplo cuando se agrega como un evento de respuesta de origen.
import json def lambda_handler(event, context): response = event["Records"][0]["cf"]["response"] headers = response["headers"] headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; response['headers'] = headers return responsePara obtener más información, consulte la publicación de blog Adición de encabezados de seguridad HTTP mediante Lambda@Edge y Amazon CloudFront .