리전 보안 비밀 및 보안 비밀 버전 필터링

이 페이지에서는 Secret Manager에서 보안 비밀 및 보안 비밀 버전을 필터링하는 프로세스에 대해 설명합니다. 보안 비밀이 많은 환경에서 필터링 기능을 이용하면 전체 목록을 수동으로 스크롤하지 않아도 특정 보안 비밀 또는 버전을 빠르게 찾을 수 있습니다. 라벨, 생성 날짜 또는 보안 비밀 이름 내의 특정 패턴과 같은 기준에 따라 필터링하여 특정 보안 비밀 그룹을 집중적으로 관리할 수 있습니다.

Secret Manager에서는 Google Cloud 콘솔에서 필터 옵션을 사용하거나 API 호출 내에서 필터 기준을 지정하여 보안 비밀 및 보안 비밀 버전을 필터링할 수 있습니다. Google Cloud CLI에서 보안 비밀을 나열할 때 filter 문자열을 포함하여 보안 비밀 및 보안 비밀 버전을 필터링할 수 있습니다.

보안 비밀 필터링

보안 비밀을 필터링하려면 다음 방법 중 하나를 사용합니다.

콘솔

  1. Google Cloud 콘솔에서 Secret Manager 페이지로 이동합니다.

    Secret Manager로 이동

  2. Secret Manager 페이지에서 리전 보안 비밀 탭을 클릭합니다.

  3. 리전 보안 비밀 테이블에서 필터 필드를 클릭합니다.

  4. 필터 속성과 해당 값(예: Location:asia-east1)을 선택합니다.

    테이블이 입력된 값을 기준으로 자동으로 필터링됩니다. 결과가 이름에 따라 오름차순으로 정렬됩니다.

gcloud

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 보안 비밀의 Google Cloud 위치입니다.
  • FILTER: 필터 문자열입니다(예: name:asecret OR name:bsecret). 또한 gcloud CLI는 정규 표현식(예: name ~ "secret_ab.*")을 지원합니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud secrets list --location=LOCATION --filter="FILTER"

Windows(PowerShell)

gcloud secrets list --location=LOCATION --filter="FILTER"

Windows(cmd.exe)

gcloud secrets list --location=LOCATION --filter="FILTER"

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 보안 비밀의 Google Cloud 위치
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • FILTER: 필터 문자열입니다. 필터는 filter querystring 매개변수로 지정되며 URL로 인코딩되어야 합니다. 예를 들어 name:asecret OR name:bsecret 필터는 name%3Aasecret+OR+name%3Absecret으로 URL 인코딩됩니다. API에서는 정규 표현식이 지원되지 않습니다.

HTTP 메서드 및 URL:

GET https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER

JSON 요청 본문:

{}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?filter=FILTER" | Select-Object -Expand Content

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "secrets": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID",
      "createTime": "2024-09-02T07:14:00.281541Z",
      "etag": "\"16211dd90b37e7\""
    }
  ]
}

Go

이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Secret Manager Go SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

import (
	"context"
	"fmt"
	"io"

	secretmanager "cloud.google.com/go/secretmanager/apiv1"
	"cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)

// listSecretsWithFilter lists all filter-matching secrets in the given project.
func ListRegionalSecretsWithFilter(w io.Writer, projectId, locationId string, filter string) error {
	// parent := "projects/my-project/locations/my-location"
	// Follow https://cloud.google.com/secret-manager/docs/filtering
	// for filter syntax and examples.
	// filter := "name:name-substring"

	// Create the client.
	ctx := context.Background()
	//Endpoint to send the request to regional server
	endpoint := fmt.Sprintf("secretmanager.%s.rep.googleapis.com:443", locationId)
	client, err := secretmanager.NewClient(ctx, option.WithEndpoint(endpoint))

	if err != nil {
		return fmt.Errorf("failed to create regional secretmanager client: %w", err)
	}
	defer client.Close()

	parent := fmt.Sprintf("projects/%s/locations/%s", projectId, locationId)
	// Build the request.
	req := &secretmanagerpb.ListSecretsRequest{
		Parent: parent,
		Filter: filter,
	}

	// Call the API.
	it := client.ListSecrets(ctx, req)
	for {
		resp, err := it.Next()
		if err == iterator.Done {
			break
		}

		if err != nil {
			return fmt.Errorf("failed to list regional secrets: %w", err)
		}

		fmt.Fprintf(w, "Found regional secret %s\n", resp.Name)
	}

	return nil
}

Java

이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Secret Manager 자바 SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

import com.google.cloud.secretmanager.v1.ListSecretsRequest;
import com.google.cloud.secretmanager.v1.LocationName;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient.ListSecretsPage;
import com.google.cloud.secretmanager.v1.SecretManagerServiceClient.ListSecretsPagedResponse;
import com.google.cloud.secretmanager.v1.SecretManagerServiceSettings;
import java.io.IOException;

public class ListRegionalSecretsWithFilter {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.

    // Your GCP project ID.
    String projectId = "your-project-id";
    // Location of the secret.
    String locationId = "your-location-id";
    // Filter to be applied. 
    // See https://cloud.google.com/secret-manager/docs/filtering
    // for filter syntax and examples.
    String filter = "name:your-secret-substring AND expire_time<2022-01-01T00:00:00Z";
    listRegionalSecretsWithFilter(projectId, locationId, filter);
  }

  // List all secrets for a project
  public static ListSecretsPage listRegionalSecretsWithFilter(
      String projectId, String locationId, String filter) throws IOException {

    // Endpoint to call the regional secret manager sever
    String apiEndpoint = String.format("secretmanager.%s.rep.googleapis.com:443", locationId);
    SecretManagerServiceSettings secretManagerServiceSettings =
        SecretManagerServiceSettings.newBuilder().setEndpoint(apiEndpoint).build();

    // Initialize the client that will be used to send requests. This client only needs to be
    // created once, and can be reused for multiple requests.
    try (SecretManagerServiceClient client = 
        SecretManagerServiceClient.create(secretManagerServiceSettings)) {
      // Build the parent name.
      LocationName parent = LocationName.of(projectId, locationId);

      // Get filtered secrets.
      ListSecretsRequest request =
          ListSecretsRequest.newBuilder()
              .setParent(parent.toString())
              .setFilter(filter)
              .build();

      ListSecretsPagedResponse pagedResponse = client.listSecrets(request);

      // List all secrets.
      pagedResponse
          .iterateAll()
          .forEach(
              secret -> {
                System.out.printf("Regional secret %s\n", secret.getName());
              });

      return pagedResponse.getPage();
    }
  }
}

Python

이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Secret Manager Python SDK를 설치합니다. Compute Engine 또는 GKE에서는 cloud-platform 범위로 인증해야 합니다.

# Import the Secret Manager client library.
from google.cloud import secretmanager_v1


def list_regional_secrets_with_filter(
    project_id: str, location_id: str, filter_str: str
) -> None:
    """
    Lists all regional secrets in the given project.
    """

    # Endpoint to call the regional secret manager sever.
    api_endpoint = f"secretmanager.{location_id}.rep.googleapis.com"

    # Create the Secret Manager client.
    client = secretmanager_v1.SecretManagerServiceClient(
        client_options={"api_endpoint": api_endpoint},
    )

    # Build the resource name of the parent project.
    parent = f"projects/{project_id}/locations/{location_id}"

    # List all secrets.
    for secret in client.list_secrets(request={"parent": parent, "filter": filter_str}):
        print(f"Found secret: {secret.name}")

보안 비밀 버전 필터링

보안 비밀 버전을 필터링하려면 다음을 수행합니다.

  • Google Cloud 콘솔에서 버전에 액세스할 보안 비밀을 선택한 후 버전 테이블에서 필터 옵션을 사용합니다.

  • Google Cloud CLI 또는 Secret Manager API를 사용하는 경우 보안 비밀 버전을 나열할 때 filter 문자열을 포함합니다.

필터 예시

사용 사례 필터
이름에 mysecret 하위 문자열이 포함된 보안 비밀 name:mysecret
특정 라벨이 있는 보안 비밀 labels.environment=production
날짜/시간 범위 내에 생성된 보안 비밀 create_time<2021-01-01T06:00:00Z AND create_time>2021-01-01T12:00:00Z
자동 복제를 사용하는 보안 비밀 replication.automatic:*
사용자 관리 복제가 있지만 지정된 리전에 저장되지 않은 보안 비밀 replication.user_managed.replicas.location:* AND NOT replication.user_managed.replicas.location:(us-central1 OR us-east1)
CMEK 키로 암호화된 보안 비밀 replication.user_managed.replicas.customerManagedEncryption:*
특정 CMEK 키로 암호화된 보안 비밀 replication.user_managed.replicas.customerManagedEncryption.kmsKeyName=projects/p/locations/us-central1/keyRings/kr/cryptoKeys/my-cmek-key
순환 기간이 없는 보안 비밀 NOT rotation.next_rotation_time:*
순환 기간이 30일보다 긴 보안 비밀 rotation.rotation_period>259200s
만료 시간이 설정된 보안 비밀 expire_time:*
특정 날짜 이전에 만료되는 보안 비밀 expire_time<2021-07-31
사용 설정 또는 중지된 버전 state:(ENABLED OR DISABLED)
폐기된 버전(날짜 후 폐기) state:DESTROYED AND destroy_time>2021-01-01

필터 구문

필터 문법은 필터링되는 객체의 하나 이상의 필드에 대한 표현식으로 구성됩니다.

다음 표현식 연산자를 사용할 수 있습니다.

연산자 설명
= 같음
> 보다 큼
< 보다 작음
>= 크거나 같음
<= 작거나 같음
!=
-
NOT
같지 않음 다음은 동일합니다.
name!="topsecret"
-name="topsecret"
NOT name="topsecret"
:

격리. 대소문자를 구분하지 않는 하위 문자열 대조입니다.

예를 들어 name:"myapp"은 리소스 이름에 myapp(대소문자를 구분하지 않음)이 포함된 리소스를 필터링합니다.

AND

논리곱

공백은 AND와 동일하므로 다음은 동일합니다.
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR 논리합(OR)
*

와일드 카드

독립형으로 사용할 수 있습니다. 여기서 field:*field가 설정되었음을 나타냅니다.

Cloud Search API와 일치하는 OR 연산은 괄호를 이용해서 다른 순서를 명시적으로 정의하지 않는 한 AND 연산 이전에 평가됩니다.

time 값을 필터링할 때 시간을 RFC 3399 형식시간으로 문자열로 인코딩합니다(예: 2020-10-15T01:30:15Z).

하위 필드에 액세스하는 경우 점 구문을 사용합니다. 예를 들어 보안 비밀 리소스에는 해당 값이 키-값 maplabels 필드가 포함될 수 있습니다. color 라벨을 사용하는 경우 다음과 같이 하위 필드 labels.color에서 Secret 결과를 필터링할 수 있습니다.

labels.color=red

color 라벨이 설정된 보안 비밀만 나열하려면 와일드 카드를 사용합니다.

labels.color:*

따옴표 안의 문자열은 값 시퀀스가 아닌 단일 값으로 해석됩니다.

필터 필드

Secret 또는 SecretVersion 객체의 모든 필드를 필터링할 수 있습니다.

list 메서드 필터링 가능한 필드 링크
projects.secrets.list 보안 비밀 필드
projects.secrets.versions.list SecretVersion 필드

총 결과 수

목록 요청에 filter가 설정되면 응답에 총 결과 수(응답의 total_size=0)가 표시되지 않습니다.

다음 단계