Resource Access Management (RAM) menyediakan kebijakan sistem untuk skenario kontrol akses umum. Jika kebijakan sistem tidak mencukupi tingkat granularitas yang Anda butuhkan, buat kebijakan kustom untuk menerapkan prinsip least-privilege terhadap resource ApsaraMQ for RabbitMQ.
Profil izin umum
Sebelum menulis kebijakan dari awal, identifikasi pola akses yang sesuai dengan kasus penggunaan Anda.
| Pola akses | Cakupan | Contoh kebijakan |
|---|---|---|
| Hanya publikasi | Satu vhost | Contoh 2: Publikasikan pesan |
| Hanya konsumsi | Satu vhost | Contoh 3: Konsumsi pesan |
| Publikasi dan konsumsi | Satu vhost | Contoh 4: Publikasi dan konsumsi pesan |
| Pesan lengkap | Satu vhost (termasuk manajemen kredensial) | Contoh 1: Akses pesan lengkap ke vhost |
| Manajemen kredensial | Satu instans | Contoh 5: Kelola kredensial akun statis |
| Pembuatan instans | Seluruh akun | Contoh 6: Buat instans |
| Pembuatan instans terbatas | Seluruh akun, dengan kondisi | Contoh 7: Buat instans Edisi Platinum tanpa akses internet |
| Administrasi instans lengkap | Satu instans | Contoh 8: Akses penuh ke satu instans |
Dasar-dasar kebijakan kustom
Berbeda dengan kebijakan sistem yang dikelola oleh Alibaba Cloud, kebijakan kustom menjadi tanggung jawab Anda untuk membuat dan memelihara.
Lampiran: Lampirkan kebijakan kustom ke Pengguna RAM, kelompok, atau Peran RAM untuk menerapkan izin tersebut.
Penghapusan: Lepaskan kebijakan dari semua entitas sebelum menghapusnya. Kebijakan yang tidak tersambung dapat dihapus langsung.
Pengelolaan versi: RAM menyediakan kontrol versi untuk kebijakan kustom. Kelola versi kebijakan melalui konsol atau API RAM.
Operasi terkait
Format ARN resource
Semua resource ApsaraMQ for RabbitMQ menggunakan format Nama Sumber Daya Alibaba Cloud (ARN) berikut:
acs:amqp:$region:$accountid:/instances/$instanceId/...| Variabel | Deskripsi | Contoh |
|---|---|---|
$region | Wilayah tempat resource berada. Gunakan * untuk semua wilayah. | cn-hangzhou |
$accountid | ID akun Alibaba Cloud. Gunakan * untuk akun apa pun. | 1234567890 |
$instanceId | ID instans ApsaraMQ for RabbitMQ | amqp-cn-xxxxx |
$vhostName | Nama vhost | my-vhost |
$exchangeName | Nama exchange | my-exchange |
$queueName | Nama antrian | my-queue |
Hierarki resource
instances/
├── $instanceId/
│ ├── vhosts/
│ │ └── $vhostName/
│ │ ├── exchanges/
│ │ │ └── $exchangeName/
│ │ │ └── messages/*
│ │ └── queues/
│ │ └── $queueName/
│ │ └── messages/*
│ └── staticAccount/*Untuk wilayah yang didukung, lihat Endpoints.
Referensi aksi
Aksi ApsaraMQ for RabbitMQ terbagi menjadi dua kategori: aksi API client untuk operasi protokol AMQP, dan aksi konsol dan OpenAPI untuk operasi manajemen melalui konsol dan API.
Aksi API client
| Client API | Aksi | Resource | Deskripsi |
|---|---|---|---|
| exchange.declare (passive=false) | amqp:CreateExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | Mendeklarasikan exchange. Membuat exchange jika belum ada. Jika exchange sudah ada, memvalidasi propertinya dan mengembalikan error jika tidak sesuai. |
| exchange.declare (passive=true) | amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName | Memeriksa apakah exchange ada. Mengembalikan error jika exchange tidak ada. |
| exchange.bind | amqp:GetExchange (sumber) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName (sumber) | Mengikat exchange sumber ke exchange tujuan. |
amqp:CreateExchange (tujuan) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* (tujuan) | ||
| exchange.unbind | amqp:GetExchange (sumber) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName (sumber) | Melepas ikatan exchange sumber dari exchange tujuan. |
amqp:CreateExchange (tujuan) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* (tujuan) | ||
| queue.declare (passive=false) | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Mendeklarasikan antrian. Membuat antrian jika belum ada. Jika antrian sudah ada, memvalidasi propertinya dan mengembalikan error jika tidak sesuai. |
| queue.declare (passive=true) | amqp:GetQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName | Memeriksa apakah antrian ada. Mengembalikan error jika antrian tidak ada. |
| queue.declare (dengan dead-letter exchange) | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Mendeklarasikan antrian yang terikat ke dead-letter exchange. |
amqp:GetQueue | acs:amqp:$region:$accountid:/vhosts/$vhostName/queues/$queueName | ||
amqp:CreateExchange (dead-letter) | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName (dead-letter) | ||
| queue.bind | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Mengikat antrian ke exchange. |
amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName | ||
| queue.unbind | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Melepas ikatan antrian dari exchange. |
amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName | ||
| BasicRecover | amqp:BasicRecover | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Mengirim ulang pesan yang belum diakui ke consumer. |
| BasicCancel | amqp:BasicCancel | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Membatalkan langganan consumer. |
| BasicPublish | amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName/messages/* | Mempublikasikan pesan ke exchange. |
| BasicConsume | amqp:BasicConsume | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Memulai consumer pada antrian. |
| BasicAck | amqp:BasicAck | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengakui satu atau beberapa pesan. |
| BasicNack | amqp:BasicNack | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Menolak satu atau beberapa pesan. |
| BasicReject | amqp:BasicReject | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Menolak satu pesan. |
| BasicGet | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengakses langsung pesan dalam antrian. |
Aturan pencocokan wildcard RAM
Wildcard (*) dalam kebijakan RAM mencocokkan berdasarkan awalan nama Aksi. amqp:Get* mencocokkan setiap Aksi yang dimulai dengan Get (seperti amqp:GetInstance atau amqp:GetQueue), tetapi tidak mencocokkan Aksi yang dimulai dengan kata lain. amqp:BasicGet dimulai dengan Basic, sehingga tidak dicocokkan oleh amqp:Get*. Untuk memanggil BasicGet guna mengonsumsi pesan, Anda harus secara eksplisit menambahkan amqp:BasicGet ke daftar Aksi.
Error izin umum dan Aksi yang diperlukan
Jika panggilan API mengembalikan UnauthorizedOperation dan AccessDeniedDetail menampilkan NoPermissionType=ImplicitDeny, kebijakan tersebut kekurangan Aksi yang diperlukan. Skenario umum adalah mengonfigurasi amqp:Get* tanpa menambahkan amqp:BasicGet. Dalam kasus ini, tambahkan secara eksplisit amqp:BasicGet.
Contoh kebijakan:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:Get*",
"amqp:List*",
"amqp:BasicGet"
],
"Resource": "*"
}
]
}Aksi konsol dan OpenAPI
| Operasi API | Aksi | Resource | Deskripsi |
|---|---|---|---|
| ListInstances | amqp:ListInstance | acs:amqp:$region:$accountid:/instances/* | Menanyakan daftar instans. |
| CreateInstance | amqp:CreateInstance | acs:amqp:$region:$accountid:/instances/* | Membuat instans. Mendukung kunci kondisi. |
| DeleteInstance | amqp:DeleteInstance | acs:amqp:$region:$accountid:/instances/$instanceId | Menghapus instans. |
| GetInstance | amqp:GetInstance | acs:amqp:$region:$accountid:/instances/$instanceId | Menampilkan Instans. |
| ListVhost | amqp:ListVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/* | Menanyakan daftar vhost. |
| CreateVhost | amqp:CreateVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/* | Membuat vhost. |
| DeleteVhost | amqp:DeleteVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName | Menghapus vhost. Juga memerlukan amqp:GetInstance pada instans. |
| ListExchange | amqp:ListExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | Menanyakan daftar exchange. Juga memerlukan amqp:GetInstance pada instans. |
| CreateExchange | amqp:CreateExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | Membuat exchange. |
| DeleteExchange | amqp:DeleteExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName | Menghapus exchange. |
| ListQueue | amqp:ListQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Menanyakan daftar antrian. Juga memerlukan amqp:GetInstance pada instans. |
| CreateQueue | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | Membuat antrian. |
| DeleteQueue | amqp:DeleteQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName | Menghapus antrian. |
| QueuePurge | amqp:QueuePurge | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Membersihkan antrian. |
| ListStaticAccounts | amqp:ListStaticAccounts | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | Melihat username dan password. Juga memerlukan amqp:GetInstance pada instans. |
| FetchStaticAccount | amqp:FetchStaticAccount | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | Membuat username dan password. Juga memerlukan amqp:GetInstance pada instans. |
| DeleteStaticAccount | amqp:DeleteStaticAccount | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | Menghapus username dan password. |
| Kueri pesan berdasarkan antrian | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengakses pesan dalam antrian. |
| Kueri pesan berdasarkan ID pesan | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengakses pesan dalam antrian. |
| Kirim ulang pesan | amqp:BasicGet, amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengirim ulang pesan. |
| Kirim pesan | amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | Mengirim pesan. |
Kunci kondisi untuk CreateInstance
Aksi CreateInstance mendukung kunci kondisi berikut untuk membatasi pembuatan instans. Untuk informasi lebih lanjut, lihat Condition.
| Kunci kondisi | Tipe | Nilai valid | Deskripsi |
|---|---|---|---|
amqp:InstanceType | String | enterprise (Edisi Perusahaan), vip (Edisi Platinum) | Membatasi edisi instans yang dapat dibuat oleh identitas RAM. |
amqp:SupportEIP | String | true, false | Membatasi apakah instans mendukung akses internet. |
Kebijakan sistem
Resource Access Management (RAM) menyediakan kebijakan sistem berikut untuk ApsaraMQ for RabbitMQ:
| Nama kebijakan | Deskripsi | Granularitas |
|---|---|---|
AliyunAMQPFullAccess | Memberikan izin manajemen penuh atas ApsaraMQ for RabbitMQ (Action: amqp:*, Resource: *). | Seluruh akun |
PowerUserAccess | Memberikan akses penuh ke layanan dan resource Alibaba Cloud melalui pernyataan NotAction yang mengecualikan operasi administratif seperti RAM, IMS, dan lainnya. amqp:* tidak termasuk dalam daftar pengecualian, sehingga kebijakan ini juga memberikan izin penuh untuk ApsaraMQ for RabbitMQ. | Seluruh akun |
Kedua kebijakan sistem berlaku untuk seluruh akun dan tidak dapat dibatasi cakupannya ke antrian tertentu. Untuk memberikan izin detail halus tingkat antrian, buat kebijakan kustom dan tentukan ARN antrian pada bidang Resource. Untuk contoh, lihat Contoh 9: Berikan akses berbeda kepada Pengguna RAM untuk antrian berbeda di bagian akhir topik ini.
Contoh kebijakan
Ganti variabel placeholder dalam contoh berikut dengan nilai aktual Anda. Untuk detail setiap variabel, lihat Format ARN resource.
Contoh 1: Akses pesan lengkap ke vhost
Memberikan izin untuk mempublikasikan, mengonsumsi, dan mengelola exchange, antrian, serta kredensial akun statis dalam vhost tertentu.
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:ListVhost",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName",
"acs:amqp:*:*:/instances/$instanceId/vhosts/*"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListExchange",
"amqp:CreateExchange",
"amqp:DeleteExchange",
"amqp:ListQueue",
"amqp:DeleteQueue",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicPublish",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
},
{
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*",
"Effect": "Allow"
}
]
}Contoh 2: Publikasikan pesan
Memberikan izin minimum bagi client produsen untuk mempublikasikan pesan ke exchange dalam vhost tertentu: mendeklarasikan exchange dan antrian, mempublikasikan pesan, serta mengakui pengiriman.
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:CreateExchange",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}Contoh 3: Konsumsi pesan
Memberikan izin minimum bagi client konsumen untuk mengonsumsi pesan dari antrian dalam vhost tertentu: mendeklarasikan exchange dan antrian, mengonsumsi pesan, serta mengelola pengakuan.
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:CreateExchange",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}Contoh 4: Publikasi dan konsumsi pesan
Memberikan izin untuk mempublikasikan dan mengonsumsi pesan dalam vhost tertentu. Menggabungkan aksi dari Contoh 2 dan Contoh 3.
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListExchange",
"amqp:CreateExchange",
"amqp:DeleteExchange",
"amqp:ListQueue",
"amqp:DeleteQueue",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicPublish",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}Contoh 5: Kelola kredensial akun statis
Memberikan izin untuk menampilkan, membuat, dan menghapus kredensial akun statis (pasangan username dan password) untuk instans tertentu.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*"
},
{
"Effect": "Allow",
"Action": "amqp:GetInstance",
"Resource": "acs:amqp:*:*:/instances/$instanceId"
}
]
}Contoh 6: Buat instans
Memberikan izin untuk membuat instans ApsaraMQ for RabbitMQ edisi apa pun di wilayah mana pun.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "amqp:CreateInstance",
"Resource": "acs:amqp:*:$accountid:/instances/*"
}
]
}Contoh 7: Buat instans Edisi Platinum tanpa akses internet
Menggunakan kunci kondisi untuk membatasi pembuatan instans hanya ke instans Edisi Platinum (vip) yang tidak mendukung akses internet (SupportEIP: false).
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "amqp:CreateInstance",
"Resource": "acs:amqp:*:$accountid:/instances/*",
"Condition": {
"StringEquals": {
"amqp:InstanceType": [
"vip"
],
"amqp:SupportEIP": [
"false"
]
}
}
}
]
}Contoh 8: Akses penuh ke satu instans
Memberikan semua izin ApsaraMQ for RabbitMQ pada satu instans, termasuk manajemen vhost, operasi pesan, dan manajemen akun statis. Aksi amqp:ListInstance dibatasi cakupannya ke semua instans agar instans target muncul dalam daftar instans di konsol.
{
"Version": "1",
"Statement": [
{
"Action": "amqp:ListInstance",
"Resource": "acs:amqp:*:*:/instances/*",
"Effect": "Allow"
},
{
"Action": "amqp:*",
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/*"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*",
"Effect": "Allow"
}
]
}Contoh 9: Berikan akses berbeda kepada Pengguna RAM untuk antrian berbeda
Untuk memberikan akses Pengguna RAM A hanya ke Antrian A dan Pengguna RAM B hanya ke Antrian B, buat dua kebijakan kustom terpisah dan sambungkan masing-masing ke Pengguna RAM yang sesuai. Setiap Pengguna RAM kemudian hanya dapat melakukan aksi yang diizinkan pada antrian yang ditentukan dalam kebijakannya.
Kebijakan untuk Pengguna RAM A (memberikan akses ke queueA):
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:BasicConsume",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetQueue"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/queues/queueA"
]
}
]
}Untuk Pengguna RAM B, buat kebijakan kedua yang identik kecuali nilai Resource mengarah ke queueB, lalu sambungkan ke Pengguna RAM B:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:BasicConsume",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetQueue"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/queues/queueB"
]
}
]
}