Ejercicio: Restricción del acceso al entorno de Azure Container Apps
En esta unidad, asegúrese de que solo la aplicación Quarkus puede acceder a la base de datos PostgreSQL y no a otros clientes externos. Actualmente puede acceder a la base de datos desde cualquier cliente mediante la CLI de Azure y ejecutar Quarkus localmente. Esta configuración no es segura. Debe agregar una regla de firewall para permitir que solo las direcciones IP del entorno de Azure Container Apps accedan al servidor de bases de datos.
Acceso al servidor PostgreSQL mediante la CLI
En primer lugar, asegúrese de que puede acceder al servidor PostgreSQL mediante la CLI de Azure. Para ello, ejecute este comando:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
Debería poder ver el contenido de la base de datos. Si es posible, se puede acceder a la base de datos fuera del entorno.
Eliminación de la regla de firewall permisiva
Azure Database for PostgreSQL proporciona seguridad de forma predeterminada. Normalmente, su firewall no permite conexiones entrantes. Sin embargo, al crear el servidor PostgreSQL, especificó el parámetro --public-access "All"
para permitir el acceso externo, que configuró el firewall para que esté abierto al público.
Para enumerar las reglas de firewall existentes, ejecute este comando:
az postgres flexible-server firewall-rule list \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
Debería ver la siguiente salida:
EndIpAddress Name ResourceGroup StartIpAddress
--------------- ------------------------- ----------------------- ----------------
255.255.255.255 AllowAll_2023-1-3_10-20-4 rgazure-deploy-quarkus 0.0.0.0
Observe que el intervalo de direcciones IP permitidas es de 0.0.0.0
a 255.255.255.255
. Una regla de firewall como esta permite que cualquier cliente acceda a la base de datos. Para asegurarse de que solo la aplicación Quarkus pueda acceder a la base de datos, debe actualizar las reglas de firewall del servidor PostgreSQL.
En este caso, solo es cuestión de quitar la regla pública. Para quitarla, ejecute el siguiente comando:
az postgres flexible-server firewall-rule delete \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name <name of the AllowAll firewall rule> \
--yes
Ahora, intente consultar la base de datos ejecutando una instrucción SQL desde la CLI:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
La llamada finalmente agota el tiempo de espera. Debería ver este mensaje:
Unable to connect to flexible server: connection to server failed: Operation timed out
Como ha quitado todas las reglas de firewall, ahora ni siquiera la aplicación Quarkus puede acceder a la base de datos. Si intenta recuperar las tareas pendientes de la base de datos, se produce un error en la solicitud. Ejecute la siguiente solicitud cURL:
curl https://$AZ_APP_URL/api/todos
Agregue una nueva regla de firewall
Debe configurar el firewall para permitir el acceso solo a la aplicación Quarkus. Debe agregar una nueva regla de firewall. Para agregar la regla, ejecute este comando:
az postgres flexible-server firewall-rule create \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name "Allow_Azure-internal-IP-addresses" \
--start-ip-address "0.0.0.0" \
--end-ip-address "0.0.0.0"
Al establecer start-ip-address
y end-ip-address
en 0.0.0.0
, se permite el acceso desde todas las direcciones IP internas de Azure, pero no se permite el acceso desde direcciones IP externas. Esta práctica ayuda a proteger la base de datos del acceso externo.
Si intenta acceder a la base de datos desde la CLI mediante la ejecución del comando siguiente, se producirá un error en el intento:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
Sin embargo, si intenta usar el siguiente comando para recuperar las tareas pendientes de la base de datos a través de la aplicación Quarkus que se ejecuta en Container Apps, el intento se realiza correctamente:
curl https://$AZ_APP_URL/api/todos
Este comando devuelve la lista de todos los elementos pendientes de la base de datos. Se puede acceder al servidor PostgreSQL desde la aplicación Quarkus que se ejecuta en un servicio de Azure, pero no se puede acceder desde fuera de Azure.