이 문서에서는 가상 머신 (VM)의 Spanner Omni 배포에 TLS 암호화를 추가하는 방법을 설명합니다. 네트워크 보안 기능이 있는 배포는 전송 계층 보안 (TLS) 1.3을 사용하여 배포 내 및 클라이언트와의 통신을 암호화하고 인증합니다. Spanner Omni는 보안 강화를 위해 상호 TLS (mTLS)를 제공하며, 양측은 데이터를 교환하기 전에 진위 여부를 확인합니다. mTLS는 클라이언트와 서버 간에 선택사항이지만 Spanner Omni 서버는 mTLS를 통해 서로 통신합니다.
시작하기 전에
시작하기 전에 환경이 다음 요구사항을 충족하는지 확인하세요.
배포의 각 머신에 대한 SSH 액세스 권한이 있는지 확인합니다. 이 액세스 권한을 통해 Spanner Omni 바이너리를 다운로드하고 실행할 수 있습니다.
네트워크에서 포트 15000~15030의 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 서버 간의 통신을 암호화합니다.
API 인증서: 배포와 상호작용하는 시스템의 통신을 암호화합니다.
이 설정을 사용하면 인증서 순환과 같은 인증서를 더 유연하게 관리할 수 있습니다.
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.crt 및 server.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.crt 및 api.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.crt 및 client.key 파일을 만듭니다. 배포 서버에 연결되는 모든 머신에 이 파일을 전송합니다.
Java 클라이언트 라이브러리와 함께 클라이언트 인증서를 사용하려면 PKCS#8 형식으로 인증서 키를 생성해야 합니다. 다음 명령어를 사용하세요.
USERNAME=admin
spanner certificates create-client $USERNAME \
--output-directory clientcerts \
--ca-certificate-directory certs \
--generate-pkcs8-key
4단계: 래퍼 키 세트 생성
Spanner Omni는 키 암호화 키 (KEK) 래퍼 키 세트를 사용하여 토큰 암호화 및 서명 키와 같은 내부 키를 암호화합니다.
Spanner Omni 서버는 BASE_DIR/kms/wrapper_key에서 이 키 세트를 읽습니다.
spanner keys create-keyset를 사용하여 새 래퍼 키 세트 파일을 생성하려면 다음 명령어를 실행합니다.
spanner keys create-keyset --output-file=kms/wrapper_key
기본적으로 spanner keys create-keyset는 AES256_GCM 키를 생성합니다. 다른 유형의 키를 생성하려면 --key-template 플래그를 AES256_GCM, AES128_GCM, AES256_GCM_RAW, CHACHA20_POLY1305, XCHACHA20_POLY1305 키 유형 값 중 하나와 함께 사용합니다.
모든 서버에 래퍼 키 세트 배포
배포의 모든 서버를 시작하기 전에 kms 디렉터리를 기본 디렉터리에 복사합니다.
scp -r kms REMOTE_HOST:BASE_DIR/kms
5단계: 서버 시작하기
배포에서 서버를 시작하려면 다음 단계를 따르세요.
- 인증서와 래퍼 키 세트를 생성하고 배포의 모든 서버에 복사했는지 확인합니다.
- 각 서버에 데이터, 메타데이터, 로그를 저장할 기본 디렉터리를 만듭니다. 서버를 다시 시작해야 하는 경우 연속성을 위해 동일한 기본 디렉터리를 지정합니다.
- 다음 섹션에서 배포 유형에 대한 안내를 사용하여 각 서버를 시작합니다.
단일 서버 배포
암호화를 사용하여 단일 서버 배포를 시작하려면 초기 admin 사용자의 비밀번호 파일을 만들고 지원되는 인증 방법 및 인증서로 서버를 시작합니다.
소유자만 읽을 수 있도록 권한이 600으로 설정된 비밀번호 파일을 만듭니다.
printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt비밀번호는 다음 요구사항을 충족해야 합니다.
- 길이는 8~32자(영문 기준)입니다.
- 대문자 1자 이상
- 소문자 1자 이상
- 숫자 1개 이상
- 특수문자 1개 이상
TLS 및 인증이 구성된 단일 서버를 시작합니다.
nohup spanner start-single-server \ --base-dir=BASE_DIR \ --certificate-directory=${HOME}/.spanner/certs \ --auth-methods=password,client-certificate \ --password-protocol=opaque \ --initial-admin-password-file=admin_password.txt &초기 시작 시
spanner start-single-server는 지원되는 인증 방법과 비밀번호 프로토콜을 설정하고 지정된 비밀번호 파일을 사용하여roles/spanner.admin역할이 있는 초기admin사용자를 만듭니다.
배포와의 상호작용에 대한 자세한 내용은 8단계: 배포와 상호작용을 참조하세요.
수평 확장 배포
수평 확장 배포의 경우 각 머신에서 서버를 시작합니다. server-address 및 zone의 값은 배포 구성의 값과 일치해야 합니다. 네트워크에서 server-address를 확인해야 합니다. 서버는 내부 통신에 server-address를 사용합니다. 다음을 실행하여 루트 서버를 시작합니다.
nohup spanner start \
--root \
--server-address=HOST_NAME \
--zone=ZONE_NAME \
--base-dir=BASE_DIR \
--certificate-directory=${HOME}/.spanner/certs &
다음 명령어는 특정 값이 있는 예시를 보여줍니다.
nohup spanner start \
--root \
--server-address=rootserver1 \
--zone=us-central-1a \
--base-dir=./spanbasedir \
--certificate-directory=${HOME}/.spanner/certs &
이제 각 머신에서 서버가 실행되므로 배포를 만들 수 있습니다.
6단계: TLS 암호화로 배포 만들기
배포를 만들려면 다음 단계를 따르세요.
기본
admin사용자의 비밀번호가 포함된 비밀번호 파일을 만들고 권한을 600 (소유자만 읽을 수 있음)으로 설정합니다.printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt비밀번호는 다음 요구사항을 충족해야 합니다.
- 길이는 8~32자(영문 기준)입니다.
- 대문자 1자 이상
- 소문자 1자 이상
- 숫자 1개 이상
- 특수문자 1개 이상
deployment.yaml에 선택한 인증 방법과 비밀번호 프로토콜이 포함되어 있는지 확인합니다.deployment_settings: security_settings: authentication_methods: - AUTHENTICATION_METHOD_PASSWORD - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE다음 인증 방법 중 하나 이상을 지정할 수 있습니다.
AUTHENTICATION_METHOD_PASSWORD: 비밀번호 인증AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: 클라이언트 인증서 인증
다음 비밀번호 프로토콜을 지정할 수 있습니다.
PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: OPAQUE 프로토콜
루트 서버 중 하나에서
spanner deployment create명령어를 실행하여 배포를 만듭니다.--base-dir플래그를 사용하여 기본 디렉터리를 지정하고(루트 서버를 시작할 때 지정한 것과 동일한 BASE_DIR 사용)--admin-password-file플래그를 사용하여 관리자 비밀번호 파일을 제공합니다.spanner deployment create \ --config-file=deployment.yaml \ --base-dir=BASE_DIR \ --admin-password-file=admin_password.txt
각 머신의 콘솔에는 이제 배포에 TLS 암호화가 포함되어 있음을 나타내는 메시지가 표시됩니다. 모든 서버는 암호화된 채널을 통해 서로 통신합니다.
7단계: (선택사항) 부하 분산기 구성
배포의 서버 간에 클라이언트 트래픽을 관리하고 분산하려면 부하 분산기를 설정합니다. 상태 점검을 위한 부하 분산기 구성에서 HTTP 대신 HTTPS를 사용하는지 확인합니다. 다음 구성 세부정보를 사용합니다.
| 매개변수 | 값 |
|---|---|
| 프로토콜 | TCP |
| 백엔드 IP | 서버의 IP 주소입니다. |
| 포트 | 15000 (기본 포트입니다. --server-address 플래그에서 다른 포트를 사용한 경우 해당 포트를 사용합니다. |
| 상태 점검 URL | https://IP_ADDRESS:15012/healthz |
| 균형 전략 | roundrobin (서버 간에 순차적으로 요청 분산) |
8단계: 배포와 상호작용
Spanner Omni CLI를 사용하여 모든 VM에서 Spanner Omni 배포와 상호작용할 수 있습니다.
암호화된 연결을 설정하려면 각 명령어에 다음 플래그를 포함해야 합니다.
--ca-certificate-file=certs/ca-api.crt
클라이언트에 mTLS를 사용 설정한 경우 각 명령어에 다음 플래그도 포함합니다.
--client-certificate-directory=clientcerts
로그인하고 배포와 상호작용하려면 다음 단계를 따르세요.
Spanner Omni에 로그인
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINT메시지가 표시되면
admin_password.txt에서 구성한 비밀번호를 입력합니다.Successfully logged in as "admin"데이터베이스 만들기
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.SQL 셸 열기
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>표 만들기 및 데이터 추가하기
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)데이터 확인
데이터베이스를 나열합니다.
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME 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.crtConnected. 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)
9단계: (선택사항) 배포 확장
루트가 아닌 서버를 영역에 추가하여 용량을 확장할 수 있습니다. 루트가 아닌 서버를 추가하려면 다음 단계를 따르세요.
루트가 아닌 서버의 서버 인증서를 생성하고 인증서를 복사합니다. 자세한 내용은 2단계: 인증서 생성을 참조하세요.
래퍼 키 세트를 루트가 아닌 서버에 복사합니다. 자세한 내용은 4단계: 래퍼 키 세트 생성을 참조하세요.
루트가 아닌 서버를 시작합니다.
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
다음 단계
- 클라이언트 라이브러리 및 JDBC 드라이버를 사용하여 애플리케이션을 배포에 연결합니다.
- 사용자 및 역할 관리