Tolak akses ke resource

Halaman ini menjelaskan cara menolak akses akun utama dengan mencegah mereka dalam menggunakan izin Identity dan Access Management (IAM) tertentu.

Dalam IAM, Anda menolak akses dengan kebijakan penolakan. Setiap kebijakan penolakan dilampirkan ke Google Cloud organisasi, folder, atau project. Kebijakan penolakan berisi aturan penolakan, yang mengidentifikasi akun utama dan mencantumkan izin yang tidak dapat digunakan oleh akun utama.

Kebijakan penolakan terpisah dari kebijakan izin, yang juga dikenal sebagai kebijakan IAM . Kebijakan izinkan menyediakan akses ke resource dengan memberikan peran IAM ke akun utama.

Anda dapat mengelola kebijakan penolakan dengan konsol Google Cloud , Google Cloud CLI, atau IAM v2 REST API.

Sebelum memulai

  • Aktifkan IAM API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Mengaktifkan API

  • Menyiapkan autentikasi.

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    Konsol

    Saat menggunakan konsol Google Cloud untuk mengakses layanan Google Cloud dan API, Anda tidak perlu menyiapkan autentikasi.

    gcloud

    Di konsol Google Cloud , aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah konsol Google Cloud , sesi Cloud Shell akan dimulai dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi pada sesi.

    Terraform

    Untuk menggunakan contoh Terraform di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Go

    Untuk menggunakan contoh Go di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Java

    Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Node.js

    Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    Python

    Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal dalam dokumentasi autentikasi Google Cloud .

    REST

    Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    Untuk mengetahui informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud .

  • Baca ringkasan kebijakan penolakan.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk mengelola kebijakan penolakan, minta administrator Anda untuk memberi Anda peran IAM berikut pada organisasi:

  • Untuk melihat kebijakan penolakan: Deny Reviewer (roles/iam.denyReviewer)
  • Untuk melihat, membuat, memperbarui, dan menghapus kebijakan penolakan: Deny Admin (roles/iam.denyAdmin)

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk mengelola kebijakan penolakan. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengelola kebijakan penolakan:

  • Untuk melihat kebijakan penolakan:
    • iam.denypolicies.get
    • iam.denypolicies.list
  • Untuk membuat, memperbarui, dan menghapus kebijakan penolakan:
    • iam.denypolicies.create
    • iam.denypolicies.delete
    • iam.denypolicies.get
    • iam.denypolicies.update

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Mengidentifikasi izin yang akan ditolak

Sebelum membuat kebijakan penolakan, Anda harus memutuskan izin mana yang ingin ditolak, dan akun utama mana yang harus ditolak izinnya.

Hanya beberapa izin yang dapat ditolak. Untuk mengetahui daftar izin yang dapat Anda tolak, lihat Izin yang didukung dalam kebijakan penolakan.

Dalam beberapa kasus, Anda juga dapat menggunakan grup izin untuk menolak serangkaian izin. Untuk mengetahui informasi selengkapnya, lihat Grup izin.

Anda mengelola kebijakan penolakan dengan REST API v2, yang memerlukan format khusus untuk nama izin. Misalnya, izin untuk membuat peran khusus IAM diberi nama sebagai berikut:

  • v1 API: iam.roles.create
  • v2 API: iam.googleapis.com/roles.create

Membuat kebijakan penolakan

Anda dapat menambahkan kebijakan penolakan ke organisasi, folder, dan project. Setiap resource dapat memiliki hingga 500 kebijakan penolakan.

Kebijakan penolakan berisi aturan penolakan, yang menentukan hal berikut:

  • Izin untuk penolakan.
  • Akun utama yang izinnya ditolak.
  • Opsional: Akun utama yang dikecualikan dari penolakan izin.

    Misalnya, Anda dapat menolak izin ke suatu grup, tetapi mengecualikan pengguna tertentu yang termasuk dalam grup tersebut.

  • Opsional: Ekspresi kondisi yang menentukan kapan utama tidak dapat menggunakan izin. Dalam kebijakan penolakan, ekspresi kondisi hanya dapat digunakan fungsinya untuk tag resource—fungsi laninnya dan operator lain yang tidak mendukung.

Setiap resource dapat memiliki hingga 500 aturan penolakan di semua kebijakan penolakan yang dilampirkan.

Kebijakan penolakan diwariskan melalui hierarki resource. Misalnya, jika Anda menolak izin pada tingkat organisasi, yang izin tersebut juga akan ditolak pada folder dan project dalam organisasi tersebut, serta pada resource khusus layanan dalam setiap project.

Kebijakan penolakan akan menggantikan izin kebijakan. Jika akun utama diberi peran yang berisi izin tertentu, tetapi kebijakan penolakan mengatakan akun utama tidak dapat digunakan izinnya, maka akun utama tidak dapat izin penggunaannya.

Konsol

  1. Di konsol Google Cloud , buka tab Tolak di halaman IAM.

    Buka IAM

  2. Pilih project, folder, atau organisasi.

  3. Klik Buat kebijakan penolakan.

  4. Di bagian Nama kebijakan, tentukan ID kebijakan dengan melakukan salah satu hal berikut:

    • Di kolom Nama tampilan, masukkan nama tampilan untuk kebijakan. Mengisi kolom ini akan otomatis mengisi kolom ID. Jika Anda ingin mengubah ID kebijakan, perbarui teks di kolom ID.
    • Di kolom ID, masukkan ID untuk kebijakan.
  5. Di bagian Aturan penolakan, tentukan aturan penolakan kebijakan. Setiap kebijakan penolakan harus memiliki minimal satu aturan penolakan. Untuk menambahkan aturan penolakan lainnya, klik Tambahkan aturan penolakan.

    Untuk setiap aturan penolakan, lakukan hal berikut:

    1. Di kolom Akun utama yang ditolak, tambahkan satu atau beberapa akun utama yang ingin Anda cegah menggunakan izin yang ditentukan. Akun utama dapat berupa salah satu jenis akun utama dalam ID utama untuk kebijakan penolakan, kecuali akun utama yang ID-nya dimulai dengan deleted:.
    2. Opsional: Di kolom Exception principals, tambahkan akun utama yang ingin Anda izinkan untuk menggunakan izin yang ditentukan, meskipun jika akun utama tersebut disertakan di bagian Denied principals. Misalnya, Anda dapat menggunakan kolom ini untuk membuat pengecualian bagi pengguna tertentu yang termasuk dalam grup yang ditolak.

    3. Di bagian Izin ditolak, tambahkan izin yang ingin Anda tolak. Izin harus didukung dalam kebijakan penolakan.

      Dalam beberapa kasus, Anda juga dapat menggunakan grup izin untuk menolak serangkaian izin. Untuk mengetahui informasi selengkapnya, lihat Grup izin.

    4. Opsional: Tambahkan izin pengecualian. Izin pengecualian adalah izin yang tidak ingin Anda tolak dengan aturan penolakan ini, meskipun izin tersebut disertakan dalam daftar izin yang ditolak. Misalnya, Anda dapat menggunakan kolom ini untuk membuat pengecualian bagi izin tertentu dalam grup izin.

      Untuk menambahkan izin pengecualian, klik Izin pengecualian, klik Tambahkan izin lain, lalu masukkan izin di kolom Izin 1. Lanjutkan menambahkan izin hingga Anda menambahkan semua izin yang ingin dikecualikan dari kebijakan penolakan.

    5. Opsional: Tambahkan kondisi penolakan untuk menentukan kapan akun utama tidak dapat menggunakan izin. Untuk menambahkan kondisi penolakan, klik Tambahkan kondisi penolakan, lalu tentukan kolom berikut:

      • Judul: Opsional. Rangkuman singkat dari tujuan terhadap kondisi.
      • Deskripsi: opsional. Deskripsi panjang dari kondisi.
      • Ekspresi kondisi: Anda dapat menambahkan ekspresi kondisi menggunakan Pembuat kondisi atau Editor kondisi. Pembuat kondisi menyediakan antarmuka interaktif untuk memilih jenis kondisi, operator, dan detail lain yang berlaku terkait ekspresi yang Anda inginkan. Editor kondisi menyediakan antarmuka berbasis teks untuk memasukkan ekspresi secara manual menggunakan sintaksis Common Expression Language (CEL).

        Kondisi penolakan harus didasarkan pada tag resource. Fungsi dan operator lainnya tidak didukung.

  6. Klik Create.

gcloud

Untuk membuat kebijakan penolakan untuk resource, mulailah dengan membuat file JSON yang berisi kebijakan tersebut. Kebijakan penolakan menggunakan format berikut:

{
  "displayName": "POLICY_NAME",
  "rules": [
    {
      "denyRule": DENY_RULE_1
    },
    {
      "denyRule": DENY_RULE_2
    },
    {
      "denyRule": DENY_RULE_N
    }
  ]
}

Berikan nilai berikut:

  • POLICY_NAME: Nama tampilan untuk kebijakan penolakan.
  • DENY_RULE_1, DENY_RULE_2, ...DENY_RULE_N: Aturan penolakan dalam kebijakan. Setiap aturan penolakan dapat berisi kolom berikut:

    • deniedPermissions: Daftar izin yang tidak dapat digunakan oleh akun utama yang ditentukan. Izin harus didukung dalam kebijakan penolakan.

      Dalam beberapa kasus, Anda juga dapat menggunakan grup izin untuk menolak serangkaian izin. Untuk mengetahui informasi selengkapnya, lihat Grup izin.

    • exceptionPermissions: Daftar izin yang dapat digunakan oleh akun utama yang ditentukan, meskipun jika izin tersebut disertakan dalam deniedPermissions. Misalnya, Anda dapat menggunakan kolom ini untuk membuat pengecualian bagi izin tertentu dalam grup izin.
    • deniedPrincipals: Daftar utama yang tidak dapat menggunakan izin yang ditentukan. Untuk mempelajari cara memformat ID utama, lihat ID utama untuk kebijakan penolakan.
    • exceptionPrincipals: Opsional. Daftar akun utama yang dapat menggunakan izin yang ditentukan, meskipun jika akun utama tersebut disertakan di dalam deniedPrincipals. Misalnya, Anda dapat menggunakan kolom ini untuk membuat pengecualian bagi pengguna tertentu yang termasuk dalam grup yang ditolak. Untuk mempelajari cara memformat ID utama, lihat ID utama untuk kebijakan penolakan.

    • denialCondition: Opsional. Ekspresi kondisi yang menentukan kapan akun utama tidak dapat menggunakan izin. Berisi kolom berikut:

    Contoh aturan penolakan, lihat Kasus penggunaan umum.

Misalnya, kebijakan penolakan berikut berisi satu aturan penolakan, yang menolak satu izin untuk Lucian:

{
  "displayName": "My deny policy.",
  "rules": [
    {
      "denyRule": {
        "deniedPrincipals": [
          "principal://goog/subject/lucian@example.com"
        ],
        "deniedPermissions": [
          "iam.googleapis.com/roles.create"
        ]
      }
    }
  ]
}

Selanjutnya, jalankan perintah gcloud iam policies create:

gcloud iam policies create POLICY_ID \
    --attachment-point=ATTACHMENT_POINT \
    --kind=denypolicies \
    --policy-file=POLICY_FILE

Berikan nilai berikut:

  • POLICY_ID: ID untuk kebijakan penolakan.

  • ATTACHMENT_POINT: ID untuk resource yang t kebijakan penolakannya melekat. Untuk mempelajari cara memformat nilai ini, lihat Titik lampiran.

  • POLICY_FILE: Jalur file untuk file JSON yang berisi kebijakan penolakan.

Secara default, jika perintah ini berhasil dijalankan, output apa pun tidak akan dicetak. Untuk mencetak respons mendetail, tambahkan flag --format=json ke perintah.

Misalnya, perintah berikut akan membuat kebijakan penolakan bernama my-deny-policy untuk project my-project, menggunakan file bernama policy.json:

gcloud iam policies create my-deny-policy \
    --attachment-point=cloudresourcemanager.googleapis.com/projects/my-project \
    --kind=denypolicies \
    --policy-file=policy.json

Terraform

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi penyedia Terraform.

data "google_project" "default" {
}

# Create a service account
resource "google_service_account" "default" {
  display_name = "IAM Deny Example - Service Account"
  account_id   = "example-sa"
  project      = data.google_project.default.project_id
}

# Create an IAM deny policy that denies a permission for the service account
resource "google_iam_deny_policy" "default" {
  provider     = google-beta
  parent       = urlencode("cloudresourcemanager.googleapis.com/projects/${data.google_project.default.project_id}")
  name         = "my-deny-policy"
  display_name = "My deny policy."
  rules {
    deny_rule {
      denied_principals  = ["principal://iam.googleapis.com/projects/-/serviceAccounts/${google_service_account.default.email}"]
      denied_permissions = ["iam.googleapis.com/roles.create"]
    }
  }
}

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk IAM, lihat library klien IAM. Untuk informasi selengkapnya, lihat dokumentasi referensi API Go IAM.

Untuk melakukan autentikasi ke IAM, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Sebelum memulai.

import (
	"context"
	"fmt"
	"io"

	iam "cloud.google.com/go/iam/apiv2"
	"cloud.google.com/go/iam/apiv2/iampb"

	"google.golang.org/genproto/googleapis/type/expr"
)

// createDenyPolicy creates a deny policy.
func createDenyPolicy(w io.Writer, projectID, policyID string) error {
	// You can add deny policies to organizations, folders, and projects.
	// Each of these resources can have up to 5 deny policies.
	// Deny policies contain deny rules, which specify the following:
	// 1. The permissions to deny and/or exempt.
	// 2. The principals that are denied, or exempted from denial.
	// 3. An optional condition on when to enforce the deny rules.

	// projectID := "your_project_id"
	// policyID := "your_policy_id"

	ctx := context.Background()
	policiesClient, err := iam.NewPoliciesClient(ctx)
	if err != nil {
		return fmt.Errorf("NewPoliciesClient: %w", err)
	}
	defer policiesClient.Close()

	// Each deny policy is attached to an organization, folder, or project.
	// To work with deny policies, specify the attachment point.
	//
	// Its format can be one of the following:
	// 1. cloudresourcemanager.googleapis.com/organizations/ORG_ID
	// 2. cloudresourcemanager.googleapis.com/folders/FOLDER_ID
	// 3. cloudresourcemanager.googleapis.com/projects/PROJECT_ID
	//
	// The attachment point is identified by its URL-encoded resource name. Hence, replace
	// the "/" with "%%2F".
	attachmentPoint := fmt.Sprintf(
		"cloudresourcemanager.googleapis.com%%2Fprojects%%2F%s",
		projectID,
	)

	denyRule := &iampb.DenyRule{
		// Add one or more principals who should be denied the permissions specified in this rule.
		// For more information on allowed values,
		// see: https://cloud.google.com/iam/help/deny/principal-identifiers
		DeniedPrincipals: []string{"principalSet://goog/public:all"},
		// Optionally, set the principals who should be exempted from the
		// list of denied principals. For example, if you want to deny certain permissions
		// to a group but exempt a few principals, then add those here.
		// ExceptionPrincipals: []string{"principalSet://goog/group/project-admins@example.com"},
		//
		// Set the permissions to deny.
		// The permission value is of the format: service_fqdn/resource.action
		// For the list of supported permissions,
		// see: https://cloud.google.com/iam/help/deny/supported-permissions
		DeniedPermissions: []string{"cloudresourcemanager.googleapis.com/projects.delete"},
		// Optionally, add the permissions to be exempted from this rule.
		// Meaning, the deny rule will not be applicable to these permissions.
		// ExceptionPermissions: []string{"cloudresourcemanager.googleapis.com/projects.create"},
		//
		// Set the condition which will enforce the deny rule.
		// If this condition is true, the deny rule will be applicable.
		// Else, the rule will not be enforced.
		// The expression uses Common Expression Language syntax (CEL).
		// Here we block access based on tags.
		//
		// Here, we create a deny rule that denies the
		// cloudresourcemanager.googleapis.com/projects.delete permission
		// to everyone except project-admins@example.com for resources that are tagged test.
		// A tag is a key-value pair that can be attached to an organization, folder, or project.
		// For more info, see: https://cloud.google.com/iam/docs/deny-access#create-deny-policy
		DenialCondition: &expr.Expr{
			Expression: "!resource.matchTag('12345678/env', 'test')",
		},
	}

	// Add the deny rule and a description for it.
	policyRule := &iampb.PolicyRule{
		Description: "block all principals from deleting projects, unless the principal is a member of project-admins@example.com and the project being deleted has a tag with the value test",
		Kind: &iampb.PolicyRule_DenyRule{
			DenyRule: denyRule,
		},
	}

	policy := &iampb.Policy{
		DisplayName: "Restrict project deletion access",
		Rules:       [](*iampb.PolicyRule){policyRule},
	}

	req := &iampb.CreatePolicyRequest{
		// Construct the full path of the resource's deny policies.
		// Its format is: "policies/ATTACHMENT_POINT/denypolicies"
		Parent:   fmt.Sprintf("policies/%s/denypolicies", attachmentPoint),
		Policy:   policy,
		PolicyId: policyID,
	}
	op, err := policiesClient.CreatePolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create policy: %w", err)
	}

	policy, err = op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Policy %s created\n", policy.GetName())

	return nil
}

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk IAM, lihat library klien IAM. Untuk informasi selengkapnya, lihat dokumentasi referensi API Java IAM.

Untuk melakukan autentikasi ke IAM, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Sebelum memulai.


import com.google.iam.v2.CreatePolicyRequest;
import com.google.iam.v2.DenyRule;
import com.google.iam.v2.PoliciesClient;
import com.google.iam.v2.Policy;
import com.google.iam.v2.PolicyRule;
import com.google.longrunning.Operation;
import com.google.type.Expr;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateDenyPolicy {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // ID or number of the Google Cloud project you want to use.
    String projectId = "your-google-cloud-project-id";

    // Specify the id of the Deny policy you want to create.
    String policyId = "deny-policy-id";

    createDenyPolicy(projectId, policyId);
  }

  // Create a deny policy.
  // You can add deny policies to organizations, folders, and projects.
  // Each of these resources can have up to 5 deny policies.
  //
  // Deny policies contain deny rules, which specify the following:
  // 1. The permissions to deny and/or exempt.
  // 2. The principals that are denied, or exempted from denial.
  // 3. An optional condition on when to enforce the deny rules.
  public static void createDenyPolicy(String projectId, String policyId)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    try (PoliciesClient policiesClient = PoliciesClient.create()) {
      // Each deny policy is attached to an organization, folder, or project.
      // To work with deny policies, specify the attachment point.
      //
      // Its format can be one of the following:
      // 1. cloudresourcemanager.googleapis.com/organizations/ORG_ID
      // 2. cloudresourcemanager.googleapis.com/folders/FOLDER_ID
      // 3. cloudresourcemanager.googleapis.com/projects/PROJECT_ID
      //
      // The attachment point is identified by its URL-encoded resource name.
      String urlEncodedResource =
          URLEncoder.encode(
              "cloudresourcemanager.googleapis.com/projects/", StandardCharsets.UTF_8);
      String attachmentPoint = String.format("%s%s", urlEncodedResource, projectId);

      // Construct the full path of the resource to which the policy is attached.
      // Its format is: "policies/{attachmentPoint}/denypolicies/{policyId}"
      String policyParent = String.format("policies/%s/denypolicies", attachmentPoint);

      DenyRule denyRule =
          DenyRule.newBuilder()
              // Add one or more principals who should be denied the permissions specified in this
              // rule.
              // For more information on allowed values, see:
              // https://cloud.google.com/iam/docs/principal-identifiers
              .addDeniedPrincipals("principalSet://goog/public:all")

              // Optionally, set the principals who should be exempted from the
              // list of denied principals. For example, if you want to deny certain permissions
              // to a group but exempt a few principals, then add those here.
              // .addExceptionPrincipals(
              //     "principalSet://goog/group/project-admins@example.com")

              // Set the permissions to deny.
              // The permission value is of the format: service_fqdn/resource.action
              // For the list of supported permissions, see:
              // https://cloud.google.com/iam/help/deny/supported-permissions
              .addDeniedPermissions("cloudresourcemanager.googleapis.com/projects.delete")

              // Optionally, add the permissions to be exempted from this rule.
              // Meaning, the deny rule will not be applicable to these permissions.
              // .addExceptionPermissions("cloudresourcemanager.googleapis.com/projects.create")

              // Set the condition which will enforce the deny rule. If this condition is true,
              // the deny rule will be applicable. Else, the rule will not be enforced.
              .setDenialCondition(
                  Expr.newBuilder()
                      // The expression uses Common Expression Language syntax (CEL).
                      // Here we block access based on tags.
                      //
                      // A tag is a key-value pair that can be attached to an organization, folder,
                      // or project. You can use deny policies to deny permissions based on tags
                      // without adding an IAM Condition to every role grant.
                      // For example, imagine that you tag all of your projects as dev, test, or
                      // prod. You want only members of project-admins@example.com to be able to
                      // perform operations on projects that are tagged prod.
                      // To solve this problem, you create a deny rule that denies the
                      // cloudresourcemanager.googleapis.com/projects.delete permission to everyone
                      // except project-admins@example.com for resources that are tagged test.
                      .setExpression("!resource.matchTag('12345678/env', 'test')")
                      .