연습 - 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-address
및 end-ip-address
를 0.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 외부에서는 액세스할 수 없습니다.