이 페이지에서는 모든 연결이 암호화되도록 인스턴스에 SSL/TLS 암호화를 적용하는 방법을 설명합니다. 또한 Cloud SQL에서 자체 관리형 SSL/TLS 인증서를 사용하여 Cloud SQL 인스턴스에 안전하게 연결하는 방법을 자세히 알아볼 수 있습니다.
개요
인스턴스를 만들면 Cloud SQL에서 서버 인증서(server-ca.pem
)를 자동으로 만듭니다. 모든 연결을 SSL/TLS에 적용하는 것이 좋습니다.
SSL/TLS 암호화 적용
SSL 모드 설정을 사용하면 다음과 같은 방법으로 SSL 암호화를 적용할 수 있습니다.
SSL/TLS가 아닌 연결과 SSL/TLS 연결을 모두 허용합니다. SSL/TLS 연결에 대한 클라이언트 인증서가 확인되지 않습니다. 기본 옵션으로,
SSL/TLS로 암호화된 연결만 허용합니다. SSL 연결에 대한 클라이언트 인증서가 확인되지 않습니다.
- 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/TLS 필요를 사용 설정하려면 다음을 수행합니다.
콘솔
-
Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
- 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
- SQL 탐색 메뉴에서 연결을 클릭합니다.
- 보안 탭을 선택합니다.
- 다음 중 하나를 선택합니다.
- 암호화되지 않은 네트워크 트래픽 허용(권장되지 않음)
- SSL 연결만 허용합니다. 이 옵션은 SSL/TLS 암호화를 사용하는 연결만 허용합니다. 인증서가 검증되지 않습니다.
- 신뢰할 수 있는 클라이언트 인증서가 필요합니다. 이 옵션은 유효한 클라이언트 인증서를 사용하고 SSL로 암호화된 클라이언트의 연결만 허용합니다.
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
SSL_ENFORCEMENT_MODE를 다음 옵션 중 하나로 바꿉니다.
ALLOW_UNENCRYPTED_AND_ENCRYPTED
는 비SSL/비TLS 및 SSL/TLS 연결을 허용합니다. SSL 연결의 경우 클라이언트 인증서가 확인되지 않습니다. 이 설정이 기본 설정입니다.ENCRYPTED_ONLY
는 SSL/TLS로 암호화된 연결만 허용합니다. SSL 연결에 대해서는 클라이언트 인증서가 확인되지 않습니다.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
는 SSL/TLS 및 유효한 클라이언트 인증서로 암호화된 연결만 허용합니다. 자세한 내용은 MySQL용 Cloud SQL 설정을 참조하세요.
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 연결을 허용합니다. SSL 연결의 경우 클라이언트 인증서가 확인되지 않습니다. 이 설정이 기본 설정입니다.ENCRYPTED_ONLY
: SSL/TLS로 암호화된 연결만 허용합니다.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: 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 연결을 허용합니다. SSL 연결의 경우 클라이언트 인증서가 확인되지 않습니다. 이 설정이 기본 설정입니다.ENCRYPTED_ONLY
: SSL/TLS로 암호화된 연결만 허용합니다.TRUSTED_CLIENT_CERTIFICATE_REQUIRED
: 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
클라이언트 인증서
새 클라이언트 인증서 만들기
인스턴스당 최대 10개의 클라이언트 인증서를 만들 수 있습니다. 클라이언트 인증서를 만들려면 Cloud SQL Admin
IAM 역할이 있어야 합니다.
클라이언트 인증서에 대해 알아야 할 몇 가지 중요한 사항은 다음과 같습니다.
- 인증서의 비공개 키를 분실할 경우, 새 키를 만들어야 합니다. 비공개 키는 복구할 수가 없기 때문입니다.
- 기본적으로 클라이언트 인증서의 만료일은 10년입니다.
- 클라이언트 인증서 만료가 가까워지면 알림이 발송되지 않습니다.
- SSL 인증서를 만들려면 Cloud SQL 인스턴스가 실행 중 상태여야 합니다.
콘솔
-
Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
- 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
- SQL 탐색 메뉴에서 연결을 클릭합니다.
- 보안 탭을 선택합니다.
- 클라이언트 인증서 만들기를 클릭합니다.
- 클라이언트 인증서 만들기 대화상자에서 고유 이름을 추가합니다.
- 만들기를 클릭합니다.
- 새 SSL 인증서가 생성됨 대화상자의 첫 번째 섹션에서 client-key.pem 다운로드를 클릭하여 비공개 키를
client-key.pem
파일에 다운로드합니다. - 두 번째 섹션에서 client-cert.pem 다운로드를 클릭하여 클라이언트 인증서를
client-cert.pem
파일에 다운로드합니다. - 세 번째 섹션에서 server-ca.pem 다운로드를 클릭하여 서버 인증서를
server-ca.pem
파일에 다운로드합니다. - 닫기를 클릭합니다.
gcloud
ssl client-certs create
명령어를 사용하여 클라이언트 인증서를 만듭니다.gcloud sql ssl client-certs create CERT_NAME client-key.pem \ --instance=INSTANCE_NAME
ssl client-certs describe
명령어를 사용하여 방금 만든 인증서의 공개 키를 검색하여client-cert.pem
파일에 복사합니다.gcloud sql ssl client-certs describe CERT_NAME \ --instance=INSTANCE_NAME \ --format="value(cert)" > client-cert.pem
instances describe
명령어를 사용하여 서버 인증서를server-ca.pem
파일에 복사합니다.gcloud sql instances describe INSTANCE_NAME \ --format="value(serverCaCert.cert)" > server-ca.pem
Terraform
클라이언트 인증서를 만들려면 Terraform 리소스를 사용합니다.
REST v1
SSL/TLS 인증서를 만들어 이 인스턴스의 고유한 이름을 지정합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- project-id: 프로젝트 ID
- instance-id: 인스턴스 ID
- client-cert-name: 클라이언트 인증서 이름
HTTP 메서드 및 URL:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts
JSON 요청 본문:
{ "commonName" : "client-cert-name" }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
-
다음과 같이 응답에서 따옴표 안에 있는 모든 인증서 콘텐츠(따옴표는 제외)를 로컬 파일로 복사합니다.
serverCaCert.cert
를server-ca.pem
에 복사합니다.clientCert.cert
를client-cert.pem
에 복사합니다.certPrivateKey
를client-key.pem
에 복사합니다.
-
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- project-id: 프로젝트 ID
- instance-id: 인스턴스 ID
- activation-policy: 활성화 정책은 ALWAYS 또는 NEVER입니다.
HTTP 메서드 및 URL:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart
JSON 요청 본문:
{ "settings": { "activationPolicy": "activation-policy" } }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-20T21:30:35.667Z", "operationType": "RESTART", "name": "operation-id", "targetId": "instance-id", "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id", "targetProject": "project-id" }
REST v1beta4
SSL/TLS 인증서를 만들어 이 인스턴스의 고유한 이름을 지정합니다.
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- project-id: 프로젝트 ID
- instance-id: 인스턴스 ID
- client-cert-name: 클라이언트 인증서 이름
HTTP 메서드 및 URL:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts
JSON 요청 본문:
{ "commonName" : "client-cert-name" }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
-
다음과 같이 응답에서 따옴표 안에 있는 모든 인증서 콘텐츠(따옴표는 제외)를 로컬 파일로 복사합니다.
serverCaCert.cert
를server-ca.pem
에 복사합니다.clientCert.cert
를client-cert.pem
에 복사합니다.certPrivateKey
를client-key.pem
에 복사합니다.
-
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- project-id: 프로젝트 ID
- instance-id: 인스턴스 ID
- activation-policy: 활성화 정책은 ALWAYS 또는 NEVER입니다.
HTTP 메서드 및 URL:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart
JSON 요청 본문:
{ "settings": { "activationPolicy": "activation-policy" } }
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 JSON 응답이 표시됩니다.
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-20T21:30:35.667Z", "operationType": "RESTART", "name": "operation-id", "targetId": "instance-id", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id", "targetProject": "project-id" }
여기까지 실행하면 다음을 보유하게 됩니다.
server-ca.pem
으로 저장된 서버 인증서client-cert.pem
으로 저장된 클라이언트 공개 키 인증서client-key.pem
으로 저장된 클라이언트 비공개 키
연결에 사용할 도구에 따라 이 세 가지 항목이 서로 다른 방식으로 지정됩니다. 예를 들어 MySQL 클라이언트를 사용하여 연결할 경우 이 파일 세 개가 각각 --ssl-ca
, --ssl-cert
, --ssl-key
명령어 옵션 값입니다. MySQL 클라이언트와 SSL/TLS를 사용한 샘플 연결은 MySQL 클라이언트로 연결을 참조하세요.
다음 단계
- Cloud SQL 인스턴스에서 SSL/TLS 관리하기
- Google Cloud에서 암호화를 처리하는 방식 자세히 알아보기
- SSL/TLS 인증서를 사용하여 Cloud SQL 인스턴스에 연결하기
- MySQL의 SSL/TLS 사용 방법 자세히 알아보기