VM에서 TLS 암호화를 사용하여 배포 만들기

이 문서에서는 가상 머신 (VM)의 Spanner Omni 배포에 TLS 암호화를 추가하는 방법을 설명합니다. 네트워크 보안 기능이 있는 배포는 전송 계층 보안 (TLS) 1.3을 사용하여 배포 내 및 클라이언트와의 통신을 암호화하고 인증합니다. Spanner Omni는 보안 강화를 위해 상호 TLS (mTLS)를 제공하며, 여기서 양측은 데이터를 교환하기 전에 진위성을 설정합니다. mTLS는 클라이언트와 서버 간에 선택사항이지만 Spanner Omni 서버는 mTLS를 통해 서로 통신합니다.

Spanner Omni의 미리보기 버전은 TLS 암호화를 지원하지 않습니다. TLS 암호화로 배포를 만들 수 있는 기능을 사용하려면 Google에 문의하여 Spanner Omni의 정식 버전을 사전 체험해 보세요.

시작하기 전에

시작하기 전에 환경이 다음 요구사항을 충족하는지 확인하세요.

  • 배포의 각 머신에 대한 SSH 액세스 권한이 있는지 확인합니다. 이 액세스 권한을 사용하면 Spanner Omni 바이너리를 다운로드하고 실행할 수 있습니다.

  • 네트워크에서 포트 15000~15025의 TCP 통신을 허용해야 합니다.

  • 각 머신에는 배포에서 처리하는 데이터를 호스팅할 수 있는 충분한 스토리지가 있어야 합니다.

  • 시스템 요구사항 페이지를 검토하여 설정이 요구사항을 충족하는지 확인합니다.

  • vSphere 가상화 플랫폼에서 바이너리를 실행하는 경우 TSC 가상화를 사용 중지합니다. 이렇게 하려면 가상 머신의 .vmx 구성 파일에 monitor_control.virtual_rdtsc = FALSE 설정을 추가합니다.

1단계: TLS 암호화 없이 배포 만들기

암호화 없이 Spanner Omni VM 배포 만들기의 단계를 따릅니다. 암호화 및 보안 기능이 없는 VM 배포가 제대로 작동하는지 확인합니다. 이 페이지에서는 3개의 영역이 있는 리전 배포를 만들었다고 가정합니다.

2단계: 인증서 생성

다음 세 가지 인증서 세트를 만들어야 합니다.

인증서 유형 설명
API 인증서 API 인증서는 Spanner API 서버를 보호하는 데 도움이 됩니다.
서버 인증서 서버 인증서는 서버 간 통신을 보호하는 데 도움이 됩니다.
클라이언트 인증서 최종 사용자 또는 애플리케이션은 클라이언트 인증서를 사용하여 Spanner Omni 서버와의 ID 및 신뢰를 설정합니다.

인증 기관 (CA)에서 이러한 인증서를 발급합니다. Spanner Omni는 CA와 세 가지 유형의 인증서를 모두 만들 수 있는 도구를 제공합니다. 머신 중 하나에서 다음 단계를 수행합니다.

워크스테이션에서 Spanner Omni CLI를 사용하여 이러한 인증서를 만든 다음 인증서 파일을 각 Spanner Omni 서버로 전송할 수 있습니다. 자세한 내용은 Spanner Omni CLI를 사용한 빠른 시작을 참고하세요.

인증서를 생성하려면 다음 단계를 완료해야 합니다.

인증 기관 (CA) 만들기

이 기관은 다음 단계에서 생성하는 모든 클라이언트 및 서버 인증서의 루트 CA입니다.

spanner certificates create-ca --ca-certificate-directory=certs

certs 디렉터리에는 CA 인증서가 포함되어 있습니다. 이 인증서의 사본을 만들어 API 인증서의 CA로 사용합니다.

cp certs/ca.crt certs/ca-api.crt

$HOME/.spanner/private-keys 디렉터리에는 CA의 비공개 키가 포함되어 있습니다. 이 디렉터리를 백업하고 보호합니다. 비공개 키에 액세스할 수 있는 사용자는 자체 서명된 CA를 신뢰하는 클라이언트가 신뢰하는 임의의 인증서에 서명할 수 있습니다. 모든 인증서에 동일한 CA를 사용할 수 있지만 API 인증서와 클라이언트 인증서는 동일한 CA를 사용해야 합니다. 선택적으로 API 인증서에 대해 추가 CA를 만들거나 외부에서 신뢰할 수 있는 CA를 사용할 수 있습니다. 인증서를 만드는 동안 다음 단계에서 올바른 CA를 사용해야 합니다. 이 문서에서는 모든 인증서 유형에 동일한 CA를 사용합니다.

서버 인증서 생성

다음 두 가지 유형의 서버 인증서를 생성합니다.

이 설정을 사용하면 인증서 순환과 같이 이러한 인증서를 더 유연하게 관리할 수 있습니다.

Spanner 서버 인증서 만들기

Spanner Omni 서버는 서버 인증서를 사용하여 서로 간의 통신 (서버 간 통신)을 암호화합니다.

다음을 실행하여 서버 인증서를 만듭니다. SERVER_LIST를 쉼표로 구분된 Spanner 서버 이름 또는 접미사 목록으로 바꿉니다.

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

이 명령어는 certs 디렉터리에 server.crtserver.key의 두 파일을 만듭니다.

API 인증서 만들기

API 인증서는 배포와 상호작용하는 시스템의 통신을 암호화합니다. API와 서버 간 통신에 별도의 인증서를 사용하면 각 유형을 독립적으로 관리하고 순환할 수 있습니다.

다음을 실행하여 API 인증서를 만듭니다. LB_DNS을 부하 분산기의 DNS로 바꿉니다.

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

이 명령어는 certs 디렉터리에 api.crtapi.key의 두 파일을 추가로 만듭니다. 필요한 경우 API 인증서에 외부에서 신뢰할 수 있는 CA를 사용할 수 있습니다.

모든 서버에 인증서 배포

certs 디렉터리를 배포의 다른 모든 서버에 복사하여 네트워크 보안 기능으로 시작합니다.

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

3단계: 클라이언트 인증서 생성

클라이언트 인증서를 사용하여 Spanner에서 사용자 및 애플리케이션을 인증할 수 있습니다. 클라이언트 인증서를 사용하면 클라이언트와 서버 간에 mTLS를 사용할 수 있습니다.

클라이언트 인증서는 API 인증서와 동일한 CA에서 서명해야 하며 승인을 위한 사용자 이름을 포함해야 합니다. 이 예에서는 각 데이터베이스의 기본 사용자 이름인 admin 사용자를 사용합니다. 사용자, 역할, 인증 옵션에 대한 자세한 내용은 Spanner Omni의 인증 및 승인을 참고하세요.

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

이 명령어는 clientcerts 디렉터리에 client.crtclient.key 파일을 만듭니다. 이러한 파일을 배포의 서버에 연결하는 모든 머신에 전송합니다.

Java 클라이언트 라이브러리와 함께 클라이언트 인증서를 사용하려면 PKCS#8 형식으로 인증서 키를 생성해야 합니다. 다음 명령어를 사용하세요.

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

4단계: 서버 다시 시작

인증서를 생성하고 배포의 모든 서버에 복사한 후 각 서버를 다시 시작합니다.

단일 서버 배포

단일 서버 배포의 경우 다음 명령어를 실행합니다.

nohup spanner start-single-server \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

서버가 시작됩니다. 배포와 상호작용하려면 7단계: 배포와 상호작용을 참고하세요.

수평 확장 배포

스케일 아웃 배포의 경우 각 머신에서 서버를 시작합니다. server_addresszone 값은 배포 구성의 값과 일치해야 합니다. 네트워크에서 server_address를 해결해야 합니다. 서버는 내부 통신에 이를 사용합니다. 다음을 실행하여 루트 서버를 시작합니다.

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

다음 명령어는 특정 값이 있는 예시를 보여줍니다.

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

클라이언트의 mTLS를 사용 설정하려면 서버를 시작할 때 --enable-client-certificate-authentication=true 플래그를 사용하세요.

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false \
    --enable-client-certificate-authentication=true &

이제 각 머신에서 서버가 실행되므로 배포를 만들 준비가 되었습니다.

5단계: TLS 암호화로 배포 만들기

루트 서버 중 하나에서 spanner deployment create 명령어를 실행합니다.

spanner deployment create --config-file=deployment.yaml

각 머신의 콘솔에는 이제 배포에 TLS 암호화가 포함되어 있음을 나타내는 메시지가 표시됩니다. 모든 서버는 암호화된 채널을 통해 서로 통신합니다.

6단계: (선택사항) 부하 분산기 구성

배포의 서버 간에 클라이언트 트래픽을 관리하고 분산하려면 부하 분산기를 설정하세요. 상태 점검을 위한 부하 분산기 구성이 HTTP 대신 HTTPS를 사용하는지 확인합니다. 다음 구성 세부정보를 사용합니다.

매개변수
프로토콜 TCP
백엔드 IP 서버의 IP 주소
포트 15000 (기본 포트입니다. --server-address 플래그에서 다른 포트를 사용한 경우 해당 포트를 사용합니다.)
상태 점검 URL https://IP_ADDRESS:15012/healthz
균형 조정 전략 roundrobin (서버 간에 요청을 순차적으로 분산)

7단계: 배포와 상호작용

Spanner Omni CLI를 사용하여 모든 VM에서 Spanner Omni 배포와 상호작용할 수 있습니다.

암호화된 연결을 설정하려면 각 명령어에 다음 플래그를 포함해야 합니다.

  • --ca-certificate-file=certs/ca-api.crt

클라이언트용 mTLS를 사용 설정한 경우 각 명령어에 다음 플래그도 포함합니다.

  • --client-certificate-directory=clientcerts

배포에 로그인하고 상호작용하려면 다음 단계를 따르세요.

  1. Spanner Omni에 로그인

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    기본 비밀번호는 admin입니다.

    Successfully logged in as "admin"
    
  2. 데이터베이스 만들기

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. SQL 셸 열기

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. 표 만들기 및 데이터 추가

    spanner> create table names (nameId INT64 NOT NULL, name String(100)) Primary Key (nameId);
    Query OK, 0 rows affected (4.62 sec)
    
    spanner> insert names (nameId, name) values (1, "Jack");
    Query OK, 1 rows affected (0.18 sec)
    
  5. 데이터 확인

    데이터베이스를 나열합니다.

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    테이블에서 데이터를 가져옵니다.

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

8단계: (선택사항) 배포 확장

영역의 용량을 확장하기 위해 루트가 아닌 서버를 영역에 추가할 수 있습니다. 이렇게 하려면 2단계: 인증서 생성에 설명된 대로 비루트 서버의 서버 인증서를 생성하고 다음 명령어로 서버를 시작합니다.

spanner start \
    --server-address=NON_ROOT_MACHINE \
    --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
    --zone=us-central1-a \
    --base-dir=./spandir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false

다음 단계