PostgreSQL에 연결
Azure Database for PostgreSQL에 대한 보안 연결을 설정하려면 연결 문자열 구성 요소, 인증 옵션 및 전송 계층 보안 구성을 이해해야 합니다. 데이터를 자주 읽고 쓰는 AI 애플리케이션의 경우 처음부터 연결 구성을 바로 가져오면 프로덕션 환경에서 인증 실패 및 보안 취약성을 방지할 수 있습니다.
연결 기본 사항
PostgreSQL 연결에는 서버, 데이터베이스 및 사용자 자격 증명을 식별하는 여러 매개 변수가 필요합니다. Azure Database for PostgreSQL은 특정 엔드포인트 형식을 사용하며 기본적으로 보안 전송을 적용합니다.
서버 엔드포인트는 패턴을 <server-name>.postgres.database.azure.com따릅니다. 여기서 <server-name> 서버를 만들 때 지정한 고유한 이름입니다. FQDN(정규화된 도메인 이름)은 공용 액세스를 사용할 때 서버의 공용 IP 주소 또는 VNet 통합을 사용할 때 개인 IP 주소로 확인됩니다.
PostgreSQL 연결에는 호스트(서버 FQDN), 포트(직접 연결의 경우 5432, PgBouncer의 경우 6432), 데이터베이스 이름, 사용자 이름(Entra 인증, 사용 username@servername 형식), 암호(정적 또는 엔터 토큰) 및 SSL 모드와 같은 핵심 매개 변수가 필요합니다. 다른 클라이언트 라이브러리 및 도구는 연결 문자열, 키워드-값 쌍 또는 개별 매개 변수를 비롯한 다양한 형식으로 이러한 매개 변수를 허용합니다.
인증 방법
Azure Database for PostgreSQL은 두 가지 인증 방법을 지원합니다. Microsoft Entra 인증은 토큰 기반 액세스를 통해 더 강력한 보안을 제공하는 반면 PostgreSQL 네이티브 인증은 기존 사용자 이름과 암호 자격 증명을 사용합니다.
Microsoft Entra 인증은 암호 대신 OAuth 2.0 토큰을 사용합니다. 이 방법은 Azure의 ID 플랫폼과 통합되고 중앙 집중식 ID 관리를 제공하고, 암호 스토리지(토큰은 수명이 짧은 경우)를 제거하고, Azure 호스팅 애플리케이션에 대한 관리 ID를 지원하며, Entra 로그인 로그에 감사 내역을 만듭니다. Entra 인증을 사용하려면 서버(사용자 계정, 그룹 또는 서비스 주체)에서 Microsoft Entra 관리자를 구성합니다. 설정이 완료되면 Entra 계정은 리소스https://ossrdbms-aad.database.windows.net에서 토큰을 받아 연결합니다.
연결 프로세스는 다음과 같이 작동합니다.
- 애플리케이션이 Microsoft Entra ID에서 액세스 토큰을 요청합니다.
- Entra는 ID의 유효성을 검사하고 토큰을 반환합니다.
- 애플리케이션은 토큰을 암호로 사용하여 PostgreSQL에 연결합니다.
- PostgreSQL은 구성된 Entra 관리자에 대해 토큰의 유효성을 검사합니다.
Python에서 라이브러리를 azure-identity 사용하여 토큰을 가져올 수 있습니다.
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default")
# Use token.token as the password in your connection string
클래스는 DefaultAzureCredential 관리 ID(Azure에서 실행되는 경우), Azure CLI 자격 증명(로컬 개발용) 및 기타 옵션을 포함하여 여러 인증 방법을 순서대로 자동으로 시도합니다.
PostgreSQL 네이티브 인증은 데이터베이스에 사용자 이름과 암호화된 암호를 저장합니다. 이 방법은 애플리케이션이 Entra 인증(레거시 애플리케이션)을 사용할 수 없거나, Entra 테넌트 외부의 ID에 대한 액세스 권한을 부여해야 하거나, 개발 중에 Azure 연결 없이 환경에서 실행 중인 경우에 적합합니다. PostgreSQL 인증을 사용하는 경우 애플리케이션 구성이 아닌 Azure Key Vault에 암호를 저장하고, 정기적으로 암호를 회전하고, 강력한 임의로 생성된 암호를 사용하고, 각 데이터베이스 사용자의 권한을 제한합니다. 서버를 만드는 동안 지정한 관리자 사용자 이름 및 암호는 PostgreSQL 인증을 사용합니다.
TLS/SSL 구성
Azure Database for PostgreSQL은 TLS(전송 계층 보안)를 사용하여 모든 연결을 암호화합니다. 서버에는 기본적으로 TLS가 필요하며 TLS 1.2 및 1.3을 지원합니다. 이전 TLS 버전을 사용하는 연결은 거부됩니다.
PostgreSQL 클라이언트는 매개 변수를 sslmode 사용하여 암호화 및 인증서 유효성 검사를 제어합니다. 사용 가능한 모드는 다음과 같습니다.
- 비활성화: 암호화 없음. Azure는 이 모드를 사용하여 연결을 거부합니다.
- 허용: 서버에 필요한 경우 암호화하지만 인증서의 유효성을 검사하지는 않습니다.
- 선호: 서버에서 지원하는지 암호화하지만 인증서의 유효성을 검사하지는 않습니다.
- 필요: 암호화를 적용하지만 인증서의 유효성을 검사하지는 않습니다.
- verify-ca: 암호화를 적용하고 신뢰할 수 있는 인증 기관에 대해 서버 인증서의 유효성을 검사합니다.
- verify-full: 암호화를 적용하고, CA의 유효성을 검사하고, 인증서 호스트 이름이 서버와 일치하는지 확인합니다.
프로덕션 애플리케이션에서는 정품 Azure PostgreSQL 서버에 연결을 보장하기 위해 verify-full를 사용하십시오. 이 모드는 서버가 신뢰할 수 있는 인증 기관에서 서명한 인증서를 제공하고 인증서의 일반 이름 또는 주체 대체 이름이 서버 호스트 이름과 일치하는지 확인합니다.
verify-ca 및 verify-full 모드를 사용하려면 클라이언트가 서버의 인증서에 서명한 루트 CA 인증서에 액세스할 수 있어야 합니다. 대부분의 운영 체제 및 Azure 호스팅 환경에는 Azure Database for PostgreSQL에서 사용하는 DigiCert 및 Microsoft 루트 CA가 이미 포함되어 있습니다. 인증서 유효성 검사에 실패하는 경우 Microsoft의 PKI 리포지토리에서 루트 인증서를 다운로드하고 이를 사용하도록 클라이언트를 구성해야 할 수 있습니다.
PgBouncer를 사용하여 연결 풀링
Azure Database for PostgreSQL에는 Azure Portal에서 서버의 구성 설정을 통해 또는 Azure CLI를 사용하여 사용하도록 설정할 수 있는 기본 제공 PgBouncer가 포함되어 있습니다. 사용하도록 설정되면 5432 대신 포트 6432에 연결합니다.
중요합니다
PgBouncer는 범용 및 메모리 최적화 컴퓨팅 계층에서만 사용할 수 있습니다. 서버에서 버스트 가능 계층을 사용하는 경우 기본 제공 PgBouncer를 사용하도록 설정할 수 없습니다.
PgBouncer는 데이터베이스 서버에 대한 연결 풀을 유지하고 클라이언트 연결을 이 풀에 멀티플렉싱합니다. 이렇게 하면 연결 설정의 오버헤드가 줄어듭니다. 이는 많은 수명이 짧은 연결을 만드는 애플리케이션에 유용합니다.
Azure CLI를 사용하여 PgBouncer를 사용하도록 설정하려면 다음을 수행합니다.
az postgres flexible-server parameter set \
--resource-group myResourceGroup \
--server-name myserver \
--name pgbouncer.enabled \
--value true
사용하도록 설정한 후 포트 6432를 사용하도록 연결 문자열을 업데이트합니다.
postgresql://user@myserver.postgres.database.azure.com:6432/mydb?sslmode=require
풀 크기 조정 및 트랜잭션 및 세션 모드를 비롯한 연결 풀링 최적화 전략은 "성능 최적화, 인덱싱 및 크기 조정" 모듈에서 다룹니다.
네트워크 액세스 고려 사항
Azure Database for PostgreSQL은 방화벽 규칙을 사용하는 공용 액세스와 VNet 통합을 사용한 프라이빗 액세스라는 두 가지 네트워킹 모델을 지원합니다. 플랫폼 또는 운영 팀은 일반적으로 이러한 설정을 구성하지만 이러한 설정을 이해하면 연결 문제를 해결하는 데 도움이 됩니다.
공용 액세스를 통해 서버에는 공용 IP 주소와 클라이언트 IP가 연결할 수 있는 방화벽 규칙이 제어됩니다. 개발 컴퓨터에서 연결할 수 없는 경우 방화벽 규칙에서 IP 주소가 허용되는지 확인합니다.
프라이빗 액세스를 사용하면 서버에 Azure Virtual Network 내의 개인 IP 주소만 있습니다. 동일한 VNet, 피어된 네트워크 또는 VPN/ExpressRoute를 통해서만 리소스에서 연결할 수 있습니다. 프라이빗 액세스는 네트워크 격리가 필요한 프로덕션 환경에서 일반적입니다.
연결 문자열 예제
다음 예제에서는 Azure Database for PostgreSQL에 대한 일반적인 연결 문자열 패턴을 보여 줍니다.
# Basic connection with SSL required
postgresql://myuser:mypassword@myserver.postgres.database.azure.com/mydb?sslmode=require
# Connection with certificate verification
postgresql://myuser:mypassword@myserver.postgres.database.azure.com/mydb?sslmode=verify-full&sslrootcert=/etc/ssl/certs/ca-certificates.crt
# Connection through PgBouncer (note port 6432)
postgresql://myuser:mypassword@myserver.postgres.database.azure.com:6432/mydb?sslmode=require