Authentifizierung für Remote-Repository-Upstreams konfigurieren

In diesem Dokument wird die Authentifizierung bei vorgelagerten Quellen für Ihre Artifact Registry-Remote-Repositories beschrieben.

In diesem Dokument wird davon ausgegangen, dass Sie bereits ein Remote-Repository für Artifact Registry erstellt und ein Konto bei der externen Quelle haben.

Weitere Informationen zu Remote-Repositories finden Sie in der Übersicht zu Remote-Repositories.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zu gewähren, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren der Authentifizierung bei Upstream-Quellen für Remote-Repositories benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

Möglicherweise können Sie die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Voreingestellte Upstream-Quellen

Informationen zum Konfigurieren der Authentifizierung für voreingestellte Upstream-Quellen finden Sie in der entsprechenden Anleitung für jeden Upstream, der folgendermaßen aussieht:

Benutzerdefinierte Upstream-Quellen

Führen Sie die folgenden Schritte aus, um die Authentifizierung für benutzerdefinierte Upstream-Quellen zu konfigurieren.

Zugriffstoken in einem Secret speichern

  1. Erstellen Sie ein Zugriffstoken in der privaten Registry.
  2. Erstellen Sie ein Secret in Secret Manager.
  3. Speichern Sie Ihr persönliches Zugriffstoken als Secret-Version.

Dem Artifact Registry-Dienstkonto Zugriff auf Ihr Secret gewähren

Der Artifact Registry-Dienst-Agent ist ein von Google verwaltetes Dienstkonto, das im Auftrag von Artifact Registry agiert, wenn es mit Google Cloud-Diensten interagiert. Damit der Dienst-Agent Secrets verwenden kann, die in Secret Manager gespeichert sind, müssen Sie dem Dienst-Agent die Berechtigung zum Ansehen Ihrer Secret-Version erteilen.

Die Dienst-Agent-ID lautet:

service-PROJECT-NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

PROJECT-NUMBER ist die Projektnummer des Google Cloud-Projekts, in dem Artifact Registry ausgeführt wird.

So gewähren Sie dem Artifact Registry-Dienst-Agent die Rolle Zugriffsfunktion für Secret Manager-Secret:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Secret Manager auf.

    Zur Seite „Secret Manager“

  2. Klicken Sie auf der Seite Secret Manager auf das Kästchen neben dem Namen des Secrets.

  3. Falls das Fenster noch nicht geöffnet ist, klicken Sie auf Infofeld ansehen, um es zu öffnen.

  4. Klicken Sie im Infofeld auf Hauptkonto hinzufügen.

  5. Geben Sie im Textbereich Neue Hauptkonten die E-Mail-Adressen der Mitglieder ein, die Sie hinzufügen möchten.

  6. Wählen Sie im Drop-down-Menü Rolle auswählen die Option Secret Manager und dann Zugriffsfunktion für Secret Manager-Secret aus.

gcloud

$ gcloud secrets add-iam-policy-binding secret-id \
    --member="member" \
    --role="roles/secretmanager.secretAccessor"

Dabei ist member ein IAM-Mitglied, z. B. ein Nutzer, eine Gruppe oder ein Dienstkonto.

C#

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


using Google.Cloud.SecretManager.V1;
using Google.Cloud.Iam.V1;

public class IamGrantAccessSample
{
    public Policy IamGrantAccess(
      string projectId = "my-project", string secretId = "my-secret",
      string member = "user:[email protected]")
    {
        // Create the client.
        SecretManagerServiceClient client = SecretManagerServiceClient.Create();

        // Build the resource name.
        SecretName secretName = new SecretName(projectId, secretId);

        // Get current policy.
        Policy policy = client.GetIamPolicy(new GetIamPolicyRequest
        {
            ResourceAsResourceName = secretName,
        });

        // Add the user to the list of bindings.
        policy.AddRoleMember("roles/secretmanager.secretAccessor", member);

        // Save the updated policy.
        policy = client.SetIamPolicy(new SetIamPolicyRequest
        {
            ResourceAsResourceName = secretName,
            Policy = policy,
        });
        return policy;
    }
}

Go

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import (
	"context"
	"fmt"
	"io"

	secretmanager "cloud.google.com/go/secretmanager/apiv1"
)

// iamGrantAccess grants the given member access to the secret.
func iamGrantAccess(w io.Writer, name, member string) error {
	// name := "projects/my-project/secrets/my-secret"
	// member := "user:[email protected]"

	// Create the client.
	ctx := context.Background()
	client, err := secretmanager.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("failed to create secretmanager client: %w", err)
	}
	defer client.Close()

	// Get the current IAM policy.
	handle := client.IAM(name)
	policy, err := handle.Policy(ctx)
	if err != nil {
		return fmt.Errorf("failed to get policy: %w", err)
	}

	// Grant the member access permissions.
	policy.Add(member, "roles/secretmanager.secretAccessor")
	if err = handle.SetPolicy(ctx, policy); err != nil {
		return fmt.Errorf("failed to save policy: %w", err)
	}

	fmt.Fprintf(w, "Updated IAM policy for %s\n", name)
	return nil
}

Java

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

import com.google.cloud.secretmanager.v1.SecretManagerServiceClient;
import com.google.cloud.secretmanager.v1.SecretName;
import com.google.iam.v1.Binding;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

public class IamGrantAccess {

  public static void iamGrantAccess() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String secretId = "your-secret-id";
    String member = "user:[email protected]";
    iamGrantAccess(projectId, secretId, member);
  }

  // Grant a member access to a particular secret.
  public static void iamGrantAccess(String projectId, String secretId, String member)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) {
      // Build the name from the version.
      SecretName secretName = SecretName.of(projectId, secretId);

      // Request the current IAM policy.
      Policy currentPolicy =
          client.getIamPolicy(
              GetIamPolicyRequest.newBuilder().setResource(secretName.toString()).build());

      // Build the new binding.
      Binding binding =
          Binding.newBuilder()
              .setRole("roles/secretmanager.secretAccessor")
              .addMembers(member)
              .build();

      // Create a new IAM policy from the current policy, adding the binding.
      Policy newPolicy = Policy.newBuilder().mergeFrom(currentPolicy).addBindings(binding).build();

      // Save the updated IAM policy.
      client.setIamPolicy(
          SetIamPolicyRequest.newBuilder()
              .setResource(secretName.toString())
              .setPolicy(newPolicy)
              .build());

      System.out.printf("Updated IAM policy for %s\n", secretId);
    }
  }
}

Node.js

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const name = 'projects/my-project/secrets/my-secret';
// const member = 'user:[email protected]';
//
// NOTE: Each member must be prefixed with its type. See the IAM documentation
// for more information: https://cloud.google.com/iam/docs/overview.

// Imports the Secret Manager library
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');

// Instantiates a client
const client = new SecretManagerServiceClient();

async function grantAccess() {
  // Get the current IAM policy.
  const [policy] = await client.getIamPolicy({
    resource: name,
  });

  // Add the user with accessor permissions to the bindings list.
  policy.bindings.push({
    role: 'roles/secretmanager.secretAccessor',
    members: [member],
  });

  // Save the updated IAM policy.
  await client.setIamPolicy({
    resource: name,
    policy: policy,
  });

  console.log(`Updated IAM policy for ${name}`);
}

grantAccess();

PHP

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

// Import the Secret Manager client library.
use Google\Cloud\SecretManager\V1\Client\SecretManagerServiceClient;

// Import the Secret Manager IAM library.
use Google\Cloud\Iam\V1\Binding;
use Google\Cloud\Iam\V1\GetIamPolicyRequest;
use Google\Cloud\Iam\V1\SetIamPolicyRequest;

/**
 * @param string $projectId Your Google Cloud Project ID (e.g. 'my-project')
 * @param string $secretId  Your secret ID (e.g. 'my-secret')
 * @param string $member Your member (e.g. 'user:[email protected]')
 */
function iam_grant_access(string $projectId, string $secretId, string $member): void
{
    // Create the Secret Manager client.
    $client = new SecretManagerServiceClient();

    // Build the resource name of the secret.
    $name = $client->secretName($projectId, $secretId);

    // Get the current IAM policy.
    $policy = $client->getIamPolicy((new GetIamPolicyRequest)->setResource($name));

    // Update the bindings to include the new member.
    $bindings = $policy->getBindings();
    $bindings[] = new Binding([
        'members' => [$member],
        'role' => 'roles/secretmanager.secretAccessor',
    ]);
    $policy->setBindings($bindings);

    // Build the request.
    $request = (new SetIamPolicyRequest)
        ->setResource($name)
        ->setPolicy($policy);

    // Save the updated policy to the server.
    $client->setIamPolicy($request);

    // Print out a success message.
    printf('Updated IAM policy for %s', $secretId);
}

Python

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

def iam_grant_access(
    project_id: str, secret_id: str, member: str
) -> iam_policy_pb2.SetIamPolicyRequest:
    """
    Grant the given member access to a secret.
    """

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

    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret.
    name = client.secret_path(project_id, secret_id)

    # Get the current IAM policy.
    policy = client.get_iam_policy(request={"resource": name})

    # Add the given member with access permissions.
    policy.bindings.add(role="roles/secretmanager.secretAccessor", members=[member])

    # Update the IAM Policy.
    new_policy = client.set_iam_policy(request={"resource": name, "policy": policy})

    # Print data about the secret.
    print(f"Updated IAM policy on {secret_id}")

Ruby

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Artifact Registry zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

# project_id = "YOUR-GOOGLE-CLOUD-PROJECT"  # (e.g. "my-project")
# secret_id  = "YOUR-SECRET-ID"             # (e.g. "my-secret")
# member     = "USER-OR-ACCOUNT"            # (e.g. "user:[email protected]")

# Require the Secret Manager client library.
require "google/cloud/secret_manager"

# Create a Secret Manager client.
client = Google::Cloud::SecretManager.secret_manager_service

# Build the resource name of the secret.
name = client.secret_path project: project_id, secret: secret_id

# Get the current IAM policy.
policy = client.get_iam_policy resource: name

# Add new member to current bindings
policy.bindings << Google::Iam::V1::Binding.new(
  members: [member],
  role:    "roles/secretmanager.secretAccessor"
)

# Update IAM policy
new_policy = client.set_iam_policy resource: name, policy: policy

# Print a success message.
puts "Updated IAM policy for #{secret_id}"

API

Hinweis: Im Gegensatz zu den anderen Beispielen wird dadurch die gesamte IAM-Richtlinie ersetzt.

$ curl "https://secretmanager.googleapis.com/v1/projects/project-id/secrets/secret-id:setIamPolicy" \
    --request "POST" \
    --header "authorization: Bearer $(gcloud auth print-access-token)" \
    --header "content-type: application/json" \
    --data "{\"policy\": {\"bindings\": [{\"members\": [\"member\"], \"role\": \"roles/secretmanager.secretAccessor\"}]}}"

Weitere Informationen zum Gewähren oder Entziehen des Zugriffs auf Secrets finden Sie unter Zugriff auf Secrets verwalten.

Dem Remote-Repository Upstream-Anmeldedaten hinzufügen

So aktualisieren Sie Ihr Remote-Repository mit den Anmeldedaten Ihrer Upstream-Quelle:

Console

  1. Öffnen Sie in der Cloud Console die Seite Repositories.

    Zur Seite „Repositories“

  2. Wählen Sie in der Repository-Liste das Repository aus und klicken Sie auf Repository bearbeiten.

  3. Aktualisieren Sie im Abschnitt Authentifizierungsmodus für Remote-Repository den Nutzernamen Ihrer Upstream-Quelle und das Secret mit Ihrem Zugriffstoken oder fügen Sie sie hinzu.

gcloud-CLI

Führen Sie den folgenden Befehl aus, um Ihr Remote-Repository mit den Anmeldedaten Ihrer Upstream-Quelle zu aktualisieren:

gcloud artifacts repositories update REPOSITORY \
    --project=PROJECT_ID \
    --location=LOCATION \
    --remote-username=USERNAME \
    --remote-password-secret-version=projects/SECRET_PROJECT_ID/secrets/SECRET_ID/versions/SECRET_VERSION

Ersetzen Sie Folgendes:

  • REPOSITORY durch den Namen Ihres Artifact Registry-Remote-Repositorys.
  • PROJECT_ID durch Ihre Google Cloud-Projekt-ID.
  • LOCATION durch den regionalen oder multiregionalen Standort des Repositorys. Sie können dieses Flag weglassen, wenn Sie einen Standard-Speicherort festgelegt haben. Führen Sie den Befehl gcloud artifacts locations list aus, um eine Liste der unterstützten Standorte aufzurufen.
  • USERNAME durch den Nutzernamen Ihrer Upstream-Quelle.
  • SECRET_PROJECT_ID durch die Projekt-ID des Projekts, in dem Sie das Secret erstellt haben.
  • SECRET_ID durch den Namen, den Sie Ihrem Secret gegeben haben.
  • SECRET_VERSION durch die Secret-Version, in der Sie Ihr Zugriffstoken gespeichert haben.

Ihre Anmeldedaten werden verwendet, wenn das Remote-Repository das nächste Mal eine Anfrage für ein Artefakt von der Upstream-Quelle sendet.

Nächste Schritte