비공개 IP 만있는 Cloud SQL : 좋은 것, 나쁜 것, 추한 것

데이터는 모든 회사의 새로운 금광 이며이 보물은 보안을 유지하고 보호하십시오 . 그렇기 때문에 데이터베이스 관리자의 일반적인 모범 사례는 데이터베이스에 대한 모든 공개 액세스를 제거하는 것입니다. 특히 공개 IP를 사용하고 비공개 IP에서만 액세스 권한을 부여합니다.
이 “골든”규칙은 모든 사용자에게 적용됩니다. 보안 팀은 모든 클라우드 배포에 동일한 패턴이 필요합니다.

Cloud SQL 서비스 를 사용하면 다음을 수행 할 수 있습니다.

이러한 기능 덕분에 보안 팀 요구 사항을 시행 할 수 있습니다 .

하지만 우리가 일할 때 문제가 되는가? Cloud SQL 인스턴스에서 공개 IP를 사용하지 않으려 고하나요?

3 가지 사용 사례에 대해 확인해 보겠습니다.

  1. Compute Engine 연결
  2. 서버리스 서비스 연결
  3. 로컬 환경 연결

Cloud SQL 프록시 바이너리

사용 사례를 자세히 살펴보기 전에 Cloud SQL 프록시

  • 이 바이너리는 안전한 엔드 투 엔드 암호화 터널 . 요약하면 데이터베이스에 SSL 인증서가 없더라도 데이터는 전송 중에 암호화됩니다.
  • 터널을 열기 전에 바이너리 현재 사용자 인증 정보가 Cloud SQL 인스턴스에 액세스하도록 승인 된 경우 IAM 서비스 API . 이것은 사용자 / 비밀번호에 의한 표준 데이터베이스 인증에 추가 된 추가 보안 계층입니다.
  • 터널은 로컬 포트 ​​(TCP 연결 모드) 또는 Unix 소켓 (에서는 불가능)에서 열 수 있습니다. Windows 환경)

좋은 점 : Compute Engine 연결

이 비공개 IP 보안 패턴이 구축 되었기 때문입니다. 레거시 아키텍처 (예 : 온 프레미스 VM 및 사설 네트워크)의 경우 제약 조건 IaaS 환경에 완벽하게 맞습니다. (예 : Compute Engine + VPC).
Compute Engine에 대해 언급하지만 Compute Engine 인스턴스를 사용하는 모든 서비스 (Dataflow, Dataproc, GKE 등)에서도 마찬가지입니다.

  • VM을 Cloud SQL 인스턴스 비공개 IP와 동일한 VPC.
  • Cloud SQL 인스턴스 비공개 IP를 사용하여 Compute Engine에 배포 된 앱에서 연결합니다.
  • 다음 경우에 필요한 방화벽 규칙을 엽니 다. 필요합니다.

“좋음” 입니다 !!

참고 :이 경우 Cloud SQL 프록시 사용에 대해 논의 할 수 있습니다. IAM 서비스 및 암호화 된 통신에 대한 권한을 확인하여 추가 보안 계층을 추가 할뿐만 아니라 추가 지연 시간과 잠재적 인 실패 지점도 추가합니다. 트레이드 오프의 문제입니다.

나쁜 : 서버리스 서비스 연결

“새로운 세상”을 사용할 때 클라우드, 서버리스 패러다임 의 경우 Cloud Run , Cloud Functions App Engine .

사실 서버리스 플랫폼에 배포하는 경우 , 정의에 따라 서버를 관리 할 필요가 없습니다 , 따라서 서버가 VPC 에 없습니다. 따라서 프로젝트의 VPC에 연결된 Cloud SQL 비공개 IP 에 바로 연결하는 것은 불가능합니다.

Cloud Run , Cloud Functions App Engine 에서 Cloud SQL 인스턴스를 서버리스 서비스에 연결하는 방법 내장 기능 덕분에 :

구성에 Cloud SQL 인스턴스 연결 이름을 추가하면 인스턴스 시작과 함께 터널이 자동으로 생성됩니다.

실제로는 Unix 소켓 모드에서 Cloud SQL 프록시 바이너리에 의해 열린 연결입니다. . 하지만 이 솔루션은 Cloud SQL 인스턴스에 공개 IP가있는 경우에만 작동합니다 .
비공개 IP 전용 의 경우 및 Cloud SQL 프록시에 비공개 IP 연결 모드가 있습니다 , 작동하지 않습니다!

서버리스 서비스를 Cloud SQL 비공개 IP에 연결

솔루션이 있기를 바랍니다. private IP < 이를위한 Cloud SQL 연결 가이드 의 / div> 탭 ( Cloud Functions 예시 )

요약하면 다음을 수행해야합니다.

  • 서버리스 VPC 커넥터 , 서버리스 서비스와 동일한 지역에 있습니다. 물론 Cloud SQL 인스턴스와 동일한 VPC에 연결됩니다.
    현재 모든 지역은 서버리스 VPC 커넥터에서 지원되지만 한동안은 그렇지 않았습니다.

를 사용하여 서버리스 서비스 배포

Cloud Run , Cloud Functions App Engine

  • 앱에서 Cloud SQL 비공개 IP (Unix 소켓 연결 대신) 사용
  • 이 솔루션은 작동하지만 새 네트워크 요소 , 추가 비용 가능한 새로운 실패 지점 연결 체인에서.

    “나쁜” 입니다 !!

    The Ugly : Local environment connectivity

    데이터베이스를 쿼리하려는 경우 , 언젠가 프로덕션 단계에서 컴퓨터에 설치된 기본 데이터베이스 IDE를 통해 로컬 환경을 클라우드에 연결해야합니다. SQL 인스턴스를 사용하므로 비공개 IP를 사용합니다.

    Cloud SQL 인스턴스에는 공개 IP가 없으므로 에서 직접 연결할 수 없습니다. 인터넷 (사용자 컴퓨터) 및 Cloud SQL 프록시도 . 여기서 해결책은 요새 호스트 : 외부 세계 (공용 IP)와 내부 세계 (개인 IP) 간의 브리지 VM입니다.

    이를 위해 작은 Compute Engine 인스턴스를 생성 , f1-micro (예 : 매월 5 달러 미만).

    보안 팀 요구 사항 : 모든 VM에 공용 IP가 없어야합니다. 물론 0.0.0.0/0 방화벽 규칙은 허용되지 않습니다. 특히 포트 22 (ssh)에서는 허용되지 않습니다.

    공개 IP가없는 Bassion 호스트

    다룰 새로운 제약 조건 ! 하지만 일관성이 있습니다. 문을 닫으면 창문을 열어두기위한 것입니다 !!
    문제 없습니다. Google Cloud는 이에 대한 훌륭하고 쉬운 솔루션을 제공합니다.
    Identity-Aware Proxy (IAP)

    IAP를 사용하면 Google Cloud IAP 만 부여하면됩니다. 방화벽 규칙의 포트 22에서 Compute Engine에 액세스하기위한 IP 범위

    35.235.240.0/20 . 따라서 0.0.0.0/0 (전체 인터넷)을 열 필요가 없습니다. Compute Engine ssh 포트에 연결합니다!

    그런 다음 gcloud SDK를 사용하여 배스 천 호스트 Compute에 연결합니다. 엔진 인스턴스
    gcloud compute ssh --zone=
    그리고 마법이 일어납니다! gcloud SDK 는 Compute Engine의 공개 IP 부족을 자동으로 감지합니다. 인스턴스 및 인스턴스에 SSH로 연결하기위한 IAP 터널이 자동으로 열립니다 . 사용자에게는 보이지 않습니다.

    자격 증명 (여기서는 사용자 계정이지만 서비스 계정 일 수 있음) IAP 터널을 만들 수있는 충분한 권한이 있어야합니다 . 역할은 roles / iap.tunnelResourceAccessor로 터널을 생성 roles / compute.instanceAdmin.v1 to access to the VM

    이제 배스 천 호스트에 연결되었지만 아직 Cloud SQL 인스턴스를 연결하지 않았습니다.

    IAP 터널링, SSL 포트 전달 및 Cloud SQL 프록시

    그리고 여기서 “추악” 부분이 시작됩니다. . 달성해야 할 두 가지 사항이 있습니다.

    1. 배스 천 호스트를 Cloud SQL 인스턴스에 연결합니다. 비공개 IP
    2. 로컬 환경 데이터베이스 연결 요청 을 배스 천 호스트로 전달하여 Cloud SQL 프록시 터널을 통해 Cloud SQL 인스턴스에 도달

    1. 배스 천 호스트에서 Cloud SQL 인스턴스 연결
    이를 위해 배스 천 호스트와 Cloud SQL 인스턴스 사이의 터널을 열려면 Cloud SQL 프록시가 필요합니다.

    첫 번째 호 : 공인 IP가 없으면 인터넷에 연결할 수 없습니다!
    Cloud NAT 생성 . 하지만 가장 쉬운 방법은 로컬 환경에서 다운로드 한 다음 배스 천 호스트에 복사합니다 . 이를 위해이 명령을 사용할 수 있습니다.
    gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
    IAP를 통해 SSH 연결을 열 수 있으므로 scp 프로토콜 (ssh 복사)을 IAP를 통해 파일 복사! Magic !!

    좋습니다. 이제 배스 천 호스트 Compute Engine 인스턴스에 바이너리가 있고 연결이 작동하는지 테스트하고 싶습니다 . 명령을 실행할 수 있습니다.

    #Connect to bastion host
    gcloud compute ssh --zone=
    #Change the permission of the Cloud SQL proxy binary (do it only once)
    chmod +x /tmp/cloud_sql_proxy
    #Connect to your Cloud SQL instance
    /tmp/cloud_sql_proxy --instances==tcp:3306

    다음을 찾을 수 있습니다. connection_name Cloud SQL 인스턴스 페이지

    두 번째 문제 : 작동하지 않습니다! 여러 가지 이유가 있습니다!

    • 배스 천 호스트 기본 매개 변수를 사용하여 Compute Engine , 특히 API 범위 부분의 경우 Cloud SQL API에 도달 할 범위가 충분하지 않습니다.
      이 문제를 해결하려면 Compute Engine을 중지하고 수정 한 다음 범위 사용자 지정
    • Cloud SQL 터널이 생성되면 현재 사용자 인증 정보의 IAM 권한 (여기서는 Compute Engine 자격 증명 ) 가 확인됩니다. . Compute Engine 서비스 계정에 충분한 권한이 없습니다.
      이 문제를 해결하려면 서비스 계정에 최소 역할이 부여 되었는지 확인하세요. Cloud SQL client, Cloud SQL editor 또는 Cloud SQL admin
      Compute Engine 기본 서비스 계정에 역할 / 편집기가 있습니다. 역할. 너무 광범위하지만 사용 사례에 충분합니다.
    • 마지막으로 Google Cloud API를 요청하면 기본적으로 공개 DNS가 요청됩니다. . 터널이 생성 될 때 Cloud SQL 프록시가 Cloud SQL API 또는 IAM 서비스를 요청할 때 발생합니다. 또한 배스 천 호스트 Compute Engine 에는 공개 IP가 없기 때문에 인터넷 및 googleapis.com 퍼블릭 DNS.
      이 문제를 해결하려면 두 가지 솔루션이 있습니다.이전에 제안한대로 Cloud NAT 를 설정하거나 Google Cloud VPC의 까다로운 기능을 사용합니다. 배스 천 호스트 Compute Engine의 현재 서브넷 허용 비공개

      googleapis.com DNS . 이를 위해 VPC로 이동하여 올바른 서브넷을 선택하고 편집하십시오. 그런 다음 비공개 Google 액세스 라디오 버튼으로 On를 선택하고 저장합니다.

    좋습니다 !! 이제 요새 호스트 Compute Engine은 Cloud SQL 프록시를 사용하여 로컬 포트 ​​3306에서 Cloud SQL 인스턴스로 연결되는 터널을 열 수 있습니다. 비공개 IP를 통해.

    2. 로컬 환경 트래픽을 Cloud SQL 인스턴스로 전달
    이를 수행하기 위해 gcloud ssh 기본 제공 기능이지만 대체 솔루션입니다. . ssh를 사용하여 Compute 인스턴스에 직접 연결하는 것 외에도 gcloud SDK를 사용하면 모든 포트에서 터널을 만들 수 있습니다. .

    그러면 배스 천 호스트의 포트 22에 터널을 생성하겠습니다. Compute Engine 인스턴스 및 임의의 로컬 포트를 정의합니다 (여기서는 4226).

    gcloud compute start-iap-tunnel  22 \
    --zone= --local-host-port=localhost:4226

    좋습니다. 터널은 ssh에서 배스 천 호스트 Compute Engine 인스턴스를 연결하는 데 사용할 수 있습니다.

    터널을 열고 터미널에서 실행하고 새로운 것입니다.

    이제 로 설정합니다. 하나의 명령으로 연결을 설정하는 데 필요한 몇 가지 필수 작업을 수행합니다. :

    • 로컬 환경에서 배스 천 호스트 컴퓨팅 엔진
      -L 3306:localhost:3306
      “내 로컬 포트 ​​ 3306 는 포트에 도달하기 위해 대상 VM (여기서는 배스 천 호스트)에서 전달됩니다. 3306 localhost (즉, 대상 VM)에서 열렸습니다.”
    • 첫 번째 ssh<동안 Google에서 자동으로 생성 한 SSH 키를 재사용합니다. / div> 배스 천 호스트 Compute Engine (또는 scp)에 연결합니다. 이 개인 키는 현재 사용자 ~/.ssh
      -i ~/.ssh/google_compute_enginehome 디렉토리에 저장됩니다. >
    • ssh iv id =를 엽니 다. localhost 환경에서 기존 IAP 터널 을 통한 “f739a2f021″>

    연결 및 로컬 포트의 트래픽 4226
    -p 4226 localhost

  • 배스 천 호스트 Compute Engine에 연결된 경우 Cloud SQL 프록시를 실행하여 3306 포트에서 Cloud SQL 인스턴스 에 대한 터널을 만들려고합니다. 이를 위해 --
    -- /tmp/cloud_sql_proxy instances==tcp:3306
  • 다음에 원격 (배스 천 호스트)에서 원하는 명령을 실행합니다.

    이 모든 것을 통합

    ssh -L 3306:localhost:3306 \
    -i ~/.ssh/google_compute_engine \
    -p 4226 localhost \
    -- /tmp/cloud_sql_proxy instances==tcp:3306

    이제 완료되었습니다! 좋아하는 데이터베이스 IDE를 사용하여 localhost:3306에 연결하고 사용자 / 암호로 데이터베이스에 로그인합니다.

    와우 !! 이 모든 것이 보안 패턴을 준수하기위한 것입니다 ! 다음은 우리가 구축 한 스키마입니다.

    “못생긴” !!

    추가 부작용

    비공개 IP가있는 Cloud SQL은주의 사항 만 추가합니다 . 실제로 프로젝트의 VPC와 Cloud SQL 네트워크 (Google Cloud에서 관리)간에 피어링이 생성됩니다.
    그리고 피어링에는 두 가지 제한이 있습니다.

    이 최신 지점은 매우 중요하며 다른 프로젝트에서 데이터베이스 인스턴스에 도달하려는 경우 차단자가 될 수 있습니다. . 실제로 다른 프로젝트의 VPC에서 비공개 IP를 통해 도달 할 Cloud SQL 인스턴스가있는 프로젝트와의 피어링을 생성하려고합니다.

    하지만 전이성 제한으로 인해 t : Cloud SQL 비공개 IP는 다른 프로젝트의 VPC에서 볼 수 없습니다.
    여기서 해결 방법은 2 개의 VPC를 피어링하는 VPN을 생성하는 것입니다. .
    그건 어 … “ugliest”??

    추가 부작용은 공개 IP가 정의되지 않은 경우 App Script 앱이 Cloud SQL 인스턴스를 사용할 수 없습니다.

    스마트보안 패턴이 중요합니다.

    보안 문제와 데이터베이스의 기존 패턴 잘 작동합니다… 레거시 세계에서.
    이제 Cloud SQL 및 Cloud SQL 프록시를 사용하면 추가 보안 계층이 존재하고 이전 패턴이 무효화됩니다.

    연결할 수있는 IP 범위가 허용되지 않는 경우 공개 IP를 갖는 문제는 무엇입니까? ?

    레거시 세계의 방화벽 규칙 정의 입니다. t? 내 데이터베이스가 호스팅되는이 범위 / IP에 대한 모든 IP 액세스 거부

    보안 팀 문제 : IP 범위가 허용되지 않는지 확인하는 방법은 무엇입니까?

    이 질문은 합법적이므로 조직 정책 시행 ( 제한 Cloud SQL 인스턴스의 승인 된 네트워크 )에서 Cloud SQL 인스턴스에 공개 IP 범위 추가 방지 , 그리고 이것은 회사 전체입니다.

    결국 Cloud SQL 인스턴스에서 공개 IP를 허용하면 많은 해결 방법을 피할 수 있습니다. 보안 수준을 낮추지 않고 처리해야합니다.
    또한 생성 된 터널은 암호화되어 높은 수준의 보안을 보장합니다. 및 기밀 유지.

    클라우드는 패러다임을 바꾸고 ( Beyond Corp 참조)이를 준수하기 위해 보안 패턴을 업데이트해야합니다.
    스마트 보안 패턴이 기존 보안 패턴보다 낫습니다!

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다