סינון סודות אזוריים וגרסאות של סודות

בדף הזה מוסבר איך מסננים סודות וגרסאות של סודות ב-Secret Manager. בסביבות עם סודות רבים, סינון עוזר לזהות במהירות סודות או גרסאות ספציפיים בלי לגלול ידנית בכל הרשימה. אפשר לסנן לפי קריטריונים כמו תוויות, תאריכי יצירה או דפוסים ספציפיים בשמות של סודות, וכך לנהל בצורה ממוקדת קבוצות ספציפיות של סודות.

ב-Secret Manager, אפשר לסנן סודות וגרסאות של סודות באמצעות האפשרות Filter במסוף Cloud de Confiance או על ידי ציון קריטריוני סינון בקריאה ל-API. ב-Google Cloud CLI, אפשר לסנן סודות וגרסאות של סודות על ידי הוספת מחרוזת filter כשמציגים את רשימת הסודות.

סינון סודות

כדי לסנן סוד, משתמשים באחת מהשיטות הבאות:

המסוף

  1. נכנסים לדף Secret Manager במסוף Cloud de Confiance .

    מעבר אל Secret Manager

  2. בדף Secret Manager (ניהול סודות), לוחצים על הכרטיסייה Regional secrets (סודות אזוריים).

  3. בטבלה Regional secrets (סודות אזוריים), לוחצים על השדה Filter (מסנן).

  4. בוחרים מאפיין של מסנן ואת הערך המתאים לו, לדוגמה Location:asia-east1.

    הטבלה מסוננת אוטומטית על סמך הערכים שהוזנו. התוצאות ממוינות לפי שם בסדר עולה.

gcloud

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • LOCATION: Cloud de Confiance by S3NS המיקום של הסוד.
  • FILTER: מחרוזת המסנן, לדוגמה name:asecret OR name:bsecret. ב-CLI של gcloud יש גם תמיכה בביטויים רגולריים, למשל 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: Cloud de Confiance by S3NS המיקום של הסוד.
  • PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .
  • FILTER: מחרוזת המסנן. המסננים מוגדרים כפרמטר של מחרוזת השאילתה filter וחייבים להיות מקודדים בכתובת ה-URL. לדוגמה, המסנן name:asecret OR name:bsecret יקודד לכתובת URL כ-name%3Aasecret+OR+name%3Absecret. אין תמיכה בביטויים רגולריים ב-API.

ה-method של ה-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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של 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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח ב-Java ולהתקין את Secret Manager Java 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

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת 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}")

סינון גרסה של סוד

כדי לסנן גרסה של סוד:

  • במסוף Cloud de Confiance , בוחרים סוד כדי לגשת לגרסאות שלו, ואז משתמשים באפשרות Filter בטבלה Versions.

  • אם אתם משתמשים ב-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-01T01: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 לוגית.

מרחב שווה ערך ל-AND, ולכן הדוגמאות הבאות שוות ערך:
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR או לוגי.
*

תו כללי לחיפוש.

אפשר להשתמש בו כערך עצמאי, כאשר field:* מציין שfield מוגדר.

בדומה ל-Cloud Search API, פעולות OR מוערכות לפני פעולות AND, אלא אם משתמשים בסוגריים כדי להגדיר במפורש סדר שונה.

כשמסננים לפי ערכים של time, צריך לקודד את השעה כמחרוזת בפורמט RFC 3399, כמו 2020-10-15T01:30:15Z.

כשניגשים לשדה משנה, משתמשים בתחביר נקודה. לדוגמה, משאב Secret עשוי לכלול את השדה labels שהערך שלו הוא צמד מפתח/ערך map. אם משתמשים בתווית color, אפשר לסנן את התוצאות Secret בשדה המשנה labels.color באופן הבא:

labels.color=red

אם רוצים להציג רק סודות עם התווית color, משתמשים בתו כללי:

labels.color:*

מחרוזת שתחומה במירכאות מתפרשת כערך יחיד ולא כרצף של ערכים.

שדות מסנן

אפשר לסנן לפי כל שדה של אובייקט Secret או SecretVersion.

שיטת הרשימה קישור לשדות שאפשר לסנן
projects.secrets.list שדות סודיים
projects.secrets.versions.list שדות SecretVersion

מספר התוצאות הכולל

אם הערך filter מוגדר בבקשת רשימה, בתגובה לא מצוין המספר הכולל של התוצאות (total_size=0 בתגובה).

המאמרים הבאים