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

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

לפני שמתחילים

מוודאים שהדרישות הבאות מתקיימות:

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

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

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

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

יצירת אסימון גישה אישי ל-Docker Hub

  1. נכנסים אל Docker Hub.
  2. יוצרים טוקן גישה אישי עם הרשאות לקריאה בלבד.
  3. מעתיקים את טוקן הגישה.

  4. שומרים את אסימון הגישה בקובץ טקסט ב-Cloud Shell או באופן מקומי.

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

  1. יוצרים סוד ב-Secret Manager.
  2. שומרים את טוקן הגישה האישי של Docker Hub בתור גרסת סוד.

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

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

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

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

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

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

המסוף

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

    כניסה לדף 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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.


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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

/**
 * 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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

// 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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

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. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

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

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

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

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

המסוף

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

    פתיחת הדף Repositories

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

  3. בקטע אימות מאגר מרוחק, מעדכנים או מוסיפים את שם המשתמש ב-Docker Hub ואת גרסת הסוד שמכילה את אסימון הגישה ל-Docker Hub.

‫CLI של gcloud

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

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: מזהה הפרויקט ב- Google Cloud .
  • ‫LOCATION: המיקום של המאגר, באזור אחד או בכמה אזורים. אם הגדרתם ברירת מחדל, אתם יכולים להשמיט את הדגל הזה. כדי לראות רשימה של מיקומים נתמכים, מריצים את הפקודה gcloud artifacts locations list.
  • ‫USERNAME: שם המשתמש שלכם ב-Docker Hub.
  • ‫SECRET_PROJECT_ID: מזהה הפרויקט ב-Google Cloud שבו יצרתם את הסוד.
  • ‫SECRET_ID: השם שנתתם לסוד.
  • ‫SECRET_VERSION: גרסת הסוד שבה שמרתם את טוקן הגישה ל-Docker Hub.

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

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