이 페이지에서는 모든 연결이 암호화되도록 인스턴스에 SSL/TLS 암호화를 적용하는 방법을 설명합니다. 또한 Cloud SQL에서 자체 관리형 SSL/TLS 인증서를 사용하여 Cloud SQL 인스턴스에 안전하게 연결하는 방법을 자세히 알아볼 수 있습니다.
개요
인스턴스를 만들면 Cloud SQL에서 서버 인증서(server-ca.pem
)를 자동으로 만듭니다. 모든 연결을 SSL/TLS에 적용하는 것이 좋습니다.
sslMode
가 ENCRYPTED_ONLY
로 설정되어 있는 인스턴스를 구성하는 경우에도 클라이언트가 연결 문자열이나 인증서를 추가로 변경하지 않고 자유롭게 연결할 수 있습니다.
자세한 내용은 SQL Server 문서의 데이터베이스 엔진에 암호화된 연결 사용 설정 섹션을 참조하세요.
인스턴스에 SSL을 적용하면 인스턴스를 다시 시작해야 합니다. SSL/TLS 인증서를 변경한 후 다시 시작해야 할 수도 있습니다. 다시 시작해야 하는 경우 Cloud SQL에서 자동으로 인스턴스를 다시 시작합니다. 인스턴스를 다시 시작하면 다운타임이 발생할 수 있습니다.SSL/TLS 암호화 적용
SSL 모드 설정을 사용하면 다음과 같은 방법으로 SSL 암호화를 적용할 수 있습니다.
SSL/TLS가 아닌 연결과 SSL/TLS 연결을 모두 허용합니다. 이는 기본 옵션입니다.
SSL/TLS로 암호화된 연결만 허용합니다.
Cloud SQL 인스턴스에 비SSL/비TLS 및 SSL/TLS 연결 허용을 선택하면 SSL/TLS 연결은 물론 암호화되지 않은 연결과 안전하지 않은 연결도 허용됩니다. 모든 연결에 SSL/TLS를 요구하지 않으면 암호화되지 않은 연결이 계속 허용됩니다. 따라서 공개 IP를 사용하여 인스턴스에 액세스하는 경우에는 모든 연결에 SSL을 적용하는 것이 좋습니다.
SSL/TLS 인증서를 사용하여 인스턴스에 직접 연결하거나 Cloud SQL 인증 프록시 또는 Cloud SQL 커넥터를 사용하여 연결할 수 있습니다. Cloud SQL 인증 프록시나 Cloud SQL 커넥터를 사용하여 연결하면 연결이 자동으로 SSL/TLS로 암호화됩니다. Cloud SQL 인증 프록시와 Cloud SQL 커넥터를 사용하면 SSL 모드 설정에 관계없이 클라이언트 및 서버 ID도 자동으로 확인됩니다.
SSL을 사용하면 모든 연결이 암호화됩니다.SSL/TLS 필요를 사용 설정하려면 다음을 수행합니다.
콘솔
-
Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
- 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
- SQL 탐색 메뉴에서 연결을 클릭합니다.
- 보안 탭을 선택합니다.
- 다음 중 하나를 선택합니다.
- 암호화되지 않은 네트워크 트래픽 허용(권장되지 않음)
- SSL 연결만 허용합니다. 이 옵션은 SSL/TLS 암호화를 사용하는 연결만 허용합니다.
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
SSL_ENFORCEMENT_MODE를 다음 옵션 중 하나로 바꿉니다.
ALLOW_UNENCRYPTED_AND_ENCRYPTED
는 비SSL/비TLS 및 SSL/TLS 연결을 허용합니다. 이 설정이 기본 설정입니다.ENCRYPTED_ONLY
는 SSL/TLS로 암호화된 연결만 허용합니다.
Terraform
SSL/TLS 암호화를 적용하려면 Terraform 리소스를 사용합니다.
변경사항 적용
Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.
Cloud Shell 준비
- Cloud Shell을 실행합니다.
-
Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다.
이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.
디렉터리 준비
각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.
-
Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는
.tf
확장자가 있어야 합니다(예:main.tf
). 이 튜토리얼에서는 파일을main.tf
라고 합니다.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다.
샘플 코드를 새로 만든
main.tf
에 복사합니다.필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다.
- 환경에 적용할 샘플 매개변수를 검토하고 수정합니다.
- 변경사항을 저장합니다.
-
Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
terraform init
원하는 경우 최신 Google 공급업체 버전을 사용하려면
-upgrade
옵션을 포함합니다.terraform init -upgrade
변경사항 적용
-
구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
terraform plan
필요에 따라 구성을 수정합니다.
-
다음 명령어를 실행하고 프롬프트에
yes
를 입력하여 Terraform 구성을 적용합니다.terraform apply
Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.
- 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.
변경사항 삭제
변경사항을 삭제하려면 다음 단계를 따르세요.
- Terraform 구성 파일에서 삭제 보호를 사용 중지하려면
deletion_protection
인수를false
로 설정합니다.deletion_protection = "false"
- 다음 명령어를 실행하고 프롬프트에
yes
를 입력하여 업데이트된 Terraform 구성을 적용합니다.terraform apply
-
다음 명령어를 실행하고 프롬프트에
yes
를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.terraform destroy
REST v1
-
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- PROJECT_ID: 프로젝트 ID
- SSL_ENFORCEMENT_MODE: 다음 옵션 중 하나를 사용합니다.
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: SSL/TLS가 아닌 연결과 SSL/TLS 연결을 허용합니다.ENCRYPTED_ONLY
: SSL/TLS로 암호화된 연결만 허용합니다.
- INSTANCE_ID: 인스턴스 ID입니다.
HTTP 메서드 및 URL:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
JSON 요청 본문:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
REST v1beta4
-
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- PROJECT_ID: 프로젝트 ID
- SSL_ENFORCEMENT_MODE: 다음 옵션 중 하나를 사용합니다.
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: SSL/TLS가 아닌 연결과 SSL/TLS 연결을 허용합니다.ENCRYPTED_ONLY
: SSL/TLS로 암호화된 연결만 허용합니다.
- INSTANCE_ID: 인스턴스 ID입니다.
HTTP 메서드 및 URL:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
JSON 요청 본문:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
서버 인증서
인스턴스를 만들면 Cloud SQL이 서버 인증서를 자동으로 생성합니다. 서버 인증서가 유효하면 개발자가 직접 서버 인증서를 관리할 필요가 없습니다. 그러나 인증서 만료일은 10년입니다. 만료일 이후에는 인증서가 더 이상 유효하지 않으며 클라이언트가 이 인증서를 사용하여 인스턴스에 대한 보안 연결을 설정할 수 없습니다. 서버 인증서가 곧 만료된다는 알림이 주기적으로 전송됩니다. 알림은 만료일 90, 30, 10, 2, 1일 전에 전송됩니다.
서버 인증서가 만들어진 시기 및 만료되는 시기 같은 서버 인증서 관련 정보를 가져오거나 수동으로 새 인증서를 만들 수 있습니다.
콘솔
-
Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
- 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
- SQL 탐색 메뉴에서 연결을 클릭합니다.
- 보안 탭을 선택합니다.
- 서버 인증서 관리 섹션으로 이동합니다.
표에서 서버 인증서의 만료일을 확인할 수 있습니다.
gcloud
- 서비스 인증서에 대한 정보를 가져옵니다.
gcloud beta sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- 서버 인증서를 만듭니다.
gcloud beta sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- 인증서 정보를 로컬 PEM 파일로 다운로드합니다.
gcloud beta sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- 다운로드한 파일을 클라이언트 호스트 머신에 복사하고 기존
server-ca.pem
파일을 대체하여 모든 클라이언트에서 새 정보를 사용하도록 업데이트합니다.
Terraform
서버 인증서 정보를 출력으로 제공하려면 Terraform 데이터 소스를 사용합니다.
- Terraform 구성 파일에 다음을 추가합니다.
data "google_sql_ca_certs" "ca_certs" { instance = google_sql_database_instance.default.name } locals { furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0] latest_ca_cert = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time] } output "db_latest_ca_cert" { description = "Latest CA certificate used by the primary database server" value = local.latest_ca_cert sensitive = true }
server-ca.pem
파일을 만들려면 다음 명령어를 실행하세요.terraform output db_latest_ca_cert > server-ca.pem
암호화된 연결 사용
SQL Server에서 암호화된 연결을 사용하는 방법 자세히 알아보기
다음 단계
- Cloud SQL 인스턴스에서 SSL/TLS 관리하기
- Google Cloud에서 암호화를 처리하는 방식 자세히 알아보기