演習 - Azure Container Apps 環境へのアクセスを制限する

完了

このユニットでは、PostgreSQL データベースにアクセスできるのは Quarkus アプリケーションのみであり、他の外部クライアントからはアクセスできないようにします。 現在、Azure CLI を使用してローカルで Quarkus を実行することで、任意のクライアントからデータベースにアクセスできます。 この構成はセキュリティで保護されていません。 Azure Container Apps 環境内の IP アドレスのみがデータベース サーバーにアクセスできるようにするには、ファイアウォール規則を追加する必要があります。

CLI を使用して PostgreSQL サーバーにアクセスする

まず、Azure CLI を使用して PostgreSQL サーバーにアクセスできることを確認します。 これを行うには、次のコマンドを実行します。

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

データベースの内容を確認できる必要があります。 可能な場合は、環境の外部からデータベースにアクセスできます。

制限の緩いファイアウォール規則を削除する

Azure Database for PostgreSQL では、既定でセキュリティが提供されます。 通常、そのファイアウォールでは受信接続は許可されません。 ただし、PostgreSQL サーバーを作成したときに、外部アクセスを有効にするために --public-access "All" パラメーターを指定しました。このパラメーターにより、ファイアウォールがパブリックに開くように構成されました。

次のコマンドを実行して、既存のファイアウォール規則を一覧表示できます。

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

次の出力が表示されます。

EndIpAddress     Name                         ResourceGroup           StartIpAddress
---------------  ---------------------------  ----------------------  ----------------
255.255.255.255  AllowAll_2025-2-26_16-57-40  rgazure-deploy-quarkus  0.0.0.0

許可される IP アドレスの範囲は、0.0.0.0を介して 255.255.255.255 されていることに注意してください。 このようなファイアウォール規則では、任意のクライアントがデータベースにアクセスできます。 Quarkus アプリケーションのみがデータベースにアクセスできるようにするには、PostgreSQL サーバーのファイアウォール規則を更新する必要があります。 この場合は、パブリック ルールを削除するだけです。 削除するには、次のコマンドを実行します。

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

次に、CLI から SQL ステートメントを実行してデータベースのクエリを実行します。

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

呼び出しは最終的にタイムアウトします。次のメッセージが表示されます。

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

すべてのファイアウォール規則を削除したため、Quarkus アプリケーションでもデータベースにアクセスできません。 データベースから To Do を取得しようとすると、要求は失敗します。 次の cURL 要求を実行します。

curl https://$AZ_APP_URL/api/todos

新しいファイアウォール規則を追加する

Quarkus アプリケーションへのアクセスのみを許可するようにファイアウォールを構成する必要があります。 新しいファイアウォール規則を追加する必要があります。 ルールを追加するには、次のコマンドを実行します。

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"

start-ip-addressend-ip-address0.0.0.0 に設定すると、すべての Azure 内部 IP アドレスからのアクセスが許可されますが、外部 IP アドレスからのアクセスは許可されません。 この方法は、外部アクセスからデータベースをセキュリティで保護するのに役立ちます。

次のコマンドを実行して 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

ただし、次のコマンドを使用して、Container Apps で実行されている Quarkus アプリケーションを介してデータベースから To Do を取得しようとすると、試行は成功します。

curl https://$AZ_APP_URL/api/todos

このコマンドは、データベースからすべての to-do 項目の一覧を返します。 PostgreSQL サーバーは、Azure サービスで実行されている Quarkus アプリケーションからアクセスできますが、Azure の外部からはアクセスできません。