이 페이지에서는 Secret Manager에서 보안 비밀의 이벤트 알림을 구성하고 사용하는 방법을 설명합니다.
개요
Secret Manager는 Pub/Sub와 통합되어 보안 비밀 및 보안 비밀 버전 변경사항에 대한 이벤트 알림을 제공합니다. 이러한 알림을 사용하여 새 보안 비밀 버전이 추가될 때 애플리케이션을 다시 시작하거나, 보안 비밀이 삭제될 때 보안 엔지니어에게 알리는 등의 워크플로를 시작할 수 있습니다. 이러한 알림을 사용하여 워크플로를 시작하는 방법에 대한 자세한 내용은 Pub/Sub 문서를 참조하세요.
Secret Manager에서 이벤트 알림이 작동하는 방식
보안 비밀은 최대 10개의 Pub/Sub 주제 목록으로 구성할 수 있습니다. 보안 비밀 또는 버전 중 하나를 수정하는 작업이 수행될 때마다 Secret Manager는 해당 보안 비밀의 각 Pub/Sub 주제에 메시지를 자동으로 게시합니다.
Get
, List
, Access
호출은 메시지 게시로 이어지지 않습니다.
Pub/Sub 메시지에는 이벤트에 대한 메타데이터가 포함된 속성 키-값 쌍과 생성되거나 수정된 Secret
또는 SecretVersion
리소스의 전체 JSON 직렬화를 포함하는 data 필드가 포함됩니다. 이 JSON은 Secret Manager 공개 API에서 지정한 형식과 정확히 동일한 형식으로 Secret
또는 SecretVersion
리소스를 나타내는 UTF-8로 인코딩된 문자열이며, proto3 JSON 매핑에 지정된 대로 JSON으로 인코딩됩니다.
이벤트 유형
다음은 Secret Manager에서 지원하는 이벤트 유형 목록입니다.
이벤트 유형 | 설명 |
---|---|
SECRET_CREATE |
새 보안 비밀이 성공적으로 생성되면 전송됩니다. |
SECRET_UPDATE |
새 보안 비밀이 성공적으로 업데이트되면 전송됩니다. |
SECRET_DELETE |
사용자가 시작한 요청 또는 보안 비밀 만료로 인해 보안 비밀이 삭제되면 전송됩니다. |
SECRET_VERSION_ADD |
새 보안 비밀 버전이 성공적으로 추가되면 전송됩니다. |
SECRET_VERSION_ENABLE |
보안 비밀 버전이 사용 설정되면 전송됩니다. |
SECRET_VERSION_DISABLE |
보안 비밀 버전이 사용 중지되면 전송됩니다. |
SECRET_VERSION_DESTROY |
보안 비밀 버전이 삭제되면 전송됩니다. |
SECRET_VERSION_DESTROY_SCHEDULED |
보안 비밀에 폐기 지연 시간이 구성되어 있고 사용자가 보안 비밀 버전을 폐기하려고 할 때 전송됩니다. |
SECRET_ROTATE |
보안 비밀을 순환해야 할 시점에 전송됩니다. 자세한 내용은 순환 일정 만들기를 참고하세요. |
TOPIC_CONFIGURED |
작업이 성공하면 주제가 보안 비밀에 업데이트될 때마다 |
알림 형식
Pub/Sub 주제로 전송되는 알림은 다음 두 부분으로 구성됩니다.
-
속성: 이벤트를 설명하는 키-값 쌍의 모음입니다.
-
데이터: 변경된 객체의 메타데이터를 포함하는 문자열입니다.
속성
속성은 Secret Manager에서 Pub/Sub 주제로 전송한 알림에 포함된 키:값 쌍입니다. TOPIC_CONFIGURED
테스트 메시지를 제외한 모든 알림에는 알림 데이터에 관계없이 항상 다음 키:값 쌍 조합이 포함됩니다.
예 | 설명 | |
---|---|---|
eventType |
SECRET_CREATE |
방금 발생한 이벤트의 유형. 가능한 값 목록은 이벤트 유형을 참조하세요. |
dataFormat |
JSON_API_V1 |
객체 데이터의 형식입니다. |
secretId |
projects/p/secrets/my-secret |
이벤트가 발생한 보안 비밀의 전체 리소스 이름입니다. |
timestamp |
2021-01-20T11:17:45.081104-08:00 |
이벤트가 발생한 시간입니다. |
또한 알림에는 다음과 같은 키-값 쌍 조합이 포함되는 경우가 있습니다.
예 | 설명 | |
---|---|---|
versionId |
projects/p/secrets/my-secret/versions/456 |
이벤트가 발생한 보안 비밀 버전의 이름입니다.
|
deleteType |
REQUESTED |
사용자(REQUESTED ) 또는 보안 비밀 만료(EXPIRATION )로 인해 삭제가 요청되었는지 여부입니다. SECRET_DELETE 이벤트 알림에만 있습니다.
|
데이터
데이터 필드는 변경된 객체의 메타데이터를 포함하는 UTF-8 문자열입니다. 데이터는 보안 비밀 또는 보안 비밀 버전입니다.
SECRET_DELETE
알림의 경우 데이터 필드에 포함된 메타데이터는 삭제되기 전의 객체 메타데이터를 나타냅니다. 다른 모든 알림의 경우, 데이터 필드에 포함된 메타데이터는 변경이 발생한 이후의 객체 메타데이터를 나타냅니다.
제한사항
이벤트 알림은 Secret Manager v1 API 및 Google Cloud CLI에서만 사용할 수 있습니다.
시작하기 전에
모든 리소스를 동일한 프로젝트에 저장하거나 보안 비밀과 Pub/Sub 주제를 별도의 프로젝트에 저장할 수 있습니다.
-
Secret Manager를 설정하려면 다음 단계를 완료하세요.
-
프로젝트를 만들거나 기존 프로젝트를 사용하여 Secret Manager 리소스를 보존합니다.
-
필요한 경우 Secret Manager API 사용 설정 페이지에 언급된 단계를 완료합니다.
-
-
Pub/Sub를 설정하려면 다음을 완료하세요.
-
프로젝트를 만들거나 기존 프로젝트를 사용하여 Pub/Sub 리소스를 보존합니다.
-
필요한 경우 Pub/Sub API를 사용 설정합니다.
-
-
다음 명령어를 사용하여 Google Cloud에 인증합니다.
$ gcloud auth login --update-adc
서비스 에이전트 ID 만들기
이벤트 알림과 함께 보안 비밀이 필요한 각 프로젝트에 대해 서비스 에이전트 ID를 만들려면 다음 단계를 따르세요.
-
Google Cloud CLI를 사용하여 서비스 ID를 만들려면 다음 명령어를 실행하세요.
$ gcloud beta services identity create \ --service "secretmanager.googleapis.com" \ --project "PROJECT_ID"
이 명령어는 다음 형식의 서비스 계정 이름을 반환합니다.
service-PROJECT_ID@gcp-sa-secretmanager.iam.gserviceaccount.com
-
이 서비스 계정에 보안 비밀에 구성된 Pub/Sub 주제에 게시할 권한을 부여합니다.
-
다음 명령어를 사용하여 서비스 계정 이름을 환경 변수로 저장합니다.
# This is from the output of the command above $ export SM_SERVICE_ACCOUNT="service-...."
이 절차를 따를 때는 항상 Secret Manager 프로젝트, Pub/Sub 프로젝트, Secret Manager 서비스 계정의 환경 변수를 설정해야 합니다.
Pub/Sub 주제 만들기
Pub/Sub 빠른 시작을 따라 Google Cloud 콘솔의 Pub/Sub 프로젝트에 주제를 만듭니다. 또는 다음 명령어를 사용하여 Google Cloud CLI에서 주제를 만들 수 있습니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- PROJECT_ID: 보안 비밀이 포함된 Google Cloud 프로젝트 ID
- PUBSUB_PROJECT_ID: 구독을 만들 프로젝트의 ID
- PUBSUB_TOPIC_NAME: 주제 이름
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows(PowerShell)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows(cmd.exe)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
보안 비밀에 여러 Pub/Sub 주제를 만들려면 이 과정을 여러 번 반복합니다.
서비스 계정에 주제에 게시할 수 있는 Secret Manager 권한을 부여합니다.
Google Cloud 콘솔 또는 Google Cloud CLI를 통해 Secret Manager 서비스 계정에 권한을 부여할 수 있습니다.
Pub/Sub 주제에 Pub/Sub 게시자 역할(roles/pubsub.publisher
)을 부여하려면 다음 명령어를 사용합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- PUBSUB_TOPIC_NAME: 주제 이름
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME \ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
Windows(PowerShell)
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME ` --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ` --role "roles/pubsub.publisher"
Windows(cmd.exe)
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME ^ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ^ --role "roles/pubsub.publisher"
Pub/Sub 구독 만들기
주제에 게시된 메시지를 보려면 주제에 대한 구독도 만들어야 합니다. Pub/Sub 빠른 시작을 따라 Google Cloud 콘솔의 Pub/Sub 프로젝트에 구독을 만듭니다. 또는 다음 명령어를 사용하여 Google Cloud CLI에서 주제를 만들 수 있습니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- PUBSUB_PROJECT_ID: 구독을 만들 프로젝트의 ID
- PUBSUB_SUBSCRIPTION_NAME: 구독 이름
- PUBSUB_TOPIC_NAME: 주제 이름
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME \ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows(PowerShell)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ` --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows(cmd.exe)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ^ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
주제가 구성된 보안 비밀 만들기
최대 10개의 주제 목록으로 구성된 보안 비밀을 만듭니다. 보안 비밀에 구성된 모든 주제는 보안 비밀 또는 보안 비밀 버전 중 하나가 변경될 때 이벤트 알림을 수신합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- PUBSUB_TOPIC_NAME: 주제 이름
- LOCATION: 보안 비밀의 Google Cloud 위치
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
Windows(PowerShell)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
Windows(cmd.exe)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
보안 비밀 주제 업데이트
새 Pub/Sub 주제 리소스 이름으로 보안 비밀을 업데이트하여 보안 비밀에 구성된 Pub/Sub 주제를 수정합니다. Google Cloud CLI를 사용하면 보안 비밀에서 하나 이상의 주제를 추가 또는 삭제할 수 있으며 보안 비밀에서 모든 주제를 삭제할 수 있습니다.
주제 추가
보안 비밀에 하나 이상의 주제를 추가하려면 다음 명령어를 사용합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- LOCATION: 보안 비밀의 Google Cloud 위치
- PROJECT_ID: 보안 비밀이 포함된 Google Cloud 프로젝트 ID
- PUBSUB_PROJECT_ID: 구독을 만들 프로젝트의 ID
- PUBSUB_TOPIC_1_NAME 및 PUBSUB_TOPIC_2_NAME: 보안 비밀에 추가하는 주제의 이름
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
주제 삭제
보안 비밀에서 하나 이상의 주제를 삭제하려면 다음 명령어를 사용합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- LOCATION: 보안 비밀의 Google Cloud 위치
- PROJECT_ID: 보안 비밀이 포함된 Google Cloud 프로젝트
- PUBSUB_PROJECT_ID: 구독을 만들 프로젝트의 ID
- PUBSUB_TOPIC_1_NAME 및 PUBSUB_TOPIC_2_NAME: 보안 비밀에서 삭제할 주제의 이름
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
주제 지우기
보안 비밀에서 모든 주제를 삭제하려면 다음 명령어를 사용합니다.
gcloud
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- SECRET_ID: 보안 비밀의 ID 또는 보안 비밀의 정규화된 식별자
- PROJECT_ID: 보안 비밀이 포함된 Google Cloud 프로젝트
- LOCATION: 보안 비밀의 Google Cloud 위치
다음 명령어를 실행합니다.
Linux, macOS 또는 Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --clear-topics
Windows(PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --clear-topics
Windows(cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --clear-topics
Cloud Run Functions로 이벤트 알림 사용
이벤트 알림을 사용하여 Pub/Sub 메시지를 사용할 Cloud Run Functions를 만들어 워크플로를 개시할 수 있습니다. 자세한 내용은 Cloud Run Functions 문서를 참조하세요. 다음 샘플 코드는 이벤트가 주제에 게시될 때마다 eventType
, secretId
, 메타데이터를 출력하는 Cloud Run Functions용입니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Secret Manager C# SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Cloud.PubSub.V1; using System; using System.Threading; using System.Threading.Tasks; // Triggered from a message on a Cloud Pub/Sub topic. // The printed value will be visible in Cloud Logging // (https://cloud.google.com/functions/docs/monitoring/logging). namespace PubSubSample { public class Function : ICloudEventFunction<MessagePublishedData> { public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken) { string eventType = data.Message.Attributes["eventType"]; string secretId = data.Message.Attributes["secretId"]; string secretMetadata = data.Message.TextData; Console.WriteLine($"Received {eventType} for {secretId}. New metadata: {secretMetadata}."); return Task.CompletedTask; } } }
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Java
Secret Manager용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Secret Manager 클라이언트 라이브러리를 참조하세요.
Secret Manager에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Secret Manager Node.js SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
/** * Triggered from a message on a Cloud Pub/Sub topic. * The printed value will be visible in Cloud Logging * (https://cloud.google.com/functions/docs/monitoring/logging). * * @param {!Object} event Event payload. * @param {!Object} context Metadata for the event. */ exports.smEventsFunction = (event, context) => { const eventType = event.attributes.eventType; const secretID = event.attributes.secretId; const secretMetadata = Buffer.from(event.data, 'base64').toString(); console.log(`Received ${eventType} for ${secretID}. New metadata: ${secretMetadata}.`); };
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Secret Manager Ruby SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.
require "functions_framework" require "base64" # Triggered from a message on a Cloud Pub/Sub topic. # The printed value will be visible in Cloud Logging # (https://cloud.google.com/functions/docs/monitoring/logging). FunctionsFramework.cloud_event "sm_events_function" do |event| message = event.data["message"] event_type = message["attributes"]["eventType"] secret_id = message["attributes"]["secretId"] message_data = Base64.decode64 message["data"] FunctionsFramework.logger.info "Received %s for %s. New metadata: %s." % [event_type, secret_id, message_data] end
모든 이벤트 유형 목록은 이벤트 유형을 참고하세요.
잘못 구성된 주제
Pub/Sub 주제가 생성 또는 업데이트 작업의 보안 비밀에 추가되었지만 구성 오류로 인해 Secret Manager에서 주제에 메시지를 게시할 수 없는 경우 게시 실패 이유를 나타내는 오류 메시지와 함께 작업이 실패합니다. 예를 들어 주제가 없거나 Secret Manager 서비스 계정에 게시 권한이 없는 경우 이러한 상황이 발생할 수 있습니다.
Pub/Sub 주제가 보안 비밀에 추가된 후 Secret Manager에서 더 이상 메시지를 게시할 수 없도록 주제가 변경되면(예: 주제가 삭제되었거나 Secret Manager 서비스 계정 권한이 삭제된 경우) Secret Manager는 게시에 실패한 이유를 나타내는 메시지를 포함하여 Secret Manager Secret
리소스에 로그를 작성합니다.
다음 단계
- Cloud 애셋 인벤토리로 보안 비밀을 분석하는 방법 알아보기