Filtrer les secrets régionaux et les versions de secrets

Cette page explique comment filtrer les secrets et les versions de secrets dans Secret Manager. Dans les environnements comportant de nombreux secrets, le filtrage permet d'identifier rapidement des secrets ou des versions spécifiques sans avoir à faire défiler manuellement la liste entière. Vous pouvez filtrer en fonction de critères tels que des libellés, des dates de création ou des modèles spécifiques dans les noms de secrets, ce qui vous permet de gérer des groupes de secrets spécifiques.

Dans Secret Manager, vous pouvez filtrer les secrets et les versions de secrets à l'aide de l'option Filtrer dans la console Google Cloud ou en spécifiant des critères de filtrage dans un appel d'API. Dans la Google Cloud CLI, vous pouvez filtrer les secrets et les versions de secrets en incluant une chaîne filter lorsque vous listez des secrets.

Filtrer les secrets

Pour filtrer un secret, utilisez l'une des méthodes suivantes:

Console

  1. Accédez à la page Secret Manager dans la console Google Cloud.

    Accéder à Secret Manager

  2. Sur la page Secret Manager, cliquez sur l'onglet Secrets régionaux.

  3. Dans le tableau Secrets régionaux, cliquez dans le champ Filtrer.

  4. Choisissez une propriété de filtre et sa valeur correspondante, par exemple Location:asia-east1.

    Le tableau est automatiquement filtré en fonction des valeurs saisies. Les résultats sont triés par nom dans l'ordre croissant.

gcloud

Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :

  • LOCATION: emplacement Google Cloud du secret
  • FILTER: chaîne de filtre, par exemple name:asecret OR name:bsecret. Gcloud CLI accepte également les expressions régulières, par exemple name ~ "secret_ab.*".

Exécutez la commande suivante :

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

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • LOCATION: emplacement Google Cloud du secret
  • PROJECT_ID : ID de projet Google Cloud
  • FILTER: chaîne de filtre. Les filtres sont spécifiés en tant que paramètre de chaîne de requête filter et doivent être encodés en URL. Par exemple, le filtre name:asecret OR name:bsecret est encodé au format URL sous la forme name%3Aasecret+OR+name%3Absecret. Les expressions régulières ne sont pas acceptées dans l'API.

Méthode HTTP et URL :

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

Corps JSON de la requête :

{}

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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

Vous devriez recevoir une réponse JSON de ce type :

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

Go

Pour exécuter ce code, commencez par configurer un environnement de développement Go et installez le SDK Secret Manager pour Go. Sur Compute Engine ou GKE, vous devez vous authentifier avec le champ d'application 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

Pour exécuter ce code, commencez par configurer un environnement de développement Java et installez le SDK Secret Manager pour Java. Sur Compute Engine ou GKE, vous devez vous authentifier avec le champ d'application 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

Pour exécuter ce code, commencez par configurer un environnement de développement Python et installez le SDK Secret Manager pour Python. Sur Compute Engine ou GKE, vous devez vous authentifier avec le champ d'application 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}")

Filtrer une version de secret

Pour filtrer une version de secret, procédez comme suit:

  • Dans la console Google Cloud, sélectionnez un secret pour accéder à ses versions, puis utilisez l'option Filtrer dans le tableau Versions.

  • Si vous utilisez la Google Cloud CLI ou l'API Secret Manager, incluez une chaîne filter lorsque vous listez les versions de secret.

Exemples de filtres

Cas d'utilisation Filter
Les secrets dont le nom contient la sous-chaîne mysecret name:mysecret
Secrets avec un libellé spécifique labels.environment=production
Secrets créés dans la plage de dates/heures create_time<2021-01-01T06:00:00Z AND create_time>2021-01-01T12:00:00Z
Secrets avec réplication automatique replication.automatic:*
Secrets avec réplication gérée par l'utilisateur, mais non stockés dans l'une des régions données replication.user_managed.replicas.location:* AND NOT replication.user_managed.replicas.location:(us-central1 OR us-east1)
Secrets chiffrés avec des clés CMEK replication.user_managed.replicas.customerManagedEncryption:*
Secrets chiffrés avec une clé CMEK spécifique replication.user_managed.replicas.customerManagedEncryption.kmsKeyName=projects/p/locations/us-central1/keyRings/kr/cryptoKeys/my-cmek-key
Secrets sans période de rotation NOT rotation.next_rotation_time:*
Secrets avec une période de rotation supérieure à 30 jours rotation.rotation_period>259200s
Secrets avec délai d'expiration défini expire_time:*
Les secrets expirent avant une date expire_time<2021-07-31
Versions activées ou désactivées state:(ENABLED OR DISABLED)
Versions détruites, détruites après la date state:DESTROYED AND destroy_time>2021-01-01

Syntaxe des filtres

La syntaxe de filtrage consiste en une expression portant sur un ou plusieurs champs des objets filtrés.

Cette expression accepte les opérateurs suivants.

Opérateur Description
= Égal à
> Supérieur à
< Inférieur à
>= Supérieur ou égal à
<= Inférieur ou égal à
!=
-
NOT
Différent de Les expressions suivantes sont équivalentes :
name!="topsecret"
-name="topsecret"
NOT name="topsecret"
:

Inclusion. Il s'agit d'une correspondance de sous-chaîne insensible à la casse.

Par exemple, name:"myapp" filtre les ressources dont le nom contient myapp (non sensible à la casse).

AND

Logical AND (Opérateur logique ET)

Un espace équivaut à AND, ce qui signifie que ce qui est équivalent :
name:"myapp" AND name:"secret1"
name:"myapp" name:"secret1"

OR Opérateur logique OU
*

Caractère générique

Peut être utilisé en tant qu'élément autonome, où field:* indique que field est défini.

Conformément à l'API Cloud Search, les opérations OR sont évaluées avant les opérations AND, sauf si des parenthèses sont utilisées pour définir explicitement un ordre différent.

Lors du filtrage sur les valeurs time, encodez l'heure sous la forme de chaîne au format RFC 3399, par exemple 2020-10-15T01:30:15Z.

Pour accéder à un sous-champ, utilisez la syntaxe à points. Par exemple, la ressource Secret peut inclure le champ labels dont la valeur est une clé-valeur map. Si un libellé color est utilisé, vous pouvez filtrer les résultats de Secret sur le sous-champ labels.color comme suit:

labels.color=red

Si vous souhaitez ne répertorier que les secrets associés à l'ensemble de libellés color, utilisez un caractère générique :

labels.color:*

Une chaîne entre guillemets est interprétée comme une valeur unique plutôt que comme une séquence de valeurs.

Filtrer les champs

Vous pouvez filtrer sur n'importe quel champ de l'objet Secret ou SecretVersion.

Méthode list Lien vers les champs filtrables
projects.secrets.list Champs secrets
projects.secrets.versions.list Champs SecretVersion

Nombre total de résultats

Si filter est défini dans une requête de liste, la réponse n'indique pas le nombre total de résultats (total_size=0 dans la réponse).

Étape suivante