Filtrare i secret regionali e le versioni dei secret

Questa pagina spiega la procedura per filtrare i secret e le versioni dei secret in Secret Manager. In ambienti con numerosi secret, il filtro consente di identificare rapidamente secret o versioni specifici senza scorrere manualmente l'intero elenco. Puoi filtrare in base a criteri come etichette, date di creazione o pattern specifici all'interno dei nomi dei secret, consentendo una gestione mirata di gruppi specifici di secret.

In Secret Manager, puoi filtrare i secret e le relative versioni utilizzando l'opzione Filtra nella console Google Cloud o specificando i criteri di filtro all'interno di una chiamata API. In Google Cloud CLI, puoi filtrare i secret e le versioni dei secret includendo una stringa filter quando elenchi i secret.

Filtrare i secret

Per filtrare un segreto, utilizza uno dei seguenti metodi:

Console

  1. Vai alla pagina Secret Manager nella console Google Cloud.

    Vai a Secret Manager

  2. Nella pagina Secret Manager, fai clic sulla scheda Secret regionali.

  3. Nella tabella Segreti regionali, fai clic nel campo Filtro.

  4. Scegli una proprietà filtro e il relativo valore, ad esempio Location:asia-east1.

    La tabella viene filtrata automaticamente in base ai valori inseriti. I risultati sono ordinati per nome in ordine crescente.

gcloud

Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

  • LOCATION: la località di Google Cloud del segreto
  • FILTER: la stringa del filtro, ad esempio name:asecret OR name:bsecret. Gcloud CLI supporta anche le espressioni regolari, ad esempio name ~ "secret_ab.*".

Esegui il seguente comando:

Linux, macOS o 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

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • LOCATION: la località di Google Cloud del segreto
  • PROJECT_ID: l'ID progetto Google Cloud
  • FILTER: la stringa del filtro. I filtri vengono specificati come parametro filter della stringa di query e devono essere con codifica URL. Ad esempio, il filtro name:asecret OR name:bsecret verrebbe codificato nell'URL come name%3Aasecret+OR+name%3Absecret. Le espressioni regolari non sono supportate nell'API.

Metodo HTTP e URL:

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

Corpo JSON della richiesta:

{}

Per inviare la richiesta, scegli una delle seguenti opzioni:

curl

Salva il corpo della richiesta in un file denominato request.json, quindi esegui il comando seguente:

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

Salva il corpo della richiesta in un file denominato request.json, quindi esegui il comando seguente:

$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

Dovresti ricevere una risposta JSON simile alla seguente:

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

Go

Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Go e installare l'SDK Go di Secret Manager. Su Compute Engine o GKE, devi autenticarti con l'ambito 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

Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Java e installare l'SDK Java di Secret Manager. Su Compute Engine o GKE, devi autenticarti con l'ambito 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

Per eseguire questo codice, devi innanzitutto configurare un ambiente di sviluppo Python e installare l'SDK Python di Secret Manager. Su Compute Engine o GKE, devi autenticarti con l'ambito 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}")

Filtrare una versione del secret

Per filtrare una versione del secret:

  • Nella console Google Cloud, seleziona un segreto per accedere alle relative versioni, quindi utilizza l'opzione Filtra nella tabella Versioni.

  • Se utilizzi Google Cloud CLI o l'API Secret Manager, includi una stringa filter quando elenchi le versioni dei secret.

Esempi di filtri

Caso d'uso Filtro
Secret il cui nome contiene la sottostringa mysecret name:mysecret
Secret con un'etichetta specifica labels.environment=production
Secret creati nell'intervallo di date/ore create_time<2021-01-01T06:00:00Z AND create_time>2021-01-01T12:00:00Z
Secret con replica automatica replication.automatic:*
Secret con replica gestita dall'utente, ma non archiviati in nessuna delle regioni specificate replication.user_managed.replicas.location:* AND NOT replication.user_managed.replicas.location:(us-central1 OR us-east1)
Secret criptati con chiavi CMEK replication.user_managed.replicas.customerManagedEncryption:*
Secret criptati con una chiave CMEK specifica replication.user_managed.replicas.customerManagedEncryption.kmsKeyName=projects/p/locations/us-central1/keyRings/kr/cryptoKeys/my-cmek-key
Secret senza un periodo di rotazione NOT rotation.next_rotation_time:*
Secret con un periodo di rotazione > 30 giorni rotation.rotation_period>259200s
Secret con scadenza impostata expire_time:*
Segreti che scadono prima di una data expire_time<2021-07-31
Versioni attivate o disattivate state:(ENABLED OR DISABLED)
Versioni eliminate, eliminate dopo la data state:DESTROYED AND destroy_time>2021-01-01

Sintassi filtro

La sintassi del filtro è costituita da un'espressione su uno o più campi degli oggetti sottoposti a filtri.

Puoi utilizzare i seguenti operatori di espressione.

Operatore Descrizione
= Uguaglianza.
> Maggiore di.
< Minore di.
>= Maggiore o uguale a.
<= Minore o uguale a.
!=
-
NOT
Diseguaglianza. I seguenti valori sono equivalenti:
name!="topsecret"
-name="topsecret"
NOT name="topsecret"
:

Contenimento. Si tratta di una corrispondenza di sottostringa senza distinzione tra maiuscole e minuscole.

Ad esempio, name:"myapp" filtra le risorse che contengono myapp (senza distinzione tra maiuscole e minuscole) nel nome della risorsa.

AND

Operatore AND logico.

Uno spazio è equivalente a AND, quindi i seguenti elementi sono equivalenti:
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR OR logico.
*

Carattere jolly.

Può essere utilizzato come autonomo se field:* indica che è impostato field.

In linea con l'API Cloud Search, le operazioni OR vengono valutate prima delle operazioni AND, a meno che non vengano utilizzate le parentesi per definire esplicitamente un ordine diverso.

Quando filtri in base ai valori time, codifica l'ora come stringa nel formato RFC 3399, ad esempio 2020-10-15T01:30:15Z.

Quando accedi a un sottocampo, utilizza la sintassi dei punti. Ad esempio, la risorsa Secret può includere il campo labels il cui valore è una coppia chiave-valore map. Se viene utilizzata un'etichetta color, puoi filtrare i risultati Secret nel sottocampo labels.color come segue:

labels.color=red

Se vuoi elencare solo i secret con l'etichetta color impostata, utilizza un carattere jolly:

labels.color:*

Una stringa tra virgolette viene interpretata come un singolo valore anziché come una sequenza di valori.

Campi filtro

Puoi filtrare in base a qualsiasi campo dell'oggetto Secret o SecretVersion.

Metodo di elenco Link ai campi filtrabili
projects.secrets.list Campi segreti
projects.secrets.versions.list Campi SecretVersion

Conteggio dei risultati totali

Se filter è impostato in una richiesta di elenco, la risposta non indica il numero totale di risultati (total_size=0 nella risposta).

Passaggi successivi