SSL/TLS 인증서 구성

이 페이지에서는 모든 연결이 암호화되도록 인스턴스에 SSL/TLS 암호화를 적용하는 방법을 설명합니다. 또한 Cloud SQL에서 자체 관리형 SSL/TLS 인증서를 사용하여 Cloud SQL 인스턴스에 안전하게 연결하는 방법을 자세히 알아볼 수 있습니다.

개요

인스턴스를 만들면 Cloud SQL에서 서버 인증서를 자동으로 만듭니다. 모든 연결을 SSL/TLS에 적용하는 것이 좋습니다.

SQL Server는 클라이언트 요청이 암호화된 연결이 필요하다고 명시적으로 지정하는 경우에만 인증서 확인을 수행합니다. 이 경우 서버 인증서를 클라이언트 머신에 설치해야 합니다. 그렇지 않으면 sslModeENCRYPTED_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 필요를 사용 설정하려면 다음을 수행합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 연결을 클릭합니다.
  4. 보안 탭을 선택합니다.
  5. 다음 중 하나를 선택합니다.
    • 암호화되지 않은 네트워크 트래픽 허용(권장되지 않음)
    • 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 리소스를 사용합니다.

resource "google_sql_database_instance" "sqlserver_instance" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      ssl_mode = "ENCRYPTED_ONLY"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

변경사항 적용

Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.

Cloud Shell 준비

  1. Cloud Shell을 실행합니다.
  2. Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다.

    이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

디렉터리 준비

각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.

  1. Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는 .tf 확장자가 있어야 합니다(예: main.tf). 이 튜토리얼에서는 파일을 main.tf라고 합니다.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다.

    샘플 코드를 새로 만든 main.tf에 복사합니다.

    필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다.

  3. 환경에 적용할 샘플 매개변수를 검토하고 수정합니다.
  4. 변경사항을 저장합니다.
  5. Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
    terraform init

    원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade 옵션을 포함합니다.

    terraform init -upgrade

변경사항 적용

  1. 구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
    terraform plan

    필요에 따라 구성을 수정합니다.

  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.
    terraform apply

    Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.

  3. 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

REST v1

  1. 요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • 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

  1. 요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • 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이 서버 인증서를 자동으로 생성합니다. 서버 인증서가 유효하면 개발자가 직접 서버 인증서를 관리할 필요가 없습니다. Cloud SQL을 사용하면 두 가지 인증 기관 (CA) 계층 중에서 선택할 수 있습니다. 선택한 CA 계층 구조가 인스턴스의 서버 CA 모드가 됩니다. 인스턴스의 서버 CA 모드로 인스턴스별 CA를 사용하는 경우 서버 인증서의 만료일은 10년입니다. 공유 CA를 인스턴스의 서버 CA 모드 (미리보기)로 사용하는 경우 서버 인증서의 만료일은 1년입니다. 만료일 이후에는 서버 인증서가 더 이상 유효하지 않으며 클라이언트가 더 이상 해당 인증서를 사용하여 인스턴스에 보안 연결을 설정할 수 없습니다. 클라이언트가 CA를 확인하거나 서버 인증서의 호스트 이름을 확인하도록 구성된 경우 만료된 서버 인증서가 있는 Cloud SQL 인스턴스에 대한 클라이언트의 연결이 실패합니다. 클라이언트 연결이 중단되지 않도록 하려면 인증서가 만료되기 전에 서버 인증서를 순환하세요. 서버 인증서가 곧 만료된다는 알림이 주기적으로 전송됩니다. 알림은 만료일 90, 30, 10, 2, 1일 전에 전송됩니다.

서버 인증서가 생성된 시기 및 만료되는 시기와 같은 서버 인증서 관련 정보를 확인할 수 있습니다. 만료일 전에 새 키를 수동으로 만들 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 연결을 클릭합니다.
  4. 보안 탭을 선택합니다.
  5. 서버 인증서 관리 섹션으로 이동합니다.

    표에서 서버 인증서의 만료일을 확인할 수 있습니다.

gcloud

자체 서명된 서버 인증서를 사용하는 인스턴스 (인스턴스별 CA):

  1. 서버 인증서에 대한 정보를 가져오려면 sql ssl server-ca-certs list 명령어를 사용합니다.
    gcloud sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
  2. 서버 인증서를 만들려면 sql ssl server-ca-certs create 명령어를 사용합니다.
    gcloud sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
  3. 인증서 정보를 로컬 PEM 파일로 다운로드합니다.
    gcloud sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
  4. 다운로드한 파일을 클라이언트 호스트 머신에 복사하고 기존 server-ca.pem 파일을 대체하여 모든 클라이언트에서 새 정보를 사용하도록 업데이트합니다.

공유 CA에서 발급한 서버 인증서를 사용하는 인스턴스 (미리보기):

  1. 서버 인증서에 관한 정보를 가져오려면 beta sql ssl server-certs list 명령어를 사용합니다.
    gcloud beta sql ssl server-certs list \
       --instance=INSTANCE_NAME
  2. 서버 인증서를 만들려면 beta sql ssl server-certs create 명령어를 사용합니다.
    gcloud beta sql ssl server-certs create \
       --instance=INSTANCE_NAME
  3. 인증서 정보를 로컬 PEM 파일로 다운로드합니다.
    gcloud beta sql ssl server-certs list \
       --format="value(ca_cert.cert)" \
       --instance=INSTANCE_NAME > \
       FILE_PATH/FILE_NAME.pem
  4. 다운로드한 파일을 클라이언트 호스트 머신에 복사하고 기존 server-ca.pem 파일을 대체하여 모든 클라이언트에서 새 정보를 사용하도록 업데이트합니다.

Terraform

서버 인증서 정보를 출력으로 제공하려면 Terraform 데이터 소스를 사용합니다.

  1. 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
       }
       
  2. server-ca.pem 파일을 만들려면 다음 명령어를 실행하세요.
       terraform output db_latest_ca_cert > server-ca.pem
       

암호화된 연결 사용

SQL Server에서 암호화된 연결을 사용하는 방법 자세히 알아보기

서버 ID 확인에 대한 정보

서버 ID 확인은 Cloud SQL 인스턴스의 서버 인증 기관 (CA) 계층 구조 구성에 따라 다릅니다.

인스턴스가 인스턴스별 CA를 사용하도록 구성된 경우 각 인스턴스에 고유한 CA가 있으므로 CA를 확인하면 서버 ID도 확인됩니다.

인스턴스가 공유 CA (미리보기)를 사용하도록 구성된 경우 서버 CA가 인스턴스 간에 공유되므로 서버 ID 확인을 위해 CA 확인과 함께 호스트 이름을 확인해야 합니다.

인스턴스별 CA가 있는 경우 Private Service Connect 인스턴스에 대해서만 DNS 이름 기반 서버 ID 확인을 실행할 수 있습니다.

공유 CA(미리보기)가 있는 경우 모든 유형의 인스턴스(예: Private Service Connect, 비공개 서비스 액세스, 공개 IP 인스턴스)에 대해 DNS 이름 기반 서버 ID 확인을 실행할 수 있습니다.

인스턴스 세부정보를 확인하여 Cloud SQL 인스턴스에 구성된 CA 계층 구조를 볼 수 있습니다.

자세한 내용은 인스턴스 정보 보기 또는 다음 섹션인 서버 ID 인증 사용 설정을 참고하세요.

서버 ID 확인 사용 설정

공유 CA를 Cloud SQL 인스턴스의 서버 CA 모드 (미리보기)로 선택하는 경우 서버 ID 확인도 사용 설정하는 것이 좋습니다. 공유 CA를 서버 CA 모드로 사용하는 인스턴스에는 서버 인증서의 주체 대체 이름 (SAN) 필드에 인스턴스 DNS 이름이 포함됩니다. 인스턴스 조회 API를 사용하고 응답을 서버 ID 확인을 위한 호스트 이름으로 사용하여 이 DNS 이름을 가져올 수 있습니다. DNS 이름에 DNS 확인을 설정해야 합니다.

서버 ID 확인을 사용 설정하려면 다음 단계를 완료하세요.

  1. DNS 이름을 가져옵니다.

    1. 인스턴스의 DNS 이름을 포함하여 Cloud SQL 인스턴스에 대한 요약 정보를 보려면 gcloud sql instances describe 명령어를 사용합니다.

      gcloud sql instances describe INSTANCE_NAME \
        --project=PROJECT_ID

      다음을 바꿉니다.

      • INSTANCE_NAME: Cloud SQL 인스턴스의 이름
      • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
    2. 응답에 DNS 이름이 표시되는지 확인합니다. 이 이름의 패턴은 다음과 같습니다.

      INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
      

      예를 들면 다음과 같습니다.

      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.

  2. DNS 영역에서 DNS 레코드를 만듭니다. 비공개로 연결하는 경우 해당 가상 프라이빗 클라우드 (VPC) 네트워크의 비공개 DNS 영역에 DNS 레코드를 만듭니다.

  3. SQL Server용 Cloud SQL 인스턴스에 연결할 때 DNS 이름 또는 IP 주소를 호스트 이름으로 구성합니다. 그런 다음 sqlcmd-N 플래그를 지정하거나 SSMS의 연결 암호화/암호화 옵션을 선택하여 서버 ID 확인을 사용 설정합니다.

    다른 SQL Server 드라이버에는 유사한 플래그 또는 구성이 있습니다.

다음 단계