שימוש בהרשאות IAM

סקירה כללית

במאמר הזה נסביר איך לשלוט בגישה לקטגוריות ולאובייקטים באמצעות הרשאות לניהול זהויות והרשאות גישה (IAM). IAM מאפשר לקבוע למי תהיה גישה לקטגוריות ולאובייקטים שלכם.

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

השימוש ב-IAM עם קטגוריות

החלקים הבאים מסבירים איך לבצע משימות בסיסיות של IAM על קטגוריות.

הוספת חשבון משתמש למדיניות ברמת הקטגוריה

לרשימת התפקידים שמשויכים ל-Cloud Storage, ראו את המאמר תפקידים ב-IAM. למידע על הישויות שעבורן מעניקים תפקידי IAM, ראו את המאמר מזהים של חשבונות משתמשים.

מסוף

  1. במסוף Google Cloud, נכנסים לדף Buckets ב-Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על שם הקטגוריה שבה רוצים להעניק תפקיד לחשבון המשתמש.

  3. לוחצים על הכרטיסייה Permissions בחלק העליון של הדף.

  4. לוחצים על Grant access.

    מופיעה תיבת הדו-שיח Add principals.

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

  6. בוחרים תפקיד (או תפקידים) בתפריט הנפתח Select a role. התפקידים שבחרתם יופיעו בחלונית עם תיאור קצר של ההרשאות שהם מעניקים.

  7. לוחצים על Save.

למידע מפורט על שגיאות בקשר לפעולות Cloud Storage שנכשלו במסוף Google Cloud, ראו את המאמר פתרון בעיות.

שורת הפקודה

gcloud

משתמשים בפקודה buckets add-iam-policy-binding:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=PRINCIPAL_IDENTIFIER --role=IAM_ROLE

כאשר:

  • BUCKET_NAME - שם הקטגוריה שאליה מעניקים גישה לחשבון המשתמש. לדוגמה, my-bucket.
  • PRINCIPAL_IDENTIFIER - מזהה למי אתם מעניקים גישה לקטגוריה. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  • IAM_ROLE - תפקיד ה-IAM שמעניקים לחשבון המשתמש. לדוגמה, roles/storage.objectViewer.

‏gsutil

משתמשים בפקודה gsutil iam ch:

gsutil iam ch PRINCIPAL_IDENTIFIER:IAM_ROLE gs://BUCKET_NAME

כאשר:

  • PRINCIPAL_IDENTIFIER - מזהה למי אתם מעניקים גישה לקטגוריה. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  • IAM_ROLE - תפקיד ה-IAM שמעניקים לחשבון המשתמש. לדוגמה, roles/storage.objectViewer.
  • BUCKET_NAME - שם הקטגוריה שאליה מעניקים גישה לחשבון המשתמש. לדוגמה, my-bucket.

דוגמאות נוספות לפורמט של PRINCIPAL_IDENTIFIER:IAM_ROLE זמינות בדף העזר של gsutil iam ch.

ספריות לקוח

C++

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C++ API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& member) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));

  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  for (auto& binding : policy->bindings()) {
    if (binding.role() != role || binding.has_condition()) {
      continue;
    }
    auto& members = binding.members();
    if (std::find(members.begin(), members.end(), member) == members.end()) {
      members.emplace_back(member);
    }
  }

  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::move(updated).status();

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";
}

C#

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C# API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class AddBucketIamMemberSample
{
    public Policy AddBucketIamMember(
        string bucketName = "your-unique-bucket-name",
        string role = "roles/storage.objectViewer",
        string member = "serviceAccount:dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });
        // Set the policy schema version. For more information, please refer to https://cloud.google.com/iam/docs/policies#versions.
        policy.Version = 3;

        Policy.BindingsData bindingToAdd = new Policy.BindingsData
        {
            Role = role,
            Members = new List<string> { member }
        };

        policy.Bindings.Add(bindingToAdd);
        var bucketIamPolicy = storage.SetBucketIamPolicy(bucketName, policy);
        Console.WriteLine($"Added {member} with role {role} " + $"to {bucketName}");
        return bucketIamPolicy;
    }
}

Go

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Go API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/iam"
	"cloud.google.com/go/storage"
)

// addBucketIAMMember adds the bucket IAM member to permission role.
func addBucketIAMMember(w io.Writer, bucketName string) error {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()

	bucket := client.Bucket(bucketName)
	policy, err := bucket.IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("Bucket(%q).IAM().Policy: %w", bucketName, err)
	}
	// Other valid prefixes are "serviceAccount:", "user:"
	// See the documentation for more values.
	// https://cloud.google.com/storage/docs/access-control/iam
	identity := "group:cloud-logs@google.com"
	var role iam.RoleName = "roles/storage.objectViewer"

	policy.Add(identity, role)
	if err := bucket.IAM().SetPolicy(ctx, policy); err != nil {
		return fmt.Errorf("Bucket(%q).IAM().SetPolicy: %w", bucketName, err)
	}
	// NOTE: It may be necessary to retry this operation if IAM policies are
	// being modified concurrently. SetPolicy will return an error if the policy
	// was modified since it was retrieved.
	fmt.Fprintf(w, "Added %v with role %v to %v\n", identity, role, bucketName)
	return nil
}

Java

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Java API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.Binding;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class AddBucketIamMember {
  /** Example of adding a member to the Bucket-level IAM */
  public static void addBucketIamMember(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy originalPolicy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    String role = "roles/storage.objectViewer";
    String member = "group:example@google.com";

    // getBindingsList() returns an ImmutableList and copying over to an ArrayList so it's mutable.
    List<Binding> bindings = new ArrayList(originalPolicy.getBindingsList());

    // Create a new binding using role and member
    Binding.Builder newMemberBindingBuilder = Binding.newBuilder();
    newMemberBindingBuilder.setRole(role).setMembers(Arrays.asList(member));
    bindings.add(newMemberBindingBuilder.build());

    // Update policy to add member
    Policy.Builder updatedPolicyBuilder = originalPolicy.toBuilder();
    updatedPolicyBuilder.setBindings(bindings).setVersion(3);
    Policy updatedPolicy = storage.setIamPolicy(bucketName, updatedPolicyBuilder.build());

    System.out.printf("Added %s with role %s to %s\n", member, role, bucketName);
  }
}

Node.js

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Node.js API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The role to grant
// const roleName = 'roles/storage.objectViewer';

// The members to grant the new role to
// const members = [
//   'user:jdoe@example.com',
//   'group:admins@example.com',
// ];

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function addBucketIamMember() {
  // Get a reference to a Google Cloud Storage bucket
  const bucket = storage.bucket(bucketName);

  // For more information please read:
  // https://cloud.google.com/storage/docs/access-control/iam
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Adds the new roles to the bucket's IAM policy
  policy.bindings.push({
    role: roleName,
    members: members,
  });

  // Updates the bucket's IAM policy
  await bucket.iam.setPolicy(policy);

  console.log(
    `Added the following member(s) with role ${roleName} to ${bucketName}:`
  );

  members.forEach(member => {
    console.log(`  ${member}`);
  });
}

addBucketIamMember().catch(console.error);

PHP

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage PHP API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

use Google\Cloud\Storage\StorageClient;

/**
 * Adds a new member / role IAM pair to a given Cloud Storage bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $role The role to which the given member should be added.
 *        (e.g. 'roles/storage.objectViewer')
 * @param string[] $members The member(s) to be added to the role.
 *        (e.g. ['group:example@google.com'])
 */
function add_bucket_iam_member(string $bucketName, string $role, array $members): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);
    $policy['version'] = 3;

    $policy['bindings'][] = [
        'role' => $role,
        'members' => $members
    ];

    $bucket->iam()->setPolicy($policy);

    printf('Added the following member(s) to role %s for bucket %s' . PHP_EOL, $role, $bucketName);
    foreach ($members as $member) {
        printf('    %s' . PHP_EOL, $member);
    }
}

Python

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Python API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from google.cloud import storage

def add_bucket_iam_member(bucket_name, role, member):
    """Add a new member to an IAM Policy"""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g., roles/storage.objectViewer"
    # member = "IAM identity, e.g., user: name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    policy.bindings.append({"role": role, "members": {member}})

    bucket.set_iam_policy(policy)

    print(f"Added {member} with role {role} to {bucket_name}.")

Ruby

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Ruby API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def add_bucket_iam_member bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  role   = "roles/storage.objectViewer"
  member = "group:example@google.com"

  bucket.policy requested_policy_version: 3 do |policy|
    policy.bindings.insert role: role, members: [member]
  end

  puts "Added #{member} with role #{role} to #{bucket_name}"
end

JSON

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. אפשר להגדיר את מגרש המשחקים לשימוש בפרטי הכניסה שלכם ל-OAuth. להוראות מפורטות עיינו במאמר אימות API.
  2. יוצרים קובץ JSON שמכיל את הפרטים הבאים:

    {
      "bindings":[
        {
          "role": "IAM_ROLE",
          "members":[
            "PRINCIPAL_IDENTIFIER"
          ]
        }
      ]
    }

    כאשר:

    • IAM_ROLE - תפקיד ה-IAM שמעניקים. לדוגמה, roles/storage.objectViewer.
    • PRINCIPAL_IDENTIFIER - מזהה למי אתם מעניקים גישה לקטגוריה. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  3. כדי להפעיל את JSON API באמצעות בקשת PUT setIamPolicy, משתמשים ב-cURL:

    curl -X PUT --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • JSON_FILE_NAME הוא הנתיב לקובץ שיצרתם בשלב 2.
    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME הוא שם הקטגוריה שאליה אתם רוצים לתת גישה לחשבון המשתמש. לדוגמה, my-bucket.

הצגת מדיניות IAM של קטגוריה

מסוף

  1. במסוף Google Cloud, נכנסים לדף Buckets ב-Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על התפריט Bucket overflow () שמשויך לקטגוריה שאת המדיניות שלה רוצים להציג.

  3. בוחרים Edit access.

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

  5. (אופציונלי) אפשר להשתמש בסרגל החיפוש כדי לסנן את התוצאות לפי תפקיד או לפי חשבון משתמש.

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

שורת הפקודה

gcloud

משתמשים בפקודה buckets get-iam-policy:

gcloud storage buckets get-iam-policy gs://BUCKET_NAME

כאשר BUCKET_NAME הוא שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים להציג. לדוגמה, my-bucket.

‏gsutil

משתמשים בפקודה gsutil iam get:

gsutil iam get gs://BUCKET_NAME

כאשר BUCKET_NAME הוא שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים להציג. לדוגמה, my-bucket.

ספריות לקוח

C++

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C++ API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));

  if (!policy) throw std::move(policy).status();
  std::cout << "The IAM policy for bucket " << bucket_name << " is "
            << *policy << "\n";
}

C#

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C# API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;

public class ViewBucketIamMembersSample
{
    public Policy ViewBucketIamMembers(string bucketName = "your-unique-bucket-name")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });

        foreach (var binding in policy.Bindings)
        {
            Console.WriteLine($"Role: {binding.Role}");
            Console.WriteLine("Members:");
            foreach (var member in binding.Members)
            {
                Console.WriteLine($"{member}");
            }
        }
        return policy;
    }
}

Go

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Go API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/iam"
	"cloud.google.com/go/storage"
)

// getBucketPolicy gets the bucket IAM policy.
func getBucketPolicy(w io.Writer, bucketName string) (*iam.Policy3, error) {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()

	policy, err := client.Bucket(bucketName).IAM().V3().Policy(ctx)
	if err != nil {
		return nil, fmt.Errorf("Bucket(%q).IAM().V3().Policy: %w", bucketName, err)
	}
	for _, binding := range policy.Bindings {
		fmt.Fprintf(w, "%q: %q (condition: %v)\n", binding.Role, binding.Members, binding.Condition)
	}
	return policy, nil
}

Java

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Java API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import com.google.cloud.Binding;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class ListBucketIamMembers {
  public static void listBucketIamMembers(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy policy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    // Print binding information
    for (Binding binding : policy.getBindingsList()) {
      System.out.printf("Role: %s Members: %s\n", binding.getRole(), binding.getMembers());

      // Print condition if one is set
      boolean bindingIsConditional = binding.getCondition() != null;
      if (bindingIsConditional) {
        System.out.printf("Condition Title: %s\n", binding.getCondition().getTitle());
        System.out.printf("Condition Description: %s\n", binding.getCondition().getDescription());
        System.out.printf("Condition Expression: %s\n", binding.getCondition().getExpression());
      }
    }
  }
}

Node.js

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Node.js API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function viewBucketIamMembers() {
  // For more information please read:
  // https://cloud.google.com/storage/docs/access-control/iam
  const results = await storage
    .bucket(bucketName)
    .iam.getPolicy({requestedPolicyVersion: 3});

  const bindings = results[0].bindings;

  console.log(`Bindings for bucket ${bucketName}:`);
  for (const binding of bindings) {
    console.log(`  Role: ${binding.role}`);
    console.log('  Members:');

    const members = binding.members;
    for (const member of members) {
      console.log(`    ${member}`);
    }

    const condition = binding.condition;
    if (condition) {
      console.log('  Condition:');
      console.log(`    Title: ${condition.title}`);
      console.log(`    Description: ${condition.description}`);
      console.log(`    Expression: ${condition.expression}`);
    }
  }
}

viewBucketIamMembers().catch(console.error);

PHP

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage PHP API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

use Google\Cloud\Storage\StorageClient;

/**
 * View Bucket IAM members for a given Cloud Storage bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 */
function view_bucket_iam_members(string $bucketName): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);

    printf('Printing Bucket IAM members for Bucket: %s' . PHP_EOL, $bucketName);
    printf(PHP_EOL);

    foreach ($policy['bindings'] as $binding) {
        printf('Role: %s' . PHP_EOL, $binding['role']);
        printf('Members:' . PHP_EOL);
        foreach ($binding['members'] as $member) {
            printf('  %s' . PHP_EOL, $member);
        }

        if (isset($binding['condition'])) {
            $condition = $binding['condition'];
            printf('  with condition:' . PHP_EOL);
            printf('    Title: %s' . PHP_EOL, $condition['title']);
            printf('    Description: %s' . PHP_EOL, $condition['description']);
            printf('    Expression: %s' . PHP_EOL, $condition['expression']);
        }
        printf(PHP_EOL);
    }
}

Python

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Python API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from google.cloud import storage

def view_bucket_iam_members(bucket_name):
    """View IAM Policy for a bucket"""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    for binding in policy.bindings:
        print(f"Role: {binding['role']}, Members: {binding['members']}")

Ruby

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Ruby API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def view_bucket_iam_members bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  policy = bucket.policy requested_policy_version: 3
  policy.bindings.each do |binding|
    puts "Role: #{binding.role}"
    puts "Members: #{binding.members}"

    # if a conditional binding exists print the condition.
    if binding.condition
      puts "Condition Title: #{binding.condition.title}"
      puts "Condition Description: #{binding.condition.description}"
      puts "Condition Expression: #{binding.condition.expression}"
    end
  end
end

JSON

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. אפשר להגדיר את מגרש המשחקים לשימוש בפרטי הכניסה שלכם ל-OAuth. להוראות מפורטות עיינו במאמר אימות API.
  2. כדי להפעיל את JSON API באמצעות בקשת GET getIamPolicy, משתמשים ב-cURL:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME - שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים להציג. לדוגמה, my-bucket.

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

מסוף

  1. במסוף Google Cloud, נכנסים לדף Buckets ב-Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על התפריט Bucket overflow () שמשויך לקטגוריה שממנה רוצים להסיר את התפקיד של חשבון המשתמש.

  3. בוחרים Edit access.

  4. מרחיבים את התפקיד שמכיל את חשבון המשתמש שרוצים להסיר.

  5. לוחצים על סמל האשפה.

  6. בחלון שכבת-העל שמופיע, לוחצים על Remove.

למידע מפורט על שגיאות בקשר לפעולות Cloud Storage שנכשלו במסוף Google Cloud, ראו את המאמר פתרון בעיות.

שורת הפקודה

gcloud

משתמשים בפקודה buckets remove-iam-policy-binding:

gcloud storage buckets remove-iam-policy-binding  gs://BUCKET_NAME --member=PRINCIPAL_IDENTIFIER --role=IAM_ROLE

כאשר:

  • BUCKET_NAME - שם הקטגוריה שאליה רוצים לבטל את הגישה. לדוגמה, my-bucket.
  • PRINCIPAL_IDENTIFIER - מזהה ממי אתם מבטלים את הגישה. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  • IAM_ROLE - תפקיד ה-IAM שרוצים לבטל. לדוגמה, roles/storage.objectViewer.

‏gsutil

משתמשים בפקודה gsutil iam ch עם הדגל -d:

gsutil iam ch -d PRINCIPAL_IDENTIFIER gs://BUCKET_NAME

כאשר:

  • PRINCIPAL_IDENTIFIER - מזהה ממי אתם מבטלים את הגישה. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  • BUCKET_NAME - שם הקטגוריה שממנה רוצים להסיר את הגישה. לדוגמה, my-bucket.

דוגמאות נוספות לפורמט של PRINCIPAL_IDENTIFIER זמינות בדף העזר של gsutil iam ch.

ספריות לקוח

C++

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C++ API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& member) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  std::vector<google::cloud::storage::NativeIamBinding> updated_bindings;
  for (auto& binding : policy->bindings()) {
    auto& members = binding.members();
    if (binding.role() == role && !binding.has_condition()) {
      members.erase(std::remove(members.begin(), members.end(), member),
                    members.end());
    }
    if (!members.empty()) {
      updated_bindings.emplace_back(std::move(binding));
    }
  }
  policy->bindings() = std::move(updated_bindings);

  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::move(updated).status();

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";
}

C#

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C# API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


using Google.Cloud.Storage.V1;
using System;
using System.Linq;

public class RemoveBucketIamMemberSample
{
    public void RemoveBucketIamMember(
        string bucketName = "your-unique-bucket-name",
        string role = "roles/storage.objectViewer",
        string member = "serviceAccount:dev@iam.gserviceaccount.com")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });
        // Set the policy schema version. For more information, please refer to https://cloud.google.com/iam/docs/policies#versions.
        policy.Version = 3;

        foreach (var binding in policy.Bindings.Where(c => c.Role == role).ToList())
        {
            // Remove the role/member combo from the IAM policy.
            binding.Members = binding.Members.Where(m => m != member).ToList();
            // Remove role if it contains no members.
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
        }
        // Set the modified IAM policy to be the current IAM policy.
        storage.SetBucketIamPolicy(bucketName, policy);
        Console.WriteLine($"Removed {member} with role {role} from {bucketName}");
    }
}

Go

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Go API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/iam"
	"cloud.google.com/go/storage"
)

// removeBucketIAMMember removes the bucket IAM member.
func removeBucketIAMMember(w io.Writer, bucketName string) error {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()

	bucket := client.Bucket(bucketName)
	policy, err := bucket.IAM().Policy(ctx)
	if err != nil {
		return fmt.Errorf("Bucket(%q).IAM().Policy: %w", bucketName, err)
	}
	// Other valid prefixes are "serviceAccount:", "user:"
	// See the documentation for more values.
	// https://cloud.google.com/storage/docs/access-control/iam
	// member string, role iam.RoleName
	identity := "group:cloud-logs@google.com"
	var role iam.RoleName = "roles/storage.objectViewer"

	policy.Remove(identity, role)
	if err := bucket.IAM().SetPolicy(ctx, policy); err != nil {
		return fmt.Errorf("Bucket(%q).IAM().SetPolicy: %w", bucketName, err)
	}
	// NOTE: It may be necessary to retry this operation if IAM policies are
	// being modified concurrently. SetPolicy will return an error if the policy
	// was modified since it was retrieved.
	fmt.Fprintf(w, "Removed %v with role %v from %v\n", identity, role, bucketName)
	return nil
}

Java

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Java API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.Binding;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.List;

public class RemoveBucketIamMember {
  public static void removeBucketIamMember(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy originalPolicy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    String role = "roles/storage.objectViewer";
    String member = "group:example@google.com";

    // getBindingsList() returns an ImmutableList and copying over to an ArrayList so it's mutable.
    List<Binding> bindings = new ArrayList(originalPolicy.getBindingsList());

    // Remove role-member binding without a condition.
    for (int index = 0; index < bindings.size(); index++) {
      Binding binding = bindings.get(index);
      boolean foundRole = binding.getRole().equals(role);
      boolean foundMember = binding.getMembers().contains(member);
      boolean bindingIsNotConditional = binding.getCondition() == null;

      if (foundRole && foundMember && bindingIsNotConditional) {
        bindings.set(index, binding.toBuilder().removeMembers(member).build());
        break;
      }
    }

    // Update policy to remove member
    Policy.Builder updatedPolicyBuilder = originalPolicy.toBuilder();
    updatedPolicyBuilder.setBindings(bindings).setVersion(3);
    Policy updatedPolicy = storage.setIamPolicy(bucketName, updatedPolicyBuilder.build());

    System.out.printf("Removed %s with role %s from %s\n", member, role, bucketName);
  }
}

Node.js

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Node.js API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The role to revoke
// const roleName = 'roles/storage.objectViewer';

// The members to revoke the roles from
// const members = [
//   'user:jdoe@example.com',
//   'group:admins@example.com',
// ];

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function removeBucketIamMember() {
  // Get a reference to a Google Cloud Storage bucket
  const bucket = storage.bucket(bucketName);

  // For more information please read:
  // https://cloud.google.com/storage/docs/access-control/iam
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Finds and updates the appropriate role-member group, without a condition.
  const index = policy.bindings.findIndex(
    binding => binding.role === roleName && !binding.condition
  );

  const role = policy.bindings[index];
  if (role) {
    role.members = role.members.filter(
      member => members.indexOf(member) === -1
    );

    // Updates the policy object with the new (or empty) role-member group
    if (role.members.length === 0) {
      policy.bindings.splice(index, 1);
    } else {
      policy.bindings.index = role;
    }

    // Updates the bucket's IAM policy
    await bucket.iam.setPolicy(policy);
  } else {
    // No matching role-member group(s) were found
    throw new Error('No matching role-member group(s) found.');
  }

  console.log(
    `Removed the following member(s) with role ${roleName} from ${bucketName}:`
  );
  members.forEach(member => {
    console.log(`  ${member}`);
  });
}

removeBucketIamMember().catch(console.error);

PHP

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage PHP API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

use Google\Cloud\Storage\StorageClient;

/**
 * Removes a member / role IAM pair from a given Cloud Storage bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $role The role from which the specified member should be removed.
 *        (e.g. 'roles/storage.objectViewer')
 * @param string $member The member to be removed from the specified role.
 *        (e.g. 'group:example@google.com')
 */
function remove_bucket_iam_member(string $bucketName, string $role, string $member): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $iam = $bucket->iam();
    $policy = $iam->policy(['requestedPolicyVersion' => 3]);
    $policy['version'] = 3;

    foreach ($policy['bindings'] as $i => $binding) {
        // This example only removes member from bindings without a condition.
        if ($binding['role'] == $role && !isset($binding['condition'])) {
            $key = array_search($member, $binding['members']);
            if ($key !== false) {
                unset($binding['members'][$key]);

                // If the last member is removed from the binding, clean up the
                // binding.
                if (count($binding['members']) == 0) {
                    unset($policy['bindings'][$i]);
                    // Ensure array keys are sequential, otherwise JSON encodes
                    // the array as an object, which fails when calling the API.
                    $policy['bindings'] = array_values($policy['bindings']);
                } else {
                    // Ensure array keys are sequential, otherwise JSON encodes
                    // the array as an object, which fails when calling the API.
                    $binding['members'] = array_values($binding['members']);
                    $policy['bindings'][$i] = $binding;
                }

                $iam->setPolicy($policy);
                printf('User %s removed from role %s for bucket %s' . PHP_EOL, $member, $role, $bucketName);
                return;
            }
        }
    }

    throw new \RuntimeException('No matching role-member group(s) found.');
}

Python

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Python API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from google.cloud import storage

def remove_bucket_iam_member(bucket_name, role, member):
    """Remove member from bucket IAM Policy"""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g. roles/storage.objectViewer"
    # member = "IAM identity, e.g. user: name@example.com"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    for binding in policy.bindings:
        print(binding)
        if binding["role"] == role and binding.get("condition") is None:
            binding["members"].discard(member)

    bucket.set_iam_policy(policy)

    print(f"Removed {member} with role {role} from {bucket_name}.")

Ruby

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Ruby API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def remove_bucket_iam_member bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  # For more information please read: https://cloud.google.com/storage/docs/access-control/iam

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  role   = "roles/storage.objectViewer"
  member = "group:example@google.com"

  bucket.policy requested_policy_version: 3 do |policy|
    policy.bindings.each do |binding|
      if binding.role == role && binding.condition.nil?
        binding.members.delete member
      end
    end
  end

  puts "Removed #{member} with role #{role} from #{bucket_name}"
end

JSON

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. אפשר להגדיר את מגרש המשחקים לשימוש בפרטי הכניסה שלכם ל-OAuth. להוראות מפורטות עיינו במאמר אימות API.
  2. מחילים את המדיניות הקיימת על הקטגוריה. לשם כך, משתמשים ב-cURL כדי להפעיל את JSON API באמצעות בקשת GET getIamPolicy:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME - שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים להציג. לדוגמה, my-bucket.
  3. יוצרים קובץ JSON שמכיל את המדיניות שאחזרתם בשלב הקודם.

  4. עורכים את קובץ ה-JSON כדי להסיר מהמדיניות את חשבון המשתמש.

  5. כדי להפעיל את JSON API באמצעות בקשת PUT setIamPolicy, משתמשים ב-cURL:

    curl -X PUT --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • JSON_FILE_NAME - הנתיב לקובץ שיצרתם בשלב 3.
    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME - שם הקטגוריה שרוצים לבטל את הגישה אליה. לדוגמה, my-bucket.

שימוש בתנאי IAM בקטגוריות

החלקים הבאים מסבירים איך להוסיף ולהסיר תנאי IAM בקטגוריות. כדי לראות את תנאי ה-IAM עבור הקטגוריה שלכם, עיינו במאמר הצגת מדיניות IAM בקטגוריה. למידע נוסף על השימוש בתנאי IAM עם Cloud Storage, ראו את המאמר תנאים.

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

הגדרת תנאי חדש בקטגוריה

מסוף

  1. במסוף Google Cloud, נכנסים לדף Buckets ב-Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על התפריט Bucket overflow () בפינה הימנית הרחוקה של השורה המשויכת לקטגוריה.

  3. בוחרים Edit access.

  4. לוחצים על Add principal.

  5. בשדה New principals, ממלאים את חשבונות המשתמשים שרוצים להעניק להם גישה לקטגוריה.

  6. עבור כל תפקיד שרוצים להחיל עליו תנאי:

    1. בוחרים Role כדי להעניק אותו לחשבונות המשתמשים.

    2. לוחצים על Add condition כדי לפתוח את הטופס Edit condition.

    3. ממלאים את Title - הכותרת של התנאי. השדה Description הוא אופציונלי.

    4. אפשר להשתמש בכלי ליצירת תנאים (Condition Builder) כדי ליצור את התנאי באופן חזותי. לחלופין, אפשר להשתמש בכרטיסייה Condition Editor כדי להזין ביטוי CEL.

    5. לוחצים על Save כדי לחזור לטופס Add principal. כדי להוסיף מספר תפקידים, לוחצים על Add another role.

  7. לוחצים על Save.

למידע מפורט על שגיאות בקשר לפעולות Cloud Storage שנכשלו במסוף Google Cloud, ראו את המאמר פתרון בעיות.

שורת הפקודה

gcloud

  1. יוצרים קובץ JSON או YAML שמגדיר את התנאי, כולל: title - הכותרת של התנאי, expression - הלוגיקה מבוססת המאפיינים של התנאי, ואם רוצים description - תיאור של התנאי.

    שימו לב שעבור הלוגיקה של expression, Cloud Storage תומך רק במאפיינים תאריך/שעה, סוג המשאב ושם המשאב.

  2. משתמשים בפקודה buckets add-iam-policy-binding עם הדגל --condition-from-file:

gcloud storage buckets add-iam-policy-binding  gs://BUCKET_NAME --member=PRINCIPAL_IDENTIFIER --role=IAM_ROLE --condition-from-file=CONDITION_FILE

כאשר:

  • BUCKET_NAME - שם הקטגוריה שאליה מעניקים גישה לחשבון המשתמש. לדוגמה, my-bucket.
  • PRINCIPAL_IDENTIFIER - מציין על מי חל התנאי. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
  • IAM_ROLE - תפקיד ה-IAM שמעניקים לחשבון המשתמש. לדוגמה, roles/storage.objectViewer.
  • CONDITION_FILE - הקובץ שיצרתם בשלב הקודם.

לחלופין, אפשר לכלול את התנאי ישירות בפקודה עם הדגל --condition במקום הדגל --condition-from-file.

‏gsutil

  1. משתמשים בפקודה gsutil iam כדי לשמור את מדיניות ה-IAM של הקטגוריה בקובץ JSON זמני.

    gsutil iam get gs://BUCKET_NAME > tmp-policy.json

    כאשר BUCKET_NAME הוא שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים לאחזר. לדוגמה, my-bucket.

  2. כדי להוסיף תנאים חדשים לקישור במדיניות IAM, עורכים את הקובץ tmp-policy.json בכלי לעריכת טקסט:

    {
      "version": VERSION,
      "bindings": [
        {
          "role": "IAM_ROLE",
          "members": [
            "PRINCIPAL_IDENTIFIER"
          ],
          "condition": {
            "title": "TITLE",
            "description": "DESCRIPTION",
            "expression": "EXPRESSION"
          }
        }
      ],
      "etag": "ETAG"
    }

    כאשר:

    אין לבצע שינויים ב-ETAG.

  3. משתמשים ב-gsutil iam כדי להגדיר את מדיניות ה-IAM ששונתה בקטגוריה.

    gsutil iam set tmp-policy.json gs://BUCKET_NAME

ספריות לקוח

C++

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C++ API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& member,
   std::string const& condition_title,
   std::string const& condition_description,
   std::string const& condition_expression) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  policy->bindings().emplace_back(gcs::NativeIamBinding(
      role, {member},
      gcs::NativeExpression(condition_expression, condition_title,
                            condition_description)));

  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::move(updated).status();

  std::cout << "Updated IAM policy bucket " << bucket_name
            << ". The new policy is " << *updated << "\n";

  std::cout << "Added member " << member << " with role " << role << " to "
            << bucket_name << ":\n";
  std::cout << "with condition:\n"
            << "\t Title: " << condition_title << "\n"
            << "\t Description: " << condition_description << "\n"
            << "\t Expression: " << condition_expression << "\n";
}

C#

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C# API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class AddBucketConditionalIamBindingSample
{
    /// <summary>
    /// Adds a conditional Iam policy to a bucket.
    /// </summary>
    /// <param name="bucketName">The name of the bucket.</param>
    /// <param name="role">The role that members may assume.</param>
    /// <param name="member">The identifier of the member who may assume the provided role.</param>
    /// <param name="title">Title for the expression.</param>
    /// <param name="description">Description of the expression.</param>
    /// <param name="expression">Describes the conditions that need to be met for the policy to be applied.
    /// It's represented as a string using Common Expression Language syntax.</param>
    public Policy AddBucketConditionalIamBinding(
        string bucketName = "your-unique-bucket-name",
        string role = "roles/storage.objectViewer",
        string member = "serviceAccount:dev@iam.gserviceaccount.com",
        string title = "title",
        string description = "description",
        string expression = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });
        // Set the policy schema version. For more information, please refer to https://cloud.google.com/iam/docs/policies#versions.
        policy.Version = 3;
        Policy.BindingsData bindingToAdd = new Policy.BindingsData
        {
            Role = role,
            Members = new List<string> { member },
            Condition = new Expr
            {
                Title = title,
                Description = description,
                Expression = expression
            }
        };

        policy.Bindings.Add(bindingToAdd);

        var bucketIamPolicy = storage.SetBucketIamPolicy(bucketName, policy);
        Console.WriteLine($"Added {member} with role {role} " + $"to {bucketName}");
        return bucketIamPolicy;
    }
}

Go

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Go API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}

policy.Bindings = append(policy.Bindings, &iampb.Binding{
	Role:    role,
	Members: []string{member},
	Condition: &expr.Expr{
		Title:       title,
		Description: description,
		Expression:  expression,
	},
})

if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return err
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Java API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.Binding;
import com.google.cloud.Condition;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class AddBucketIamConditionalBinding {
  /** Example of adding a conditional binding to the Bucket-level IAM */
  public static void addBucketIamConditionalBinding(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy originalPolicy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    String role = "roles/storage.objectViewer";
    String member = "group:example@google.com";

    // Create a condition
    String conditionTitle = "Title";
    String conditionDescription = "Description";
    String conditionExpression =
        "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")";
    Condition.Builder conditionBuilder = Condition.newBuilder();
    conditionBuilder.setTitle(conditionTitle);
    conditionBuilder.setDescription(conditionDescription);
    conditionBuilder.setExpression(conditionExpression);

    // getBindingsList() returns an ImmutableList, we copy over to an ArrayList so it's mutable
    List<Binding> bindings = new ArrayList(originalPolicy.getBindingsList());

    // Add condition to a binding
    Binding.Builder newBindingBuilder =
        Binding.newBuilder()
            .setRole(role)
            .setMembers(Arrays.asList(member))
            .setCondition(conditionBuilder.build());
    bindings.add(newBindingBuilder.build());

    // Update policy with new conditional binding
    Policy.Builder updatedPolicyBuilder = originalPolicy.toBuilder();
    updatedPolicyBuilder.setBindings(bindings).setVersion(3);

    storage.setIamPolicy(bucketName, updatedPolicyBuilder.build());

    System.out.printf(
        "Added %s with role %s to %s with condition %s %s %s\n",
        member, role, bucketName, conditionTitle, conditionDescription, conditionExpression);
  }
}

Node.js

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Node.js API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The role to grant
// const roleName = 'roles/storage.objectViewer';

// The members to grant the new role to
// const members = [
//   'user:jdoe@example.com',
//   'group:admins@example.com',
// ];

// Create a condition
// const title = 'Title';
// const description = 'Description';
// const expression = 'resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function addBucketConditionalBinding() {
  // Get a reference to a Google Cloud Storage bucket
  const bucket = storage.bucket(bucketName);

  // Gets and updates the bucket's IAM policy
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Set the policy's version to 3 to use condition in bindings.
  policy.version = 3;

  // Adds the new roles to the bucket's IAM policy
  policy.bindings.push({
    role: roleName,
    members: members,
    condition: {
      title: title,
      description: description,
      expression: expression,
    },
  });

  // Updates the bucket's IAM policy
  await bucket.iam.setPolicy(policy);

  console.log(
    `Added the following member(s) with role ${roleName} to ${bucketName}:`
  );

  members.forEach(member => {
    console.log(`  ${member}`);
  });

  console.log('with condition:');
  console.log(`  Title: ${title}`);
  console.log(`  Description: ${description}`);
  console.log(`  Expression: ${expression}`);
}

addBucketConditionalBinding().catch(console.error);

PHP

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage PHP API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

use Google\Cloud\Storage\StorageClient;

/**
 * Adds a conditional IAM binding to a bucket's IAM policy.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $role The role that will be given to members in this binding.
 *        (e.g. 'roles/storage.objectViewer')
 * @param string[] $members The member(s) associated with this binding.
 *        (e.g. ['group:example@google.com'])
 * @param string $title The title of the condition. (e.g. 'Title')
 * @param string $description The description of the condition.
 *        (e.g. 'Condition Description')
 * @param string $expression The condition specified in CEL expression language.
 *        (e.g. 'resource.name.startsWith("projects/_/buckets/bucket-name/objects/prefix-a-")')
 *
 * To see how to express a condition in CEL, visit:
 * @see https://cloud.google.com/storage/docs/access-control/iam#conditions.
 */
function add_bucket_conditional_iam_binding(string $bucketName, string $role, array $members, string $title, string $description, string $expression): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);

    $policy['version'] = 3;

    $policy['bindings'][] = [
        'role' => $role,
        'members' => $members,
        'condition' => [
            'title' => $title,
            'description' => $description,
            'expression' => $expression,
        ],
    ];

    $bucket->iam()->setPolicy($policy);

    printf('Added the following member(s) with role %s to %s:' . PHP_EOL, $role, $bucketName);
    foreach ($members as $member) {
        printf('    %s' . PHP_EOL, $member);
    }
    printf('with condition:' . PHP_EOL);
    printf('    Title: %s' . PHP_EOL, $title);
    printf('    Description: %s' . PHP_EOL, $description);
    printf('    Expression: %s' . PHP_EOL, $expression);
}

Python

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Python API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from google.cloud import storage

def add_bucket_conditional_iam_binding(
    bucket_name, role, title, description, expression, members
):
    """Add a conditional IAM binding to a bucket's IAM policy."""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g. roles/storage.objectViewer"
    # members = {"IAM identity, e.g. user: name@example.com}"
    # title = "Condition title."
    # description = "Condition description."
    # expression = "Condition expression."

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    # Set the policy's version to 3 to use condition in bindings.
    policy.version = 3

    policy.bindings.append(
        {
            "role": role,
            "members": members,
            "condition": {
                "title": title,
                "description": description,
                "expression": expression,
            },
        }
    )

    bucket.set_iam_policy(policy)

    print(f"Added the following member(s) with role {role} to {bucket_name}:")

    for member in members:
        print(f"    {member}")

    print("with condition:")
    print(f"    Title: {title}")
    print(f"    Description: {description}")
    print(f"    Expression: {expression}")

Ruby

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Ruby API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def add_bucket_conditional_iam_binding bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  role        = "roles/storage.objectViewer"
  member      = "group:example@google.com"
  title       = "Title"
  description = "Description"
  expression  = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"

  bucket.policy requested_policy_version: 3 do |policy|
    policy.version = 3
    policy.bindings.insert(
      role:      role,
      members:   member,
      condition: {
        title:       title,
        description: description,
        expression:  expression
      }
    )
  end

  puts "Added #{member} with role #{role} to #{bucket_name} with condition #{title} #{description} #{expression}"
end

JSON

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. אפשר להגדיר את מגרש המשחקים לשימוש בפרטי הכניסה שלכם ל-OAuth. להוראות מפורטות עיינו במאמר אימות API.
  2. משתמשים בבקשה GET getIamPolicy כדי לשמור את מדיניות ה-IAM של הקטגוריה בקובץ JSON זמני:

    curl \
    'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam' \
    --header 'Authorization: Bearer OAUTH2_TOKEN' > tmp-policy.json

    כאשר:

    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
  3. כדי להוסיף תנאים חדשים לקישור במדיניות IAM, עורכים את הקובץ tmp-policy.json בכלי לעריכת טקסט:

    {
          "version": VERSION,
          "bindings": [
            {
              "role": "IAM_ROLE",
              "members": [
                "PRINCIPAL_IDENTIFIER"
              ],
              "condition": {
                "title": "TITLE",
                "description": "DESCRIPTION",
                "expression": "EXPRESSION"
              }
            }
          ],
          "etag": "ETAG"
     }

    כאשר:

    • VERSION - הגרסה של מדיניות ה-IAM. לצורך קטגוריות עם תנאים ב-IAM הגרסה צריכה להיות 3.
    • IAM_ROLE - התפקיד שעליו חל התנאי. לדוגמה, roles/storage.objectViewer.
    • PRINCIPAL_IDENTIFIER - מציין על מי חל התנאי. לדוגמה, user:jane@gmail.com. לרשימת הפורמטים של מזהי חשבון משתמש ראו מזהים של חשבון משתמש.
    • TITLE - הכותרת של התנאי. לדוגמה, expires in 2019.
    • DESCRIPTION - תיאור אופציונלי של התנאי. לדוגמה, Permission revoked on New Year's.
    • EXPRESSION - ביטוי לוגי מבוסס-מאפיינים. לדוגמה, request.time < timestamp(\"2019-01-01T00:00:00Z\"). דוגמאות נוספות לביטויים זמינות בחומר העזר על המאפיין 'תנאים'. שימו לב ש-Cloud Storage תומך רק במאפיינים תאריך/שעה, סוג המשאב ושם המשאב.

      אין לבצע שינויים ב-ETAG.

  4. משתמשים בבקשה PUT setIamPolicy כדי להגדיר את מדיניות ה-IAM שהשתנתה בקטגוריה:

    curl -X PUT --data-binary @tmp-policy.json \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.

הסרת תנאי מקטגוריה

מסוף

  1. במסוף Google Cloud, נכנסים לדף Buckets ב-Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על התפריט Bucket overflow () בפינה הימנית הרחוקה של השורה המשויכת לקטגוריה.

  3. בוחרים Edit access.

  4. מרחיבים את התפקיד שמכיל את התנאי שרוצים להסיר.

  5. לוחצים על התפריט Edit (סמל תפריט עריכה) עבור חשבון המשתמש שמשויך לתנאי.

  6. בשכבת-העל Edit access, לוחצים על השם של התנאי שרוצים למחוק.

  7. בשכבת-העל של Edit condition, לוחצים על Delete ואז על Confirm.

  8. לוחצים על Save.

למידע מפורט על שגיאות בקשר לפעולות Cloud Storage שנכשלו במסוף Google Cloud, ראו את המאמר פתרון בעיות.

שורת הפקודה

gcloud

  1. משתמשים בפקודה buckets get-iam-policy כדי לשמור את מדיניות ה-IAM של הקטגוריה בקובץ JSON זמני.

    gcloud storage buckets get-iam-policy gs://BUCKET_NAME > tmp-policy.json
  2. עורכים את הקובץ tmp-policy.json בכלי לעריכת טקסט כדי להסיר תנאים ממדיניות ה-IAM.

  3. משתמשים ב-buckets set-iam-policy כדי להגדיר את מדיניות ה-IAM ששונתה בקטגוריה.

    gcloud storage buckets set-iam-policy gs://BUCKET_NAME tmp-policy.json

‏gsutil

  1. משתמשים בפקודה gsutil iam כדי לשמור את מדיניות ה-IAM של הקטגוריה בקובץ JSON זמני.

    gsutil iam get gs://BUCKET_NAME > tmp-policy.json
  2. עורכים את הקובץ tmp-policy.json בכלי לעריכת טקסט כדי להסיר תנאים ממדיניות ה-IAM.

  3. משתמשים ב-gsutil iam כדי להגדיר את מדיניות ה-IAM ששונתה בקטגוריה.

    gsutil iam set tmp-policy.json gs://BUCKET_NAME

דוגמאות קוד

C++

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C++ API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& condition_title,
   std::string const& condition_description,
   std::string const& condition_expression) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));
  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  auto& bindings = policy->bindings();
  auto e = std::remove_if(
      bindings.begin(), bindings.end(),
      [role, condition_title, condition_description,
       condition_expression](gcs::NativeIamBinding b) {
        return (b.role() == role && b.has_condition() &&
                b.condition().title() == condition_title &&
                b.condition().description() == condition_description &&
                b.condition().expression() == condition_expression);
      });
  if (e == bindings.end()) {
    std::cout << "No matching binding group found.\n";
    return;
  }
  bindings.erase(e);
  auto updated = client.SetNativeBucketIamPolicy(bucket_name, *policy);
  if (!updated) throw std::move(updated).status();

  std::cout << "Conditional binding was removed.\n";
}

C#

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage C# API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Linq;

public class RemoveBucketConditionalIamBindingSample
{
    public Policy RemoveBucketConditionalIamBinding(
        string bucketName = "your-unique-bucket-name",
        string role = "roles/storage.objectViewer",
        string title = "title",
        string description = "description",
        string expression = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")")
    {
        var storage = StorageClient.Create();
        var policy = storage.GetBucketIamPolicy(bucketName, new GetBucketIamPolicyOptions
        {
            RequestedPolicyVersion = 3
        });
        // Set the policy schema version. For more information, please refer to https://cloud.google.com/iam/docs/policies#versions.
        policy.Version = 3;

        var bindingsToRemove = policy.Bindings.Where(binding => binding.Role == role
              && binding.Condition != null
              && binding.Condition.Title == title
              && binding.Condition.Description == description
              && binding.Condition.Expression == expression).ToList();
        if (bindingsToRemove.Count() > 0)
        {
            foreach (var binding in bindingsToRemove)
            {
                policy.Bindings.Remove(binding);
            }
            // Set the modified IAM policy to be the current IAM policy.
            policy = storage.SetBucketIamPolicy(bucketName, policy);
            Console.WriteLine("Conditional Binding was removed.");
        }
        else
        {
            Console.WriteLine("No matching conditional binding found.");
        }
        return policy;
    }
}

Go

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Go API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

ctx := context.Background()

ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
bucket := c.Bucket(bucketName)
policy, err := bucket.IAM().V3().Policy(ctx)
if err != nil {
	return err
}

// Find the index of the binding matching inputs
i := -1
for j, binding := range policy.Bindings {
	if binding.Role == role && binding.Condition != nil {
		condition := binding.Condition
		if condition.Title == title &&
			condition.Description == description &&
			condition.Expression == expression {
			i = j
		}
	}
}

if i == -1 {
	return errors.New("No matching binding group found.")
}

// Get a slice of the bindings, removing the binding at index i
policy.Bindings = append(policy.Bindings[:i], policy.Bindings[i+1:]...)

if err := bucket.IAM().V3().SetPolicy(ctx, policy); err != nil {
	return err
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Java API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.Binding;
import com.google.cloud.Condition;
import com.google.cloud.Policy;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class RemoveBucketIamConditionalBinding {
  /** Example of removing a conditional binding to the Bucket-level IAM */
  public static void removeBucketIamConditionalBinding(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // For more information please read:
    // https://cloud.google.com/storage/docs/access-control/iam
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    Policy originalPolicy =
        storage.getIamPolicy(bucketName, Storage.BucketSourceOption.requestedPolicyVersion(3));

    String role = "roles/storage.objectViewer";

    // getBindingsList() returns an ImmutableList and copying over to an ArrayList so it's mutable.
    List<Binding> bindings = new ArrayList(originalPolicy.getBindingsList());

    // Create a condition to compare against
    Condition.Builder conditionBuilder = Condition.newBuilder();
    conditionBuilder.setTitle("Title");
    conditionBuilder.setDescription("Description");
    conditionBuilder.setExpression(
        "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")");

    Iterator iterator = bindings.iterator();
    while (iterator.hasNext()) {
      Binding binding = (Binding) iterator.next();
      boolean foundRole = binding.getRole().equals(role);
      boolean conditionsEqual = conditionBuilder.build().equals(binding.getCondition());

      // Remove condition when the role and condition are equal
      if (foundRole && conditionsEqual) {
        iterator.remove();
        break;
      }
    }

    // Update policy to remove conditional binding
    Policy.Builder updatedPolicyBuilder = originalPolicy.toBuilder();
    updatedPolicyBuilder.setBindings(bindings).setVersion(3);
    Policy updatedPolicy = storage.setIamPolicy(bucketName, updatedPolicyBuilder.build());

    System.out.println("Conditional Binding was removed.");
  }
}

Node.js

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Node.js API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The role to grant
// const roleName = 'roles/storage.objectViewer';

// The members to grant the new role to
// const members = [
//   'user:jdoe@example.com',
//   'group:admins@example.com',
// ];

// Create a condition
// const title = 'Title';
// const description = 'Description';
// const expression = 'resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function removeBucketConditionalBinding() {
  // Get a reference to a Google Cloud Storage bucket
  const bucket = storage.bucket(bucketName);

  // Gets and updates the bucket's IAM policy
  const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3});

  // Set the policy's version to 3 to use condition in bindings.
  policy.version = 3;

  // Finds and removes the appropriate role-member group with specific condition.
  const index = policy.bindings.findIndex(
    binding =>
      binding.role === roleName &&
      binding.condition &&
      binding.condition.title === title &&
      binding.condition.description === description &&
      binding.condition.expression === expression
  );

  const binding = policy.bindings[index];
  if (binding) {
    policy.bindings.splice(index, 1);

    // Updates the bucket's IAM policy
    await bucket.iam.setPolicy(policy);

    console.log('Conditional Binding was removed.');
  } else {
    // No matching role-member group with specific condition were found
    throw new Error('No matching binding group found.');
  }
}

removeBucketConditionalBinding().catch(console.error);

PHP

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage PHP API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

use Google\Cloud\Storage\StorageClient;

/**
 * Removes a conditional IAM binding from a bucket's IAM policy.
 *
 * To see how to express a condition in CEL, visit:
 * @see https://cloud.google.com/storage/docs/access-control/iam#conditions.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $role the role that will be given to members in this binding.
 *        (e.g. 'roles/storage.objectViewer')
 * @param string $title The title of the condition. (e.g. 'Title')
 * @param string $description The description of the condition.
 *        (e.g. 'Condition Description')
 * @param string $expression Te condition specified in CEL expression language.
 *        (e.g. 'resource.name.startsWith("projects/_/buckets/bucket-name/objects/prefix-a-")')
 */
function remove_bucket_conditional_iam_binding(string $bucketName, string $role, string $title, string $description, string $expression): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);

    $policy['version'] = 3;

    $key_of_conditional_binding = null;
    foreach ($policy['bindings'] as $key => $binding) {
        if ($binding['role'] == $role && isset($binding['condition'])) {
            $condition = $binding['condition'];
            if ($condition['title'] == $title
                 && $condition['description'] == $description
                 && $condition['expression'] == $expression) {
                $key_of_conditional_binding = $key;
                break;
            }
        }
    }

    if ($key_of_conditional_binding != null) {
        unset($policy['bindings'][$key_of_conditional_binding]);
        // Ensure array keys are sequential, otherwise JSON encodes
        // the array as an object, which fails when calling the API.
        $policy['bindings'] = array_values($policy['bindings']);
        $bucket->iam()->setPolicy($policy);
        print('Conditional Binding was removed.' . PHP_EOL);
    } else {
        print('No matching conditional binding found.' . PHP_EOL);
    }
}

Python

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Python API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from google.cloud import storage

def remove_bucket_conditional_iam_binding(
    bucket_name, role, title, description, expression
):
    """Remove a conditional IAM binding from a bucket's IAM policy."""
    # bucket_name = "your-bucket-name"
    # role = "IAM role, e.g. roles/storage.objectViewer"
    # title = "Condition title."
    # description = "Condition description."
    # expression = "Condition expression."

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    policy = bucket.get_iam_policy(requested_policy_version=3)

    # Set the policy's version to 3 to use condition in bindings.
    policy.version = 3

    condition = {
        "title": title,
        "description": description,
        "expression": expression,
    }
    policy.bindings = [
        binding
        for binding in policy.bindings
        if not (binding["role"] == role and binding.get("condition") == condition)
    ]

    bucket.set_iam_policy(policy)

    print("Conditional Binding was removed.")

Ruby

למידע נוסף, תוכלו לקרוא את חומרי העזר של Cloud Storage Ruby API.

כדי לאמת ב-Cloud Storage, יש להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

def remove_bucket_conditional_iam_binding bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket = storage.bucket bucket_name

  role        = "roles/storage.objectViewer"
  title       = "Title"
  description = "Description"
  expression  = "resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")"

  bucket.policy requested_policy_version: 3 do |policy|
    policy.version = 3

    binding_to_remove = nil
    policy.bindings.each do |b|
      condition = {
        title:       title,
        description: description,
        expression:  expression
      }
      if (b.role == role) && (b.condition &&
        b.condition.title == title &&
        b.condition.description == description &&
        b.condition.expression == expression)
        binding_to_remove = b
      end
    end
    if binding_to_remove
      policy.bindings.remove binding_to_remove
      puts "Conditional Binding was removed."
    else
      puts "No matching conditional binding found."
    end
  end
end

JSON

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. אפשר להגדיר את מגרש המשחקים לשימוש בפרטי הכניסה שלכם ל-OAuth. להוראות מפורטות עיינו במאמר אימות API.
  2. משתמשים בבקשה GET getIamPolicy כדי לשמור את מדיניות ה-IAM של הקטגוריה בקובץ JSON זמני:

    curl \
    'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam' \
    --header 'Authorization: Bearer OAUTH2_TOKEN' > tmp-policy.json

    כאשר:

    • BUCKET_NAME - שם הקטגוריה שעבורה מעניקים גישה. לדוגמה, my-bucket.
    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
  3. עורכים את הקובץ tmp-policy.json בכלי לעריכת טקסט כדי להסיר תנאים ממדיניות ה-IAM.

  4. משתמשים בבקשה PUT setIamPolicy כדי להגדיר את מדיניות ה-IAM שהשתנתה בקטגוריה:

    curl -X PUT --data-binary @tmp-policy.json \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    כאשר:

    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME - שם הקטגוריה שאת מדיניות ה-IAM שלה רוצים לשנות. לדוגמה, my-bucket.

שימוש ב-IAM עם פרויקטים

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

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