Spanner Omni는 TLS 1.3을 사용하여 클라이언트와 서버 간, Spanner Omni 서버 간에 흐르는 데이터를 암호화합니다. Spanner Omni는 데이터를 교환하기 전에 양측이 서로의 진위 여부를 확인하는 향상된 보안을 위해 mTLS를 제공합니다. 암호화를 사용하는 경우 서버는 mTLS를 통해 통신해야 합니다. 클라이언트와 서버에서 mTLS를 사용할지 여부를 선택할 수 있습니다.
시작하기 전에
다음 요구사항을 충족하는지 확인합니다.
Kubernetes 클러스터를 만듭니다. 이 구성은 Google Kubernetes Engine (GKE) 및 Amazon Elastic Kubernetes Service (Amazon EKS)를 지원합니다. 다른 환경에서 작동하도록 구성을 맞춤설정해야 할 수 있습니다.
Kubernetes 클러스터가 Spanner Omni 컨테이너를 호스팅하는 Artifact Registry 아티팩트에 액세스할 수 있는지 확인합니다.
kubectl명령줄 도구 및 Helm을 설치하고 구성합니다.vSphere 가상화 플랫폼 머신에서 Kubernetes 환경을 설정하는 경우 가상 머신의
.vmx구성 파일에monitor_control.virtual_rdtsc = FALSE를 추가하여 타임스탬프 카운터 (TSC) 가상화를 사용 중지합니다. 이렇게 하면 TrueTime이 올바르게 작동합니다.환경이 Spanner Omni 시스템 요구사항을 충족하는지 확인합니다.
1단계: 인증서 생성하기
인증서 세트 3개를 만들어야 합니다.
API 인증서: Spanner Omni API 서버를 보호하는 데 도움이 됩니다.
서버 인증서: 서버 간 통신을 보호하는 데 도움이 됩니다.
클라이언트 인증서: 최종 사용자 또는 애플리케이션은 이를 사용하여 Spanner Omni 서버와의 ID 및 신뢰를 설정합니다.
인증 기관 (CA)에서 이러한 인증서를 발급합니다. Spanner Omni는 자체 서명 CA와 세 가지 유형의 인증서를 모두 만들 수 있는 도구를 제공합니다.
머신 중 하나에서 다음 단계를 수행합니다. 이 단계에서는 네임스페이스가 spanner-ns라고 가정합니다. 배포에 사용할 네임스페이스로 변경합니다.
Spanner Omni CLI를 사용하여 워크스테이션에서 이러한 인증서를 만들 수 있습니다.
1. 인증 기관 (CA) 만들기
인증 기관 (CA)은 모든 인증서를 발급합니다. 조직에 중앙 CA가 있을 수 있으며 공개 CA를 사용할 수 있습니다. 모든 인증서에 동일한 CA를 사용할 수 있지만 API 인증서와 클라이언트 인증서는 동일한 CA를 사용해야 합니다.
Spanner Omni를 사용하면 비공개 CA를 만들 수 있습니다.
./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs
create-ca 명령어는 certs 디렉터리에 CA 인증서를 생성합니다.
이 인증서를 복사하여 API 인증서의 CA로 사용하거나 다른 CA를 만들 수 있습니다. 인증서를 만들 때 올바른 CA를 사용해야 합니다.
cp certs/ca.crt certs/ca-api.crt
$HOME/.spanner/private-keys 디렉터리에는 CA의 비공개 키가 포함되어 있습니다.
이 디렉터리를 백업하고 보호하는 것이 중요합니다. 비공개 키에 액세스할 수 있는 사용자는 자체 서명 CA를 신뢰하는 클라이언트가 신뢰하는 임의의 인증서에 서명할 수 있습니다. 원하는 경우 API 인증서에 대해 추가 CA를 만들거나 외부에서 신뢰할 수 있는 CA를 사용할 수 있습니다. 이 문서에서는 모든 유형의 인증서에 동일한 CA를 사용합니다.
2. 서버 인증서 생성
다음 두 가지 유형의 서버 인증서를 생성해야 합니다.
API 인증서: 이 인증서를 사용하여 배포와 상호작용하는 시스템의 통신을 암호화합니다.
Spanner 서버 인증서: Spanner Omni 서버는 이 인증서를 사용하여 서로 간의 통신을 암호화합니다.
이 구성을 사용하면 인증서를 유연하게 관리할 수 있습니다. 예를 들어 인증서 순환을 사용할 수 있습니다.
Spanner 서버 인증서 만들기
서버 인증서를 만들려면 다음 명령어를 실행합니다.
# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
이 명령어는 certs 디렉터리에 server.crt 및 server.key를 만듭니다.
API 인증서 만들기
API 인증서를 만들려면 다음 명령어를 실행합니다.
OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs
이 명령어는 certs 디렉터리에 api.crt 및 api.key를 만듭니다. 필요한 경우 API 인증서에 외부에서 신뢰할 수 있는 CA를 사용합니다.
3. 클라이언트 인증서 생성
클라이언트 인증서를 사용하여 사용자와 애플리케이션을 인증할 수 있습니다. 클라이언트 인증서는 클라이언트와 서버 간에 mTLS를 사용 설정합니다. mTLS를 사용하지 않으려면 이 단계를 건너뛸 수 있습니다.
API 인증서에 서명하는 동일한 CA가 클라이언트 인증서에 서명해야 하며, 여기에는 승인을 위한 사용자 이름도 포함되어야 합니다. 이 예시에서는 각 새 데이터베이스의 기본 사용자인 admin 사용자를 사용합니다. 자세한 내용은 Spanner Omni의 인증 및 승인을 참조하세요.
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs
이 명령어는 clientcerts 디렉터리에 client.crt 및 client.key를 만듭니다. 이러한 파일을 배포에 연결되는 모든 머신에 전송합니다.
Java 클라이언트 라이브러리와 함께 클라이언트 인증서를 사용하려면 PKCS#8 형식으로 인증서 키를 생성해야 합니다. 다음 명령어를 사용하세요.
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key
4. 래퍼 키 세트 생성
Spanner Omni는 각 서버 포드의 /spanner/kms/wrapper_key에 마운트된 키 암호화 키 (KEK) 래퍼 키 세트를 사용하여 토큰 암호화 및 서명 키와 같은 내부 키를 암호화합니다.
spanner keys create-keyset를 사용하여 새 래퍼 키 세트 파일을 생성하려면 다음 명령어를 실행합니다.
./google/spanner/bin/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 키 유형 값 중 하나와 함께 사용합니다.
2단계: 인증서, 래퍼 키 세트, 관리자 비밀번호를 Kubernetes 클러스터에 푸시하기
다음 명령어를 실행하여 네임스페이스를 만들고 인증서, 래퍼 키 세트, 관리자 비밀번호를 Kubernetes 클러스터에 푸시합니다.
네임스페이스를 만드세요.
kubectl create namespace NAMESPACETLS 인증서를 보안 비밀에 푸시합니다.
kubectl create secret generic tls-certs \ --from-file=ca.crt="certs/ca.crt" \ --from-file=ca-api.crt="certs/ca-api.crt" \ --from-file=server.crt="certs/server.crt" \ --from-file=server.key="certs/server.key" \ --from-file=api.crt="certs/api.crt" \ --from-file=api.key="certs/api.key" \ -n NAMESPACE래퍼 키 세트를 각 서버 포드의
/spanner/kms에 마운트된 보안 비밀 (wrapper-key)에 푸시합니다.kubectl create secret generic wrapper-key \ --from-file=wrapper_key="kms/wrapper_key" \ -n NAMESPACE제한된 권한 (소유자만 읽을 수 있음, 권한 600)으로 기본
admin사용자의 비밀번호가 포함된 비밀번호 파일을 만듭니다.printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt비밀번호는 다음 요구사항을 충족해야 합니다.
- 길이는 8~32자(영문 기준)입니다.
- 대문자 1자 이상
- 소문자 1자 이상
- 숫자 1개 이상
- 특수문자 1개 이상
관리자 비밀번호의 보안 비밀을 만듭니다.
kubectl create secret generic spanner-admin-password \ --from-file=password=admin_password.txt \ -n NAMESPACE
3단계: TLS 암호화로 배포 만들기
TLS 암호화를 사용하여 배포를 만들려면 다음 단계를 따르세요.
1. Helm 구성 준비
Helm 차트 구성 만들기를 참조하고 환경의 배포 구성을 만듭니다.
TLS를 사용 설정하고 관리자 비밀번호를 구성하려면 Helm 차트 구성에서 다음 값을 설정합니다.
# Enables TLS
global:
insecureMode: false
# Enables client certificate authentication (mTLS)
deployment:
enableClientCertificateAuthentication: true
# Name of the secret containing the administrator password
adminPasswordSecret: spanner-admin-password
2. 배포를 만듭니다.
다음 명령어를 실행하여 배포를 만듭니다.
kubectl create ns monitoring
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
--version VERSION \
--set global.platform=gke \
--set global.insecureMode=false \
--set deployment.enableClientCertificateAuthentication=true \
--set deployment.adminPasswordSecret=spanner-admin-password \
--namespace NAMESPACE \
--set monitoring.enabled=true
이 명령어는 부트스트랩 작업을 트리거합니다. 이 작업의 로그를 확인하여 진행 상황을 추적할 수 있습니다.
kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f
출력에 진행 상황이 표시됩니다. 완료되면 '배포가 생성되었습니다'라는 메시지가 표시됩니다.
3. 포드 상태 확인
다음 명령어를 실행하여 포드 상태를 확인합니다.
kubectl get pods --watch --namespace NAMESPACE
모든 포드가 READY 상태입니다.
4. 부하 분산기 세부정보로 인증서 및 배포 업데이트
이 단계는 클라이언트가 Kubernetes 클러스터 외부에서 연결하도록 하려는 경우에 필요합니다.
# Get the service details
kubectl get service spanner -n NAMESPACE
# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update \
--certificate-file=certs/api.crt \
--certificate-key-file=certs/api.key \
--hostnames=${OMNI_ENDPOINT} \
--ca-certificate-directory=certs
# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
4단계: Spanner Omni와 상호작용하기
Spanner Omni CLI를 사용하여 모든 VM에서 Spanner Omni 배포와 상호작용할 수 있습니다.
클라이언트에 mTLS를 사용 설정한 경우 각 명령어에 다음 플래그를 사용합니다.
--client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY--ca-certificate-file=API_CA_CERT_FILE_PATH
1. Spanner Omni에 로그인 (선택사항)
Spanner Omni에 로그인합니다 (클라이언트 인증서를 사용하는 경우 이 단계는 선택사항임).
./google/spanner/bin/spanner auth login admin \
--ca-certificate-file=certs/ca-api.crt \
--deployment-endpoint=DEPLOYMENT_ENDPOINT
메시지가 표시되면 admin_password.txt에서 구성한 비밀번호를 입력합니다.
Successfully logged in as "admin"
2. 데이터베이스 만들기
다음 명령어를 실행하여 데이터베이스를 만듭니다.
./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
3. SQL 셸 열기
다음 명령어를 실행하여 셸을 엽니다.
./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
4. 표 만들기 및 데이터 추가하기
다음 SQL 명령어를 실행합니다.
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. 배포를 확인합니다.
데이터베이스를 나열하려면 다음 명령어를 실행합니다.
./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
결과는 다음과 유사합니다.
| 이름 | STATE | VERSION_RETENTION_PERIOD | EARLIEST_VERSION_TIME | ENABLE_DROP_PROTECTION |
|---|---|---|---|---|
| DATABASE_NAME | READY | 1시간 | 2025-02-07T12:25:30Z | 거짓 |
데이터를 쿼리하려면 다음 명령어를 실행합니다.
./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
다음 SQL 명령어를 실행합니다.
SHOW TABLES;
SELECT * FROM names;
또는 Spanner Omni에서 PGAdapter 사용의 안내에 따라 PGAdapter를 구성하고 psql과 같은 도구를 사용하여 상호작용할 수 있습니다.
5단계: 배포 모니터링
monitoring.enabled=true를 사용하여 Spanner Omni를 설치한 경우 Prometheus가 측정항목을 스크래핑합니다. Grafana를 사용하여 이러한 측정항목을 시각화할 수 있습니다.
1. 서비스 세부정보 가져오기
다음 명령어를 실행하여 서비스 세부정보를 가져옵니다.
# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring
# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring
다음 단계
- 클라이언트 라이브러리 및 JDBC 드라이버를 사용하여 애플리케이션을 배포에 연결합니다.
- 사용자 및 역할 관리