Pengguna dan pengguna sesi yang diotorisasi

Berlaku untuk:Ditandai centang ya Databricks SQL Ditandai centang ya Databricks Runtime

Saat Azure Databricks menjalankan pernyataan SQL, ia melacak dua pengguna yang berbeda:

  • Pengguna sesi: pengguna yang terhubung ke Azure Databricks dan mengeluarkan pernyataan. Pengguna sesi diperbaiki selama masa pakai koneksi SQL. Ini tidak berubah saat pernyataan berjalan, bahkan ketika pernyataan mencapai tampilan, SQL UDF, atau prosedur tersimpan.
  • Pengguna yang berwenang: pengguna yang hak istimewanya diperiksa ketika pernyataan yang sedang dijalankan membaca atau menulis objek. Pengguna yang berwenang dapat berubah saat eksekusi menyeberang ke isi tampilan, isi UDF SQL, atau SQL SECURITY DEFINER isi prosedur.

Fungsi session_user mengembalikan pengguna sesi.

Warning

Fungsi current_user dan pengguna adalah alias yang juga mengembalikan pengguna sesi, bukan pengguna yang berwenang. Di SQL standar, CURRENT_USER mengembalikan pengguna yang diotorisasi; dalam Azure Databricks tidak. Gunakan session_user untuk merujuk ke pengguna sesi secara eksplisit.

Bagaimana pengguna yang berwenang berkembang

Setiap pemanggilan tampilan, SQL UDF, atau prosedur tersimpan mendorong entri baru pada tumpukan panggilan. Pengguna yang berwenang untuk pernyataan ditentukan oleh entri tumpukan paling atas yang memperbaiki pemilik:

Objek Pengguna yang berwenang di dalam isi
View Pemilik tampilan
SQL UDF Pemilik fungsi
CREATE PROCEDURE ... SQL SECURITY DEFINER Pemilik prosedur (pendefinisi)
CREATE PROCEDURE ... SQL SECURITY INVOKER Pengguna resmi pernyataan panggilan (diwariskan)

Tampilan, SQL UDF, dan SQL SECURITY DEFINER prosedur mengatur pengguna yang berwenang ke pemilik mereka untuk semua pernyataan dalam isi. Prosedur SQL SECURITY INVOKER mewarisi pengguna yang berwenang dari pemanggilnya.

Ketika isi selesai dieksekusi dan kontrol kembali ke pemanggil, pengguna yang berwenang muncul kembali ke apa pun yang ada di situs panggilan.

Pengguna sesi, sebaliknya, tidak pernah berubah selama satu koneksi. SQL SECURITY DEFINER Di dalam isi prosedur, session_user() masih mengembalikan pengguna yang mengeluarkan pernyataan asli.

Hak istimewa diperiksa di setiap lapisan

Azure Databricks memeriksa hak istimewa terhadap pengguna yang berwenang di setiap lapisan eksekusi:

  • Pengguna sesi harus memegang EXECUTE prosedur atau fungsi tingkat atas dan SELECT pada tampilan tingkat atas. Pengguna sesi juga harus memiliki USE CATALOG dan USE SCHEMA pada kontainer induk.
  • SQL SECURITY INVOKER Di dalam isi prosedur, semua pernyataan menggunakan hak istimewa pengguna sesi, termasuk panggilan berlapis EXECUTE ke rutinitas lain.
  • SQL SECURITY DEFINER Di dalam isi prosedur, isi tampilan, atau isi UDF SQL, semua pernyataan menggunakan hak istimewa pemilik. Pengguna sesi hanya memerlukan hak istimewa untuk memanggil rutinitas luar, bukan hak istimewa pada objek yang dirujuk isi.

Example

Contoh ini menautkan tampilan, SQL UDF, dan prosedur tersimpan yang dimiliki oleh pengguna yang berbeda. Setiap lapisan membaca dari lapisan di bawah ini, sehingga otorisasi melintasi tumpukan penuh. Contohnya menggunakan tiga pengguna (Athos, Porthos, dan Aramis) dan melacak apa yang terjadi ketika Aramis, yang hanya memiliki akses ke prosedur tingkat atas, memanggil rantai.

Siapkan

Athos membuat tabel dua kolom dan memberikan akses baca Porthos:

-- Run as Athos.
> CREATE TABLE t(a INT, b INT);
> INSERT INTO t VALUES (1, 10), (2, 20), (3, 30);

> GRANT SELECT ON TABLE t TO `porthos@musketeers.fr`;

Porthos membuat tampilan di atas tabel Athos dan memberikan akses baca Athos pada tampilan:

-- Run as Porthos.
> CREATE VIEW v_p AS
    SELECT a, b * 100 AS b100 FROM t;

> GRANT SELECT ON VIEW v_p TO `athos@musketeers.fr`;

Athos membuat SQL UDF yang berbunyi dari tampilan Porthos, dan memberikan Porthos EXECUTE di atasnya:

-- Run as Athos.
> CREATE FUNCTION f_a(p INT) RETURNS INT
    RETURN (SELECT b100 FROM v_p WHERE a = p);

> GRANT EXECUTE ON FUNCTION f_a TO `porthos@musketeers.fr`;

Porthos membuat UDF SQL yang menggabungkan hasil dari UDF Athos, dan SQL SECURITY DEFINER prosedur yang mengekspos hasilnya:

-- Run as Porthos.
> CREATE FUNCTION f_p() RETURNS INT
    RETURN f_a(1) + f_a(2) + f_a(3);

> CREATE PROCEDURE p_def()
    LANGUAGE SQL
    SQL SECURITY DEFINER
    AS BEGIN
      SELECT f_p();
    END;

Athos SQL SECURITY INVOKER membuat prosedur yang memanggil prosedur Porthos:

-- Run as Athos.
> CREATE PROCEDURE p_inv()
    LANGUAGE SQL
    SQL SECURITY INVOKER
    AS BEGIN
      CALL p_def();
    END;

Akhirnya, Athos dan Porthos masing-masing memberikan Aramis apa yang dia butuhkan untuk memanggil rantai. Karena p_inv merupakan SQL SECURITY INVOKER prosedur, tubuhnya berjalan sebagai pengguna yang menyebutnya (Aramis), sehingga Aramis harus memiliki secara EXECUTE independen pada p_def:

-- Run as Athos.
> GRANT EXECUTE ON PROCEDURE p_inv TO `aramis@musketeers.fr`;

-- Run as Porthos.
> GRANT EXECUTE ON PROCEDURE p_def TO `aramis@musketeers.fr`;

Aramis tidak memiliki hak istimewa pada t, , f_av_p, atau f_p.

Aramis memanggil rantai

Masalah Aramis:

-- Run as Aramis.
> CALL p_inv();

Rantai panggilan terungkap sebagai berikut, setiap panah menyeberang ke tubuh baru:

Aramis's session
   │
   │ CALL
   ▼
p_inv()      (Athos, SQL SECURITY INVOKER)
   │
   │ CALL
   ▼
p_def()      (Porthos, SQL SECURITY DEFINER)
   │
   │ SELECT
   ▼
f_p()        (Porthos's SQL UDF)
   │
   │ invokes
   ▼
f_a(p)       (Athos's SQL UDF)
   │
   │ SELECT
   ▼
v_p          (Porthos's view)
   │
   │ SELECT
   ▼
t            (Athos's table)

Tabel berikut berjalan melalui pernyataan saat dijalankan.

Step Statement Tempat berjalannya Pengguna yang diotorisasi session_user()
1 CALL p_inv() Sesi Aramis Aramis Aramis
2 CALL p_def() Isi p_inv (SQL SECURITY INVOKER) Aramis (diwariskan dari pemanggil) Aramis
3 SELECT f_p() Isi p_def (SQL SECURITY DEFINER) Porthos (pemilik prosedur) Aramis
4 RETURN f_a(1) + f_a(2) + f_a(3) Isi SQL UDF f_p Porthos (pemilik fungsi) Aramis
5 RETURN (SELECT b100 FROM v_p WHERE a = p) Isi SQL UDF f_a Athos (pemilik fungsi) Aramis
6 SELECT a, b * 100 AS b100 FROM t Isi tampilan v_p Porthos (lihat pemilik) Aramis

Saat eksekusi melepas lelah, pengguna yang berwenang memunculkan kembali lapisan demi lapisan hingga kontrol kembali ke sesi Aramis pada langkah 1.