Mengontrol akses repositori dengan tag dan kebijakan penolakan

Anda dapat menggunakan kebijakan penolakan Identity and Access Management (IAM) bersama dengan tag untuk memblokir operasi tertentu pada link repositori Git dalam koneksi Developer Connect.

Anda melampirkan tag ke koneksi, lalu membuat kebijakan penolakan yang kondisinya cocok dengan tag tersebut. Setiap link repositori Git dalam koneksi mewarisi tag, sehingga kebijakan penolakan berlaku untuk semua repositori yang ditautkan melalui koneksi tersebut.

Kapan harus menggunakan tag dan kebijakan penolakan

Kebijakan izin IAM memberikan izin. Kebijakan penolakan memungkinkan Anda menetapkan guardrail yang lebih diprioritaskan daripada kebijakan izin, terlepas dari peran yang dimiliki akun utama. Menggabungkan kebijakan penolakan dengan tag memungkinkan Anda menerapkan batasan tersebut ke koneksi yang dipilih, bukan ke setiap koneksi dalam project.

Misalnya, Anda dapat menggunakan pendekatan ini untuk melakukan hal berikut:

  • Izinkan agen AI atau akun layanan otomatisasi membaca commit dan permintaan pull melalui Developer Connect, tetapi cegah agen atau akun layanan tersebut membuka, mengubah, atau mengomentari permintaan pull di repositori produksi.
  • Memblokir semua operasi repositori untuk grup akun utama pada koneksi yang tertaut ke repositori sensitif, sekaligus mempertahankan aksesnya ke koneksi lain dalam project yang sama.
  • Terapkan serangkaian batasan yang konsisten di banyak project dengan membuat tag dan kebijakan penolakan di level organisasi.

Cara tag diterapkan ke link repositori Git

Di Developer Connect, Anda dapat melampirkan tag ke koneksi, tetapi tidak langsung ke link repositori Git.

Link repositori Git adalah resource turunan dari koneksinya. Saat IAM mengevaluasi kebijakan penolakan untuk operasi pada link repositori Git, kondisi tersebut dievaluasi terhadap tag efektif link. Tag yang efektif mencakup tag yang dilampirkan ke koneksi induk, dan tag yang diwarisi dari project, folder, dan organisasi koneksi.

Karena link repositori Git mewarisi tag dari koneksinya, kontrol dalam dokumen ini berlaku per koneksi. Jika Anda memerlukan kontrol yang berbeda untuk repositori yang berbeda, tautkan repositori tersebut melalui koneksi yang berbeda, lalu beri tag pada setiap koneksi secara terpisah.

Sebelum memulai

  • Pastikan Anda memiliki koneksi Developer Connect dengan setidaknya satu repositori Git yang ditautkan.
  • Pastikan Anda mengetahui ID organisasi dan nomor project dari project yang berisi koneksi.
  • Untuk menggunakan contoh command line dalam dokumen ini, instal dan konfigurasi Google Cloud CLI.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk membuat tag, melampirkan tag ke koneksi, dan membuat kebijakan penolakan, minta administrator untuk memberi Anda peran IAM berikut pada organisasi:

  • Untuk membuat dan mengelola kunci tag dan nilai tag: Tag Administrator (roles/resourcemanager.tagAdmin)
  • Untuk melampirkan nilai tag ke koneksi: Tag User (roles/resourcemanager.tagUser) pada nilai tag, dan Developer Connect Admin (roles/developerconnect.admin) pada koneksi
  • Untuk 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.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Izin yang dapat Anda tolak

Anda dapat menolak izin berikut pada link repositori Git. Dalam kebijakan penolakan, gunakan format developerconnect.googleapis.com/gitRepositoryLinks.PERMISSION.

Membaca data repositori

Izin Memungkinkan akun utama
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommit Dapatkan commit.
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommitList Membuat daftar commit.
developerconnect.googleapis.com/gitRepositoryLinks.diffCommit Mendapatkan perbedaan antara commit.
developerconnect.googleapis.com/gitRepositoryLinks.fetchFileBlame Mendapatkan informasi blame untuk file.
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequest Mendapatkan permintaan pull.
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequestList Mencantumkan permintaan pull.
developerconnect.googleapis.com/gitRepositoryLinks.fetchGitRefs Mencantumkan cabang dan tag.

Mengubah data repositori

Izin Memungkinkan akun utama
developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest Buka permintaan pull.
developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest Mengubah permintaan pull, misalnya, judul, deskripsi, atau statusnya.
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment Menambahkan komentar ke permintaan pull.
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment Menambahkan komentar ulasan ke permintaan pull.

Token akses dan proxy Git

Izin Memungkinkan akun utama
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadToken Dapatkan token akses hanya baca untuk repositori.
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken Dapatkan token akses baca-tulis untuk repositori.
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyRead Membaca dari repositori melalui proxy Developer Connect.
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite Menulis ke repositori melalui proxy Developer Connect.

Untuk mengetahui daftar lengkap izin yang didukung kebijakan penolakan, lihat Izin yang didukung dalam kebijakan penolakan.

Membuat tag dan melampirkannya ke koneksi

Dalam contoh ini, Anda membuat kunci tag bernama scm-agent-access dengan nilai tag bernama read-only, lalu melampirkan nilai tag ke koneksi.

  1. Buat kunci tag. Perintah berikut membuat kunci tag di organisasi Anda, sehingga Anda dapat menggunakannya pada koneksi di project mana pun:

    gcloud resource-manager tags keys create scm-agent-access \
        --parent=organizations/ORGANIZATION_ID \
        --description="Controls agent access to Developer Connect repositories"

    Ganti ORGANIZATION_ID dengan ID organisasi Anda.

    Anda juga dapat membuat kunci tag dalam project dengan menetapkan --parent ke projects/PROJECT_ID. Kunci tag level project hanya dapat dilampirkan ke resource dalam project tersebut.

  2. Buat nilai tag:

    gcloud resource-manager tags values create read-only \
        --parent=ORGANIZATION_ID/scm-agent-access
  3. Lampirkan nilai tag ke koneksi:

    gcloud resource-manager tags bindings create \
        --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

    Ganti kode berikut:

    • PROJECT_NUMBER: nomor project dari project yang berisi koneksi.
    • LOCATION: region koneksi, misalnya, us-central1.
    • CONNECTION_ID: ID koneksi.
  4. Pastikan tag dilampirkan ke koneksi:

    gcloud resource-manager tags bindings list \
        --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
        --location=LOCATION

Untuk mengetahui informasi selengkapnya tentang cara membuat dan melampirkan tag, lihat Membuat dan mengelola tag.

Membuat kebijakan penolakan

Kebijakan penolakan berikut mencegah akun layanan membuka, mengubah, atau mengomentari permintaan pull, dan mendapatkan token baca-tulis atau menulis melalui proxy Developer Connect, di link repositori Git mana pun yang koneksinya memiliki tag scm-agent-access yang ditetapkan ke read-only. Akun layanan masih dapat membaca commit dan permintaan pull, jika kebijakan izin memberinya izin tersebut.

  1. Buat file bernama policy.json dengan konten berikut:

    {
      "displayName": "Read-only Developer Connect access for agents",
      "rules": [
        {
          "denyRule": {
            "deniedPrincipals": [
              "principal://iam.googleapis.com/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL"
            ],
            "deniedPermissions": [
              "developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment",
              "developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken",
              "developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite"
            ],
            "denialCondition": {
              "title": "Connection is tagged scm-agent-access=read-only",
              "expression": "resource.matchTag('ORGANIZATION_ID/scm-agent-access', 'read-only')"
            }
          }
        }
      ]
    }

    Ganti SERVICE_ACCOUNT_EMAIL dengan alamat email akun layanan yang ingin Anda batasi. Untuk membatasi jenis akun utama lainnya, seperti pengguna atau grup, lihat ID akun utama.

  2. Buat kebijakan penolakan dan lampirkan ke organisasi Anda:

    gcloud iam policies create scm-agent-read-only \
        --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
        --kind=denypolicies \
        --policy-file=policy.json

    Anda juga dapat melampirkan kebijakan penolakan ke folder atau project. Kebijakan penolakan berlaku untuk semua resource di bawah titik lampirannya.

Untuk mengetahui informasi selengkapnya tentang cara membuat kebijakan penolakan, lihat Menolak akses ke resource.

Memverifikasi kebijakan penolakan

Perubahan pada tag dan kebijakan penolakan memiliki konsistensi tertunda. Diperlukan waktu beberapa menit hingga binding tag atau kebijakan penolakan baru diterapkan. Untuk mengetahui informasi selengkapnya, lihat Dampak perubahan tag dan Penerapan perubahan akses.

Setelah perubahan diterapkan, permintaan dari akun utama yang ditolak untuk izin yang ditolak pada link repositori Git di koneksi yang diberi tag akan gagal dengan error HTTP 403 PERMISSION_DENIED. Pesan error menyebutkan izin dan link repositori Git, serta menyatakan bahwa akses ditolak oleh kebijakan penolakan IAM. Contoh:

Permission 'developerconnect.gitRepositoryLinks.openPullRequest' denied on resource '//developerconnect.googleapis.com/projects/my-project/locations/us-central1/connections/my-connection/gitRepositoryLinks/my-repo' due to an IAM deny policy.

Permintaan izin yang tidak ditolak oleh kebijakan, dan permintaan link repositori Git dalam koneksi yang tidak memiliki tag, tidak akan terpengaruh oleh kebijakan penolakan.

Untuk memeriksa apakah kebijakan penolakan berlaku untuk akun utama dan link repositori Git, gunakan Pemecah Masalah Kebijakan:

gcloud policy-intelligence troubleshoot-policy iam \
    //developerconnect.googleapis.com/projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID/gitRepositoryLinks/GIT_REPOSITORY_LINK_ID \
    --principal-email=SERVICE_ACCOUNT_EMAIL \
    --permission=developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest

Menghapus pembatasan

Untuk menghapus batasan dari satu koneksi, hapus binding tag dari koneksi:

gcloud resource-manager tags bindings delete \
    --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \
    --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \
    --location=LOCATION

Untuk menghapus batasan dari semua koneksi, hapus kebijakan penolakan:

gcloud iam policies delete scm-agent-read-only \
    --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \
    --kind=denypolicies

Batasan

  • Tag dilampirkan per koneksi. Anda dapat melampirkan tag ke koneksi, tetapi tidak ke link repositori Git. Semua link repositori Git dalam koneksi berbagi tag koneksi.
  • Kondisi penolakan hanya mendukung tag. Kondisi dalam aturan penolakan hanya dapat menggunakan fungsi tag, seperti resource.matchTag() dan resource.hasTagKey(). Anda tidak dapat menulis kondisi penolakan berdasarkan nama repositori atau atribut resource lainnya. Untuk mengetahui detailnya, lihat Ketentuan penolakan.
  • Kunci tag harus memiliki namespace. Di resource.matchTag(), identifikasi kunci tag berdasarkan nama dengan namespace, seperti ORGANIZATION_ID/scm-agent-access atau PROJECT_ID/scm-agent-access, bukan berdasarkan nama pendeknya.
  • Perubahan memerlukan waktu untuk diterapkan. Binding tag baru, nilai tag yang diubah, dan kebijakan penolakan tidak langsung berlaku, dan menghapus tag tidak langsung memulihkan akses. Tunggu beberapa menit untuk setiap perubahan, dan uji konfigurasi Anda sebelum mengandalkannya.
  • Tag yang berlaku tercantum di koneksi. Untuk melihat tag yang berlaku untuk link repositori Git, cantumkan tag yang efektif dari koneksi induknya.

Langkah berikutnya