Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Applies to:SQL Server
Objek database terkelola, seperti prosedur atau pemicu tersimpan, dikompilasi lalu disebarkan dalam unit yang disebut assembly. Rakitan DLL terkelola harus didaftarkan di SQL Server sebelum fungsionalitas yang disediakan perakitan dapat digunakan. Untuk mendaftarkan rakitan dalam database SQL Server, gunakan pernyataan CREATE ASSEMBLY. Artikel ini membahas cara mendaftarkan rakitan dalam database menggunakan pernyataan CREATE ASSEMBLY, dan cara menentukan pengaturan keamanan untuk perakitan.
Keamanan akses kode tidak lagi didukung
Runtime bahasa umum menggunakan Keamanan Akses Kode (CAS) dalam .NET Framework, yang tidak lagi didukung sebagai batas keamanan. Rakitan CLR yang dibuat dengan PERMISSION_SET = SAFE mungkin dapat mengakses sumber daya sistem eksternal, memanggil kode yang tidak dikelola, dan memperoleh hak istimewa sysadmin. Di SQL Server 2017 (14.x) dan versi yang lebih baru, sp_configure opsi, keamanan ketat clr, meningkatkan keamanan rakitan CLR.
clr strict security diaktifkan secara default, dan memperlakukan SAFE dan EXTERNAL_ACCESS rakitan seolah-olah ditandai UNSAFE. Opsi clr strict security dapat dinonaktifkan untuk kompatibilitas mundur, tetapi tidak disarankan.
Kami menyarankan agar Anda menandatangani semua rakitan dengan sertifikat atau kunci asimetris, dengan login terkait yang telah diberikan UNSAFE ASSEMBLY izin dalam master database. Administrator SQL Server juga dapat menambahkan rakitan ke daftar rakitan, yang harus dipercaya oleh Mesin Database. For more information, see sys.sp_add_trusted_assembly.
Pernyataan CREATE ASSEMBLY
Pernyataan CREATE ASSEMBLY digunakan untuk membuat rakitan dalam database. Berikut adalah contohnya:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
Klausa FROM menentukan nama jalur rakitan yang akan dibuat. Jalur ini dapat berupa jalur Universal Naming Convention (UNC) atau jalur file fisik yang bersifat lokal ke komputer.
SQL Server tidak mengizinkan pendaftaran versi rakitan yang berbeda dengan nama, budaya, dan kunci publik yang sama.
Dimungkinkan untuk membuat rakitan yang mereferensikan rakitan lain. Ketika rakitan dibuat di SQL Server, SQL Server juga membuat rakitan yang direferensikan oleh rakitan tingkat akar, jika rakitan yang direferensikan belum dibuat ke dalam database.
Pengguna database atau peran pengguna diberi izin untuk membuat, dan karenanya memiliki, rakitan dalam database. Untuk membuat rakitan, pengguna atau peran database harus memiliki izin CREATE ASSEMBLY.
Rakitan hanya dapat berhasil merujuk rakitan lain jika:
- Rakitan yang disebut atau direferensikan, dimiliki oleh pengguna atau peran yang sama.
- Rakitan yang dipanggil atau direferensikan, dibuat dalam database yang sama.
Tentukan keamanan saat membuat rakitan
Saat membuat rakitan ke dalam database SQL Server, Anda dapat menentukan salah satu dari tiga tingkat keamanan yang berbeda di mana kode Anda dapat berjalan: SAFE, EXTERNAL_ACCESS, atau UNSAFE. Ketika pernyataan CREATE ASSEMBLY dijalankan, pemeriksaan tertentu dilakukan pada rakitan kode, yang dapat menyebabkan perakitan gagal mendaftar di server.
SAFE adalah kumpulan izin default dan berfungsi untuk sebagian besar skenario. Untuk menentukan tingkat keamanan tertentu, Anda mengubah sintaks pernyataan CREATE ASSEMBLY sebagai berikut:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
Anda juga dapat membuat rakitan dengan izin SAFE yang ditetapkan dengan menghilangkan baris ketiga sebelumnya.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
Ketika kode dalam rakitan berjalan di bawah kumpulan izin SAFE, kode hanya dapat melakukan akses komputasi dan data dalam server melalui penyedia terkelola dalam proses.
Membuat rakitan EXTERNAL_ACCESS dan TIDAK AMAN
EXTERNAL_ACCESS membahas skenario di mana kode perlu mengakses sumber daya di luar server, seperti file, jaringan, registri, dan variabel lingkungan. Setiap kali server mengakses sumber daya eksternal, server meniru konteks keamanan pengguna yang memanggil kode terkelola.
UNSAFE izin kode adalah untuk situasi di mana perakitan tidak benar-benar aman atau memerlukan akses tambahan ke sumber daya terbatas, seperti API Win32.
Untuk membuat rakitan EXTERNAL_ACCESS atau UNSAFE di SQL Server, salah satu dari dua kondisi berikut harus dipenuhi:
Rakitan adalah nama kuat yang ditandatangani atau Authenticode ditandatangani dengan sertifikat. Nama kuat (atau sertifikat) ini dibuat di dalam SQL Server sebagai kunci asimetris (atau sertifikat), dan memiliki login yang sesuai dengan izin
EXTERNAL ACCESS ASSEMBLY(untuk rakitan akses eksternal) atau izinUNSAFE ASSEMBLY(untuk rakitan yang tidak aman).Pemilik database (DBO) memiliki izin
EXTERNAL ACCESS ASSEMBLY(untuk rakitanEXTERNAL ACCESS) atauUNSAFE ASSEMBLY(untuk rakitanUNSAFE), dan database memiliki properti database TRUSTWORTHY diatur keON.
Dua kondisi yang tercantum sebelumnya juga diperiksa pada waktu pemuatan perakitan (yang mencakup eksekusi). Setidaknya salah satu kondisi harus dipenuhi untuk memuat rakitan.
Kami menyarankan agar properti database TRUSTWORTHY pada database tidak diatur ke ON hanya untuk menjalankan kode runtime bahasa umum (CLR) dalam proses server. Sebagai gantinya, kami menyarankan agar kunci asimetris dibuat dari file rakitan dalam database master. Login yang dipetakan ke kunci asimetris ini kemudian harus dibuat, dan login harus diberikan izin EXTERNAL ACCESS ASSEMBLY atau UNSAFE ASSEMBLY.
Pernyataan Transact-SQL berikut melakukan langkah-langkah yang diperlukan untuk membuat kunci asimetris, memetakan login ke kunci ini, lalu memberikan izin EXTERNAL_ACCESS ke login. Anda harus menjalankan pernyataan Transact-SQL berikut sebelum menjalankan pernyataan CREATE ASSEMBLY.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey
FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin
FROM ASYMMETRIC KEY SQLCLRTestKey;
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
GO
Note
Anda harus membuat login baru untuk mengaitkan dengan kunci asimetris. Login ini hanya digunakan untuk memberikan izin. Ini tidak harus dikaitkan dengan pengguna, atau digunakan dalam aplikasi.
Untuk membuat rakitan EXTERNAL ACCESS, pembuat perlu menentukan izin EXTERNAL ACCESS saat membuat rakitan:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
Pernyataan Transact-SQL berikut melakukan langkah-langkah yang diperlukan untuk membuat kunci asimetris, memetakan login ke kunci ini, lalu memberikan izin UNSAFE ke login. Anda harus menjalankan pernyataan Transact-SQL berikut sebelum menjalankan pernyataan CREATE ASSEMBLY.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey
FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin
FROM ASYMMETRIC KEY SQLCLRTestKey;
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin;
GO
Untuk menentukan bahwa rakitan dimuat dengan izin UNSAFE, Anda menentukan kumpulan izin UNSAFE saat memuat rakitan ke server:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
Untuk informasi selengkapnya tentang izin untuk setiap pengaturan, lihat keamanan integrasi CLR.
Related content
- Mengelola rakitan integrasi CLR
- Mengubah rakitan
- Jatuhkan assembly
- Keamanan akses kode integrasi CLR
- properti database
TRUSTWORTHY