Saya membuat tampilan di database1 berdasarkan tabel di database2. Saya memberikan SELECT
izin kepada pengguna yang hanya memiliki akses ke database1. Pengguna tidak dapat membuat tampilan ini berfungsi karena ia tidak memiliki akun di database2. Bagaimana saya bisa mengatasi masalah ini? Saya tidak ingin membuat akun di database2.
10
TRUSTWORTHY ON
atau memiliki aplikasi masuk sebagaisa
. Rantai Kepemilikan DB danTRUSTWORTHY
ada terutama karena menjadi satu-satunya solusi pada saat itu. Tapi sekarang, bahkan jika bukan risiko besar, DB Chaining tentu saja risiko yang tidak perlu karena Modul Signing tidak sulit. Dan jika seseorang mengandalkan DB chaining dan kemudian menggunakan Dynamic SQL, mereka lebih cenderungTRUSTWORTHY ON
untuk memperbaikinya, sedangkan dengan Modul Penandatanganan itu tidak akan rusak.DB_CHAINING
tidak lebih berisiko daripada rantai kepemilikan intra-database ketika objek seharusnya berada dalam database yang sama pula.DB_CHAINING
sangat berisiko.Jawaban:
Ini mudah dilakukan dengan cara yang sangat aman menggunakan Modul Signing. Ini akan serupa dengan dua jawaban saya berikut, juga di sini di DBA.StackExchange, yang memberikan contoh melakukan hal ini:
Keamanan prosedur tersimpan dengan eksekusi sebagai, kueri basis data lintas, dan penandatanganan modul
Izin di pemicu saat menggunakan sertifikat lintas basis data
Perbedaan untuk pertanyaan khusus ini adalah bahwa ia berkaitan dengan Tampilan, dan Tampilan tidak dapat ditandatangani. Jadi, Anda perlu mengubah Tampilan menjadi Fungsi Table-Valued (TVF) multi-pernyataan karena fungsi tersebut dapat ditandatangani dan dapat diakses seperti halnya Tampilan (well, for
SELECT
access).Contoh kode berikut menunjukkan melakukan persis apa yang diminta dalam pertanyaan di mana Login / Pengguna "RestrictedUser" hanya memiliki akses ke "DatabaseA" dan belum bisa mendapatkan data dari "DatabaseB". Ini hanya berfungsi dengan memilih dari TVF yang satu ini , dan hanya karena itu ditandatangani.
Untuk mendapatkan akses lintas-basis data jenis ini saat masih menggunakan Tampilan, dan tidak memberikan izin tambahan kepada Pengguna, akan membutuhkan Pengaktifan Kepemilikan Lintas-Database. Itu jauh lebih tidak aman karena itu sepenuhnya terbuka untuk semua objek antara kedua Database (tidak dapat dibatasi untuk objek dan / atau Pengguna tertentu). Penandatanganan Modul memungkinkan TVF yang satu ini memiliki akses lintas-DB (Pengguna tidak memiliki izin, TVF memilikinya), dan Pengguna yang tidak dapat
SELECT
dari TVF tidak memiliki akses ke "DatabaseB" sama sekali.Semua langkah di atas menciptakan kembali situasi saat ini: Pengguna memiliki akses ke DatabaseA, memiliki izin untuk berinteraksi dengan objek di DatabaseA, tetapi mendapat kesalahan karena objek di DatabaseA mengakses sesuatu di DatabaseB di mana Pengguna tidak memiliki akses.
Langkah-langkah di bawah ini mengatur Modul Singing. Ini melakukan hal berikut:
SELECT
izin ke Tabel di DatabaseB untuk Pengguna berbasis SertifikatPengaturan Penandatanganan Modul:
JIKA AKSES PERLU MELALUI PANDANGAN, untuk alasan apa pun, maka Anda dapat dengan mudah membuat Tampilan yang dipilih dari TVF yang ditunjukkan di atas. Dan, dalam situasi itu,
SELECT
akses tidak perlu diberikan ke TVF, hanya ke View, seperti yang ditunjukkan di bawah ini:Dan sekarang untuk mengujinya:
Untuk info lebih lanjut tentang Penandatanganan Modul, silakan kunjungi: https://ModuleSigning.Info/
sumber
ALTER CERTIFICATE ... DROP PRIVATE KEY
maka kunci pribadi akan hilang jika Anda tidak terlebih dahulu mencadangkannya ke file menggunakan SERTIFIKAT CADANGAN . Namun, kunci publik masih adasys.certificates
. Dan kunci publik tidak perlu kata sandi. Hanya menggunakan kunci pribadi untuk menandatangani modul memerlukan kata sandi (yang sama di seluruh server, tidak seperti saat melindungi melalui kunci utama).