אימות מאגרים מרוחקים למקורות במעלה הזרם

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

כדי להשלים את השלבים האלה, צריך מאגר מרוחק ב-Artifact Registry וחשבון עם המקור החיצוני. מידע נוסף על מאגרים מרוחקים זמין במאמר סקירה כללית על מאגרים מרוחקים.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להגדרת אימות למקורות במעלה הזרם עבור מאגרי נתונים מרוחקים, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

מקורות upstream מוגדרים מראש

כדי להגדיר אימות למקורות במעלה הזרם שהוגדרו מראש, צריך לעיין בהנחיות המתאימות לכל מקור במעלה הזרם שמופיעות בהמשך:

מקורות upstream שהוגדרו על ידי המשתמש

כדי להגדיר אימות למקורות במעלה הזרם שהוגדרו על ידי המשתמש, מבצעים את השלבים הבאים.

שמירת טוקן הגישה בסוד

  1. יוצרים אסימון גישה במאגר הפרטי.
  2. יוצרים סוד ב-Secret Manager.
  3. שומרים את אסימון הגישה האישי כגרסת סוד.

מעניקים לחשבון השירות של Artifact Registry גישה לסוד

סוכן השירות של Artifact Registry פועל בשם Artifact Registry כשהוא יוצר אינטראקציה עם Cloud de Confiance שירותים. כדי לאפשר לסוכן השירות להשתמש בסודות שמאוחסנים ב-Secret Manager, צריך לתת לסוכן השירות הרשאה לצפייה בגרסת הסוד.

המזהה של סוכן השירות הוא:

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

‫PROJECT-NUMBER הוא מספר הפרויקט של ה Cloud de Confiance פרויקט שבו פועל Artifact Registry.

כדי להקצות לסוכן השירות של Artifact Registry את התפקיד Secret Manager Secret Accessor:

המסוף

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

    כניסה לדף Secret Manager

  2. בדף Secret Manager, לוחצים על תיבת הסימון לצד שם הסוד.

  3. אם החלונית לא פתוחה, לוחצים על Show Info Panel כדי לפתוח אותה.

  4. בחלונית המידע, לוחצים על Add Principal.

  5. באזור הטקסט New principals, מזינים את כתובות האימייל של חברי הקבוצה שרוצים להוסיף.

  6. בתפריט הנפתח Select a role, בוחרים באפשרות Secret Manager ואז באפשרות Secret Manager Secret Accessor.

gcloud

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

כאשר member הוא חבר ב-IAM, כמו משתמש, קבוצה או חשבון שירות.

C#

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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


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:foo@example.com")
    {
        // 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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

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:foo@example.com"

	// 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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

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:foo@example.com";
    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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const name = 'projects/my-project/secrets/my-secret';
// const member = 'user:you@example.com';
//
// 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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

// 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:foo@example.com')
 */
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 = iterator_to_array($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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

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

כדי לבצע אימות ב-Artifact Registry, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

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

# 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:foo@example.com")

# 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

הערה: בניגוד לדוגמאות האחרות, הדוגמה הזו מחליפה את כל מדיניות ה-IAM.

$ 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\"}]}}"

מידע נוסף על מתן או ביטול גישה לסודות זמין במאמר בנושא ניהול הגישה לסודות.

הוספת פרטי כניסה של מאגר ראשי למאגר מרוחק

כדי לעדכן את המאגר המרוחק עם פרטי הכניסה של מקור ה-upstream:

המסוף

  1. פותחים את הדף Repositories במסוף Cloud de Confiance .

    פתיחת הדף Repositories

  2. ברשימת המאגרים, בוחרים את המאגר ולוחצים על עריכת המאגר.

  3. בקטע Remote repository authentication mode (מצב אימות של מאגר מרוחק), מעדכנים או מוסיפים את שם המשתמש של מקור הנתונים ואת הסוד שמכיל את אסימון הגישה.

‫CLI של gcloud

כדי לעדכן את המאגר המרוחק עם פרטי הכניסה של מקור ה-upstream, מריצים את הפקודה הבאה:

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

מחליפים את מה שכתוב בשדות הבאים:

  • ‫REPOSITORY: השם של המאגר המרוחק שלכם ב-Artifact Registry.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance .
  • ‫LOCATION: המיקום האזורי או במספר אזורים של המאגר. אפשר להשמיט את הדגל הזה אם מגדירים ברירת מחדל. כדי לראות רשימה של מיקומים נתמכים, מריצים את הפקודה gcloud artifacts locations list.
  • ‫USERNAME: שם המשתמש שלכם במקור הנתונים.
  • ‫SECRET_PROJECT_ID: מזהה הפרויקט שבו יצרתם את הסוד.
  • ‫SECRET_ID: השם שנתתם לסוד.
  • ‫SECRET_VERSION: גרסת הסוד שבה שמרתם את אסימון הגישה.

פרטי הכניסה שלכם ישמשו בפעם הבאה שהמאגר המרוחק ישלח בקשה לארטיפקט מהמקור במעלה הזרם.

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