Introducción
Una aplicación web debe bloquear una ruta de exportación interna y mantener disponible la comprobación de salud. Asociarás una regla de ruta, comprobarás si las solicitudes llegan al backend y actualizarás la regla antes de la limpieza.
Completa primero Comenzar con AWS en LabEx y Dar mínimo privilegio a un lector de informes. Esta nueva VM proporciona una aplicación y una etapa independiente de API REST; no necesitas recursos de API ni de red anteriores.
Relación con las certificaciones
Este laboratorio ofrece práctica para los siguientes temas de examen.
- Cloud Practitioner (CLF-C02) · Tarea 2.4: Asociación de ACL web WAF y reglas de filtrado de solicitudes.
- Solutions Architect – Associate (SAA-C03) · Tarea 1.2: Asociación de ACL web WAF y reglas de filtrado de solicitudes.
- Security – Specialty (SCS-C03) · Tarea 3.1: Práctica de fundamentos: Asociación de ACL web WAF y reglas de filtrado de solicitudes.
- Solutions Architect – Professional (SAP-C02) · Tarea 2.3: Práctica de fundamentos: Asociación de ACL web WAF y reglas de filtrado de solicitudes.
Crear una Web ACL regional
En este paso, definirás una regla de solicitudes de AWS WAF dentro de una lista de control de acceso web (Web ACL). WAF inspecciona las solicitudes antes de que lleguen a la aplicación. La API REST proporcionada tiene una etapa con nombre que puede asociarse a una Web ACL regional; este punto de entrada difiere de la API HTTP usada en el curso de API/Cognito.
Abre AWS View junto a Terminal para comparar las reglas, la asociación de la etapa y si cada solicitud llega al backend. Conserva la Web ACL y la etapa de referencia ajenas al trabajo.
Una regla combina una condición de coincidencia con una acción. Una acción predeterminada se aplica cuando ninguna regla coincide. Bloquearemos /internal/ y permitiremos las demás rutas.
Entra en el directorio del proyecto y confirma la identidad de operador preparada. El archivo stage-arn.txt proporcionado contiene el ARN de la etapa de la aplicación, no una credencial. La sustitución de comandos almacena ese valor para asociarlo después.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
STAGE_ARN=$(cat stage-arn.txt)
Espera labex-sec05-operator. Antes de asociar cualquier Web ACL, la exportación interna sintética llega al backend. curl hace una solicitud HTTP real; -sS elimina la salida de progreso y conserva los errores de conexión, y -w imprime el estado de la respuesta.
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/internal/export
Espera HTTP 200 y una respuesta sintética del backend. Escribe un archivo de regla con un documento de entrada entre comillas: las líneas entre <<'EOF' y EOF se convierten en el archivo JSON exactamente como están escritas. UriPath selecciona la ruta, STARTS_WITH coincide con el prefijo y NONE evita transformarlo. Las prioridades numéricas menores se ejecutan primero; esta ACL tiene una regla con prioridad cero. Los ajustes de visibilidad deshabilitan las muestras y métricas opcionales para este ejercicio específico. Guarda los mismos ajustes en visibility.json para la propia ACL y su actualización posterior.
cat > rules-internal.json <<'EOF'
[{
"Name": "block-private-export",
"Priority": 0,
"Action": {"Block": {}},
"Statement": {"ByteMatchStatement": {
"SearchString": "/internal/",
"FieldToMatch": {"UriPath": {}},
"PositionalConstraint": "STARTS_WITH",
"TextTransformations": [{"Priority": 0, "Type": "NONE"}]
}},
"VisibilityConfig": {"SampledRequestsEnabled": false, "CloudWatchMetricsEnabled": false, "MetricName": "labex-sec05-owned-export"}
}]
EOF
Crea la ACL regional con Allow como acción predeterminada. --cli-binary-format raw-in-base64-out indica a AWS CLI v2 que interprete SearchString como bytes de entrada literales, en lugar de esperar una cadena base64. file:// carga el documento de reglas; --query selecciona únicamente el ID de la ACL resultante.
cat > visibility.json <<'EOF'
{
"SampledRequestsEnabled": false,
"CloudWatchMetricsEnabled": false,
"MetricName": "labex-sec05-owned-export"
}
EOF
ACL_ID=$(aws wafv2 create-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--default-action Allow={} \
--visibility-config file://visibility.json \
--rules file://rules-internal.json \
--cli-binary-format raw-in-base64-out \
--query Summary.Id \
--output text)
ACL_ARN=$(aws wafv2 get-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--query WebACL.ARN \
--output text)
aws wafv2 get-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--query 'WebACL.{Name:Name,Default:DefaultAction,Rules:Rules[].Name}'
Espera la ACL propia, la acción predeterminada Allow y block-private-export. Crear una política no la asocia a un endpoint. AWS View todavía debe mostrar que no hay asociación con el destino.
Asociar la ACL y probar solicitudes reales
En este paso, conectarás tu política a la etapa de API REST proporcionada y compararás una solicitud pública con una solicitud de exportación que coincida con la regla. Una etapa, o stage, identifica un entorno desplegado de API; la asociación aplica la ACL a las solicitudes de esa etapa.

La Web ACL asociada rechaza la ruta interna antes de que llegue al backend.
Asocia únicamente tu ACL al ARN de destino proporcionado. La etapa de referencia ajena al trabajo ya tiene su propia ACL de referencia; no la sustituyas.
aws wafv2 associate-web-acl --web-acl-arn "$ACL_ARN" --resource-arn "$STAGE_ARN"
aws wafv2 get-web-acl-for-resource \
--resource-arn "$STAGE_ARN" \
--query WebACL.Name \
--output text
Espera labex-sec05-owned-export. Prueba la ruta pública de salud, que no coincide con /internal/, y después la ruta de exportación interna.
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/health
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/internal/export
Espera HTTP 200 para la salud y HTTP 403 con block-private-export para la exportación. Una decisión Block devuelve la respuesta antes de que se ejecute el backend. AWS View debe mostrar Executed para la solicitud de salud y Not reached para la solicitud bloqueada. La asociación nativa por sí sola es insuficiente; estos resultados HTTP reales demuestran que se aplica la regla.

Actualizar la regla y observar el comportamiento en vivo
En este paso, trasladarás la protección al prefijo de administración y mostrarás el cambio de comportamiento sin reiniciar la aplicación. Una actualización de Web ACL sustituye la lista de reglas. Su token de bloqueo evita sobrescribir un cambio simultáneo; obtenlo de la configuración nativa actual justo antes de actualizar y guárdalo en una variable.
Crea el nuevo documento de reglas sustituyendo el prefijo URI en el archivo anterior. sed transforma el texto y > escribe el nuevo archivo, conservando el documento de reglas original.
sed 's|/internal/|/admin/|' rules-internal.json > rules-admin.json
LOCK_TOKEN=$(aws wafv2 get-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--query LockToken \
--output text)
aws wafv2 update-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--lock-token "$LOCK_TOKEN" \
--default-action Allow={} \
--visibility-config file://visibility.json \
--rules file://rules-admin.json \
--cli-binary-format raw-in-base64-out \
--query NextLockToken \
--output text
El token de bloqueo devuelto identifica la nueva revisión de la ACL; no es una credencial de autenticación. Ahora el antiguo prefijo interno debe pasar por la acción predeterminada Allow, mientras se bloquea la exportación de administración.
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/internal/export
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/admin/export
Espera HTTP 200 seguido de HTTP 403. AWS View debe mostrar el nuevo prefijo /admin/, la solicitud interna bloqueada anterior y el par actual de solicitud interna permitida y solicitud de administración bloqueada. Las solicitudes usan la regla nativa actual; no es necesario reiniciar la VM ni la aplicación. Los tipos de política no admitidos deniegan el acceso en este entorno específico, por lo que debes usar únicamente la instrucción enseñada aquí.

Desasociar y eliminar únicamente la ACL propia
En este paso, eliminarás tu política y confirmarás que vuelve el enrutamiento ordinario de la aplicación. Completa primero las comprobaciones funcionales anteriores. La desasociación elimina la aplicación de la política en esta etapa; después, eliminar la ACL retira el recurso de política propio.
Desasocia tu Web ACL de la etapa de destino e inspecciona la asociación con una consulta nativa correcta. Espera una asociación vacía, sin tratar un error de autenticación como prueba de eliminación.
aws wafv2 disassociate-web-acl --resource-arn "$STAGE_ARN"
aws wafv2 get-web-acl-for-resource --resource-arn "$STAGE_ARN" --query WebACL
La exportación de administración bloqueada anteriormente debe volver a llegar al backend proporcionado.
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:8090/admin/export
Espera HTTP 200. Obtén un token de bloqueo actual, elimina únicamente la ACL propia y enumera correctamente las ACL restantes. El nombre propio debe estar ausente y labex-sec05-reference debe permanecer.
LOCK_TOKEN=$(aws wafv2 get-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--query LockToken \
--output text)
aws wafv2 delete-web-acl \
--name labex-sec05-owned-export \
--scope REGIONAL \
--id "$ACL_ID" \
--lock-token "$LOCK_TOKEN"
aws wafv2 list-web-acls --scope REGIONAL --query 'WebACLs[].Name'
Conserva intactas las dos etapas de API proporcionadas y la ACL de referencia. Elimina los documentos locales de reglas y visibilidad, y ejecuta la verificación de este paso antes de eliminar el perfil desechable de CLI.
rm -f rules-internal.json rules-admin.json visibility.json
rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset STAGE_ARN ACL_ID ACL_ARN LOCK_TOKEN
Resumen
Creaste una Web ACL regional, la asociaste a una etapa de API REST y probaste el comportamiento real de permitir y bloquear solicitudes HTTP. Una solicitud coincidente se detuvo antes del backend, mientras las solicitudes de salud continuaron. Actualizar el prefijo URI cambió el enrutamiento en vivo; la desasociación restableció el endpoint. Eliminaste únicamente la ACL propia y conservaste las etapas proporcionadas y la política de referencia.



