Kami memiliki pengaturan berikut:
- Database produksi berganda yang berisi data pribadi yang digunakan oleh perangkat lunak desktop
- Database web untuk situs web publik yang memerlukan beberapa data dari database pribadi
- Database perantara yang berisi beberapa tampilan dan prosedur tersimpan yang menarik data dari database pribadi
Saat ini situs web login ke database web, dan database web terhubung ke database perantara untuk menarik data atau menjalankan prosedur yang tersimpan pada database produksi. Semua database menggunakan instance SQL yang sama, dan seluruh proses menggunakan akun pengguna yang sama.
Akun pengguna memiliki akses penuh ke basis data web dan basis data perantara, tetapi hanya dapat mengakses tampilan spesifik dan prosedur tersimpan dan basis data pribadi
Apakah ini benar-benar lebih aman daripada hanya membuat database publik terhubung langsung ke yang pribadi?
Sepertinya database perantara hanya ada untuk mempersulit hal-hal karena login yang sama digunakan untuk mengakses data di semua database, dan itu sudah terbatas hanya pada pandangan / SP yang dibutuhkan dalam database pribadi. Saya berharap untuk menghapusnya.
sumber
Jawaban:
Satu hal muncul di sini:
Masalah
Jadi userX hipotetis (apakah beberapa meatsack menggunakan Excel, atau IIS AppPool Identity) dapat melihat beberapa tampilan dan kode. Tidak masalah apa basis data yang dilihat dan kode ini karena userX diatur dalam 3 database.
Namun, Anda kehilangan rantai kepemilikan seperti ini.
Katakanlah
WebDB.dbo.SomeProc
panggilanPrivateDB.dbo.SomeTable
. UserX membutuhkan izin pada kedua objek. Jika iniOneDB.WebGUI.SomeProc
menggunakanOneDB.dbo.SomeTable
maka hanyaOneDB.WebGUI.SomeProc
izin kebutuhan. Izin pada objek yang direferensikan dengan pemilik yang sama tidak dicentang.Catatan: Saya belum melihat terlalu dalam pada chaining kepemilikan database silang . Saya hanya tahu "rantai kepemilikan" lama dengan baik
Sekarang, sesuai komentar Anda benar-benar memiliki 2 database yang dapat digabungkan. Bukan 3 yang awalnya tersirat. Namun, perantara dan web dapat digabungkan.
Basis data "pribadi" lainnya mungkin dapat digabungkan, tetapi itu akan menjadi masalah tersendiri. Lihat tautan bawah untuk diskusi yang lebih lengkap tentang "satu database atau banyak"
Larutan?
Jika database tambahan hanya merupakan wadah kode, maka skema adalah ide yang lebih baik.
Ini kedengarannya seperti Anda telah menggunakan "Database" di mana Anda harus menggunakan "Skema" (dalam arti SQL Server, bukan pengertian MySQL). Saya akan memiliki skema WebGUI, skema Helper atau Common (untuk menggantikan database Intermediate) dan skema Desktop. Dengan cara ini Anda memisahkan izin berdasarkan klien dan hanya memiliki satu basis data
Dengan satu basis data (selain "rantai kepemilikan") Anda juga dapat mulai mempertimbangkan tampilan yang diindeks, SCHEMABINDING (Saya selalu menggunakannya) dan sedemikian rupa sehingga tidak dapat dilakukan dengan basis data terpisah
Untuk lebih lanjut tentang skema, lihat pertanyaan ini:
Akhirnya, tampaknya tidak ada alasan untuk memiliki database terpisah berdasarkan "integritas transaksional tidak diperlukan". Lihat pertanyaan ini untuk menjelaskan ini: Kriteria keputusan kapan harus menggunakan skema non-dbo vs Database baru
sumber
Jawabannya adalah, tergantung. Jika database pribadi tidak diakses dari luar LAN internal (atau hanya melalui VPN), skema ini menambah keamanan karena seseorang yang menggunakan kredensial WebSite hanya akan memiliki akses terbatas ke DB Server pribadi itu (dan akan memiliki lebih banyak pekerjaan untuk didapatkan ke dalam jaringan internal Anda - waktu yang berguna untuk menemukan intrusi dan menutup lubang).
Jika tidak, saya tidak berpikir itu menambah apa pun kecuali kompleksitas.
EDIT:
Sepertinya saya salah membaca pertanyaan Anda, jadi mari kita lihat apakah saya mengerti dengan benar sekarang: IntermDb adalah database kosong hanya untuk terhubung ke PrivateDB ATAU itu adalah DB yang memiliki pandangan / prosedur sendiri yang menghubungkan ke PrivateDB untuk mengambil data ?
Dalam kasus pertama, WTF? Merobek, mencabik. Tidak ada artinya, kecuali seseorang ingin mengauditnya untuk akses profil ke PrivateDB dengan cara yang lebih malas (dan membuat pengembang WebApp bekerja lebih keras). SQL Profiler dapat memfilter menggunakan DB_ID ...
Dalam kasus kedua, saya mendukung jawaban saya sebelumnya.
EDIT: "Saya masih tidak melihat bagaimana ini lebih aman daripada menghubungkan private db langsung ke public db karena ketiga database aktif pada contoh SQL yang sama dan login yang digunakan untuk ketiga database adalah sama, dan hanya dapat mengakses pandangan spesifik dan prosedur tersimpan dalam db pribadi. "
Memiliki perantara berarti bahwa penyerang harus menggali dalam kode Anda mengetahui keberadaan IntermDB - dan itu harus menggali kode Anda di atasnya untuk mengetahui bahwa ada PrivateDB.
Jika Anda meletakkan PrivateDB di server lain internal ke LAN / WAN organisasi Anda (jika mungkin), ini dapat memberi waktu yang cukup bagi admin untuk mendeteksi dan memblokir upaya invasi. Jika Anda menggunakan sinonim, langkah ini lancar karena yang Anda miliki adalah membangunnya kembali ke kode yang ada, pergi ke tempat yang tepat.
Anda juga mendapatkan keuntungan lain: karena semua kode harus melewati IntermDB untuk mengakses data di PrivateDB, tidak ada pengembang yang tergoda untuk mencoba memintasnya - dan upaya itu dapat dengan mudah terlihat pada SQL Server Profiler sebagai DB_ID dari permintaan data PrivateDb akan menjadi WebAppDb.
sumber