Exercice : limiter l’accès à l’environnement Azure Container Apps

Effectué

Dans cette unité, vous veillez à ce que la base de données PostgreSQL soit accessible uniquement par l’application Quarkus, et non par d’autres clients externes. Vous pouvez accéder actuellement à la base de données à partir de n’importe quel client en utilisant Azure CLI et en exécutant Quarkus localement. Cette configuration n’est pas sécurisée. Vous devez ajouter une règle de pare-feu pour autoriser uniquement les adresses IP de l’environnement Azure Container Apps à accéder au serveur de base de données.

Accéder au serveur PostgreSQL en tirant parti de l’interface CLI

Tout d’abord, veillez que vous pouvez accéder au serveur PostgreSQL en utilisant Azure CLI. Pour ce faire, exécutez cette commande :

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

Vous devriez être en mesure de voir le contenu de la base de données. Si vous le voulez, vous pouvez accéder à la base de données en dehors de l’environnement.

Supprimer la règle de pare-feu permissive

Azure Database pour PostgreSQL offre une sécurité par défaut. Son pare-feu n’autorise généralement pas les connexions entrantes. Toutefois, quand vous avez créé le serveur PostgreSQL, vous avez spécifié le paramètre --public-access "All" pour activer l’accès externe, ce qui a configuré l’ouverture du pare-feu au public.

Vous pouvez lister les règles de pare-feu existantes en exécutant la commande suivante :

az postgres flexible-server firewall-rule list \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --output table

Vous devez normalement voir la sortie suivante :

EndIpAddress     Name                       ResourceGroup            StartIpAddress
---------------  -------------------------  -----------------------  ----------------
255.255.255.255  AllowAll_2023-1-3_10-20-4  rgazure-deploy-quarkus  0.0.0.0

Notez que la plage d’adresses IP autorisée est 0.0.0.0 à 255.255.255.255. Une telle règle de pare-feu permet à tout client d’accéder à la base de données. Pour vérifier que seule l’application Quarkus peut accéder à la base de données, vous devez mettre à jour les règles de pare-feu du serveur PostgreSQL. Dans ce cas, il s’agit simplement de supprimer la règle publique. Supprimez-la en exécutant la commande suivante :

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

À présent, essayez d’interroger la base de données en exécutant une instruction SQL à partir de l’interface 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

L’appel expire à la fin. Vous devriez voir ce message :

Unable to connect to flexible server: connection to server failed: Operation timed out

Étant donné que vous avez supprimé toutes les règles de pare-feu, l’application Quarkus n’a maintenant aucun accès à la base de données. Si vous essayez de récupérer les tâches à partir de la base de données, la requête échoue. Exécutez la requête cURL suivante :

curl https://$AZ_APP_URL/api/todos

Ajouter une nouvelle règle de pare-feu.

Vous devez configurer le pare-feu de façon à ce qu’il accepte uniquement l’accès à partir de l’application Quarkus. Vous devez ajouter une nouvelle règle de pare-feu. Pour ajouter la règle, exécutez cette commande :

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"

La définition de start-ip-address et de end-ip-address sur 0.0.0.0 autorise l’accès à partir de toutes les adresses IP internes Azure, mais n’autorise l’accès d’aucune adresse IP externe. Il s’agit d’une bonne pratique pour sécuriser la base de données contre l’accès externe.

Si vous tentez d’accéder à la base de données à partir de l’interface CLI en exécutant la commande suivante, la tentative doit échouer :

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

Mais si vous tentez d’utiliser la commande suivante pour récupérer les tâches à partir de la base de données via l’application Quarkus qui s’exécute sur Container Apps, la tentative réussit :

curl https://$AZ_APP_URL/api/todos

Cette commande retourne la liste de toutes les tâches de la base de données. Le serveur PostgreSQL est accessible à partir de l’application Quarkus qui s’exécute sur un service Azure, mais pas en dehors d’Azure.