Kontrol akses yang sangat terperinci untuk antrean

Halaman ini menjelaskan cara kerja kontrol akses terperinci dengan antrean Spanner untuk database dialek GoogleSQL dan database dialek PostgreSQL.

Di Spanner, antrean ditentukan sebagai objek skema. Akses untuk mengirim pesan, menerima pesan, memperpanjang masa berlaku pesan, mengonfirmasi dan menghapus pesan, atau mengkueri antrean secara langsung sesuai dengan peran dan hak istimewa database Spanner standar.

Pemberian untuk mengirim pesan (produsen)

Untuk mengirim pesan ke antrean menggunakan DML (INSERT INTO) atau Mutation API (lihat Pernyataan insert), berikan hak istimewa INSERT pada antrean ke peran database:

GoogleSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;

Untuk mencabut hak istimewa:

GoogleSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

Pemberian izin untuk menerima pesan (konsumen)

Untuk mengalirkan pesan dari antrean, pekerja konsumen menjalankan fungsi bernilai tabel (TVF) RECEIVE_QUEUE_NAME() dengan ExecuteStreamingSQL.

Untuk mengizinkan peran database melakukan streaming pesan dari antrean, berikan EXECUTE pada fungsi RECEIVE_QUEUE_NAME yang dibuat secara otomatis:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;

Untuk mencabut hak istimewa:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;

Panggilan RECEIVE_QUEUE_NAME() hanya memerlukan EXECUTE di TVF; tidak memerlukan SELECT di antrean.

Memperpanjang masa sewa pesan

Saat konsumen menerima pesan, Spanner akan menetapkan masa berlaku awal selama 10 detik. Jika pemrosesan pesan membutuhkan waktu lebih lama daripada masa sewa awal, konsumen harus memperpanjang masa sewa menggunakan TVF RENEWLEASE_QUEUE_NAME().

Untuk memperpanjang masa berlaku, peran harus memiliki EXECUTE pada fungsi RENEWLEASE_QUEUE_NAME:

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;

Untuk mencabut hak istimewa:

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;

Panggilan RENEWLEASE_QUEUE_NAME() hanya memerlukan EXECUTE di TVF; tidak memerlukan SELECT di antrean.

Untuk mengetahui informasi selengkapnya tentang menerima pesan dan memperpanjang masa berlaku, lihat Menggunakan antrean.

Pemberian untuk mengkueri antrean secara langsung

Untuk membaca atau memeriksa pesan langsung dari antrean menggunakan SQL standar (SELECT * FROM QUEUE_NAME) atau Read API, berikan hak istimewa SELECT pada antrean:

GoogleSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;

Untuk mencabut hak istimewa:

GoogleSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

Pemberian SELECT pada antrean memungkinkan kueri antrean sebagai tabel, tetapi tidak memberikan EXECUTE pada RECEIVE_QUEUE_NAME() atau RENEWLEASE_QUEUE_NAME().

Pemberian izin untuk mengonfirmasi dan menghapus pesan

Untuk mengonfirmasi atau menghapus pesan dari antrean menggunakan DML (DELETE FROM) atau Mutation API (Ack atau Delete), berikan hak istimewa DELETE pada antrean:

GoogleSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;

Untuk mencabut hak istimewa:

GoogleSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;

Hak istimewa yang diperlukan untuk operasi antrean

Tabel berikut merangkum hak istimewa yang diperlukan untuk operasi antrean umum:

Operasi Hak istimewa yang diperlukan
Mengirim pesan (DML INSERT atau Mutation API Send) INSERT dalam antrean
Menerima pesan (RECEIVE_QUEUE_NAME() TVF) EXECUTE pada fungsi RECEIVE_QUEUE_NAME
Memperpanjang masa berlaku pesan (RENEWLEASE_QUEUE_NAME() TVF) EXECUTE pada fungsi RENEWLEASE_QUEUE_NAME
Mengonfirmasi atau menghapus pesan (DML DELETE atau Mutation API Ack atau Delete) DELETE dalam antrean
Membaca data antrean secara langsung (SQL SELECT atau Read API) SELECT dalam antrean

Contoh: Mengonfigurasi peran produsen dan konsumen

Contoh berikut mengonfigurasi peran database terpisah untuk produsen, konsumen, dan auditor pada antrean bernama OrdersQueue:

GoogleSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;

PostgreSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;

INFORMATION_SCHEMA tampilan untuk antrean

Tampilan berikut menunjukkan informasi peran dan hak istimewa database untuk antrean:

Karena Spanner memodelkan antrean sebagai objek skema tingkat tabel, hak istimewa yang diberikan pada antrean muncul di TABLE_PRIVILEGES. Hak istimewa yang diberikan pada fungsi bernilai tabel antrean muncul di ROUTINE_PRIVILEGES.

Baris dalam tampilan ini difilter berdasarkan hak istimewa peran database saat ini. Hal ini memastikan bahwa akun utama hanya dapat melihat peran, hak istimewa, dan antrean yang dapat diaksesnya.

Pemfilteran baris juga berlaku untuk tampilan metadata antrean berikut:

GoogleSQL

  • INFORMATION_SCHEMA.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

Pemfilteran baris juga berlaku untuk tampilan metadata fungsi bernilai tabel antrean (RECEIVE_QUEUE_NAME dan RENEWLEASE_QUEUE_NAME):

Peran sistem spanner_info_reader dan anggotanya selalu melihat INFORMATION_SCHEMA yang tidak difilter.

Peringatan dan pertimbangan

  • Hak istimewa yang berbeda untuk eksekusi TVF dan kueri antrean langsung: Memberikan SELECT pada antrean tidak memberikan EXECUTE pada fungsi bernilai tabel (RECEIVE_QUEUE_NAME atau RENEWLEASE_QUEUE_NAME) terkait. Demikian pula, memberikan EXECUTE pada TVF tidak memberikan SELECT pada antrean.

    • Jika peran yang hanya memiliki SELECT dalam antrean mencoba menjalankan RECEIVE_QUEUE_NAME(), Spanner akan menampilkan error yang menyatakan bahwa peran tersebut tidak memiliki hak istimewa yang diperlukan pada fungsi tabel RECEIVE_QUEUE_NAME.
    • Jika peran dengan hanya EXECUTE di TVF mencoba menjalankan SELECT * FROM QUEUE_NAME, Spanner akan menampilkan error yang menyatakan bahwa peran tidak memiliki hak istimewa yang diperlukan pada antrean QUEUE_NAME.
  • Perbedaan dari aliran perubahan: Tidak seperti aliran perubahan (yang memerlukan SELECT pada aliran dan EXECUTE pada fungsi baca), konsumen pesan antrean hanya memerlukan EXECUTE pada TVF RECEIVE. Tidak memerlukan SELECT pada antrean itu sendiri.

  • Hak istimewa tingkat kolom tidak didukung: Tidak seperti tabel, Spanner tidak mendukung hak istimewa tingkat kolom pada antrean (seperti GRANT SELECT (COLUMN_NAME) ON QUEUE). Hak istimewa harus diberikan pada objek antrean secara keseluruhan karena antrean mencakup kolom metadata sistem internal.

  • Pemisahan peran produsen dan konsumen: Sebaiknya tentukan peran database terpisah untuk produsen pesan dan konsumen pesan. Contoh:

    • Peran produser dengan hanya INSERT dalam antrean.
    • Peran konsumen dengan EXECUTE pada fungsi RECEIVE_QUEUE_NAME dan RENEWLEASE_QUEUE_NAME, serta DELETE pada antrean jika mengonfirmasi pesan dengan DELETE atau mutasi Ack.
  • Pengiriman DML Langsung vs. TVF dalam antrean: Pernyataan DELETE atau UPDATE langsung melewati leasing antrean dan mesin status pengiriman. Sebaiknya batasi hak istimewa ini untuk peran administratif atau pemeliharaan.

Langkah berikutnya