연습 - Azure Container Apps 환경에 대한 액세스 제한

완료됨

이 단원에서는 Quarkus 애플리케이션에서만 PostgreSQL 데이터베이스에 액세스할 수 있고 다른 외부 클라이언트에서는 액세스할 수 없는지 확인합니다. 현재 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_2023-1-3_10-20-4  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 애플리케이션도 데이터베이스에 액세스할 수 없습니다. 데이터베이스에서 할 일(ToDo을 검색하려고 하면 요청이 실패합니다. 다음 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 애플리케이션을 통해 데이터베이스에서 할 일을 검색하려고 시도하면 성공합니다.

curl https://$AZ_APP_URL/api/todos

이 명령은 데이터베이스의 모든 할 일 항목 목록을 반환합니다. PostgreSQL 서버는 Azure 서비스에서 실행되는 Quarkus 애플리케이션에서 액세스할 수 있지만 Azure 외부에서는 액세스할 수 없습니다.