Saya terbiasa bekerja di lingkungan yang sangat aman dan karenanya saya merancang izin saya hingga tingkat granularitas yang sangat baik. Satu hal yang biasanya saya lakukan adalah secara eksplisit DENY
menggunakan kemampuan UPDATE
kolom yang seharusnya tidak pernah diperbarui.
Sebagai contoh:
create table dbo.something (
created_by varchar(50) not null,
created_on datetimeoffset not null
);
Dua kolom ini tidak boleh diubah begitu nilainya telah ditetapkan. Oleh karena itu saya akan secara eksplisit DENY
dalam UPDATE
izin pada mereka.
Baru-baru ini, selama pertemuan tim pengembang mengemukakan bahwa logika untuk memastikan bidang tidak pernah diperbarui harus dimuat dalam lapisan aplikasi dan bukan lapisan database jika "mereka perlu memperbarui nilai karena suatu alasan". Bagi saya itu kedengarannya seperti mentalitas dev yang khas (saya tahu, saya pernah menjadi mentalitas!)
Saya adalah arsitek senior di perusahaan saya dan saya selalu bekerja dengan prinsip paling sedikit hak istimewa yang diperlukan untuk membuat aplikasi berfungsi. Semua izin diaudit secara teratur.
Apa praktik terbaik dalam skenario ini?
sumber
Jawaban:
Argumen itu tidak masuk akal. Saya selalu ingin kontrol dan kendala sedekat mungkin dengan data. Menempatkannya di lapisan aplikasi berarti itu hanya mempengaruhi orang-orang yang menggunakan lapisan aplikasi, dan juga mengasumsikan bahwa kode tersebut akan bebas bug dan keamanan di sekitar jalur kode itu akan tahan peluru. Itu adalah asumsi besar.
Jika mereka benar-benar perlu diperbarui, maka itu dapat dilakukan oleh seseorang yang tidak terpengaruh oleh eksplisit
DENY
, atau orang tersebut dapat sementara dipindahkan ke peran yang tidak terpengaruh, atauDENY
dapat sementara dihapus. Ini adalah hal-hal yang mudah bagi Anda, sebagai DBA, untuk mengatur audit di sekitar. Dalam aplikasi? Tidak terlalu banyak.sumber
Saya sepenuhnya setuju dengan @ Harun pada aspek teknis ini.
Di luar itu saya akan mengatakan, mengenai praktik terbaik:
Mengingat bahwa adalah tugas / tanggung jawab DBA untuk melindungi data, pendekatan standar seharusnya adalah melakukan hal itu, seperti yang DBA anggap cocok, dan membutuhkan kasus bisnis yang kuat untuk melakukan perubahan. Sebuah hipotetis-potensi-masa-depan-agak-mungkin-diberikan-kondisi-tertentu-yang-akan-di-brainstormed-nanti-dan-dikonfirmasi-baik-setelah-itu-tapi-mungkin-berubah-nanti-atau-mungkin-tidak pernah Alasan sebenarnya terjadi (yaitu "karena alasan tertentu") tampaknya sedikit pembenaran, terutama ketika topik mengubah standar / praktik perusahaan.
Jangan pernah mempercayai seseorang yang ingin membuat perubahan pada sesuatu yang seharusnya tidak pernah berubah ;-), (bahkan lebih lagi jika mereka bahkan tidak tahu mengapa mereka mau).
Beri tahu pengembang bahwa mereka boleh menambahkan logika seperti itu ke kode aplikasi untuk mencegah pembaruan tersebut. Tapi, juga Anda tidak akan menghapus
DENY
. Jika / ketika hari itu tiba (dan itumungkin tidakmungkin tidak) bahwa seseorang mendapatkan kesalahan saat mencoba memperbarui salah satu kolom ini, maka Anda dapat berdiskusi tentang apakah Anda akan menghapus atau tidakDENY
, yang akan membutuhkan pembenaran yang kuat dan aktual mengapa seseorang akan memperbarui nilai tersebut di tempat pertama.Poinnya adalah: harus ada kasus bisnis nyata yang mengarahkan orang-orang menghabiskan waktu mereka. Waktu sangat diminati tetapi persediaannya sedikit, sehingga Anda (dan semua orang) memiliki hal-hal yang lebih penting untuk dilakukan daripada mengubah sistem berdasarkan pendapat seseorang. Akan selalu ada berbagai pendapat (spasi vs tab, siapa pun?) Dan Anda bisa menghabiskan waktu bertahun-tahun untuk mengubah ini dan sebagainya jika pengembang itu pergi dan digantikan oleh orang yang sangat keberatan agar bidang tersebut dapat diperbarui. Jika tidak ada pelanggan yang meminta ini (atau sesuatu yang memerlukannya), dan tidak ada manfaat nyata (bahkan manfaat tertunda seperti membersihkan utang teknis, yang sulit untuk menunjukkan ROI, tetapi sangat bernilai - sementara mengingat bahwa peluang waktu yang dihabiskan tidak menghasilkan penghematan biaya aktual dalam jangka panjang tipis ke tidak ada), kemudian tutup permintaan atau taruh di backlog dengan prioritas rendah, bahkan dalam kasus-kasus di mana idealisme mengatakan bahwa itu harus diubah (ini bukan salah satu dari kasus-kasus itu, tetapi disebutkan untuk mereka yang berpikir bahwa itu adalah). Idealisme bagus untuk percakapan, tetapi perusahaan tidak dapat membayar sewa, utilitas, karyawan, pajak, dll dengan cita-cita.
@ jpmc26 benar tentang perlunya komunikasi, tetapi tidak sepenuhnya benar tentang apa yang perlu dikomunikasikan. Ya, Anda harus mendengarkan apa yang orang lain minta dan berusaha memahami alasan mereka, yang mencakup mengajukan pertanyaan jika Anda tidak jelas tentang apa pun.
NAMUN, basis data tidak tunduk pada aplikasi, dan profesional basis data (admin, insinyur, apa pun nama yang digunakan perusahaan Anda) tidak tunduk kepada pengembang (seperti yang tampaknya tersirat dalam jawaban itu). Anda tidak bekerja untuk pengembang, Anda bekerja untuk perusahaan, sama seperti mereka. Ini adalah upaya tim dan Anda tidak harus meminta maaf karena melakukan pekerjaan Anda. Yang mengatakan, kami tipe komputer tidak (umumnya) dikenal karena kemampuan komunikasi antar manusia kami, jadi, Anda benar-benar perlu memastikan bahwa orang lain memahami Anda , apa alasan Anda, apa tanggung jawab Anda, DAN bagaimana hal ini sebenarnya bekerja .
Saya memasukkan bagian terakhir itu karena ada tingkat kesalahpahaman, informasi yang salah, dan kurangnya pengetahuan di luar sana (bahkan beberapa di sini, di halaman ini). Misalnya, tampaknya ada anggapan bahwa semua aturan adalah aturan bisnis. Kita perlu menjelaskan bahwa ada perbedaan antara aturan data dan aturan bisnis (@ Harun menyebutnya sebagai "batasan alur kerja vs batasan data" dalam komentar pada pertanyaan), dan bahwa sementara sebagian besar data secara alami adalah milik aplikasi, beberapa data sebenarnya milik model data. Haruskah DBA menentukan kepada pengembang bagaimana data aplikasi akan dibatasi? Tentu saja tidak. Adalah tugas kami untuk menawarkan bagaimana data aplikasi dapatdibatasi. Jika pelanggaran aturan bisnis yang terkait dengan data aplikasi dapat menyebabkan kerusakan, dan aplikasi bukanlah satu- satunya cara 100% untuk memanipulasi data, maka mungkin kendala pemeriksaan mungkin sangat membantu (dan mereka tidak sulit untuk mengubah atau menghapus ).
TETAPI, datang dari arah lain, pengembang seharusnya tidak menentukan bagaimana data model data (yaitu meta-data) ditangani. Ini termasuk bidang audit (seperti kolom
created_on
/created_by
) dan kolom PK / FK (nilai-nilai ini hanya seharusnya diketahui secara internal dan tidak diberikan kepada pelanggan). Data ini bukan yang disimpan aplikasi tentang pelanggan (bahkan jika aplikasi dapat melihat nilai-nilai dan bahkan menggunakannya, seperti dengan ID), itu yang disimpan oleh model data tentang data aplikasi.Jadi masuk akal untuk menggunakan aturan data untuk melindungi data model data. Dan melakukannya tidak menyiratkan bahwa Anda akan mulai menambahkan kendala atau batasan pada data aplikasi. TETAPI, akan sulit untuk memajukan pembicaraan dengan cara yang benar-benar produktif jika perbedaan ini tidak dipahami.
Begitu:
DENY
di kolom audit, dan telah mengusulkan hal yang sama di tempat saya bekerja di masa lalu juga.Secara anekdot, saya memiliki percakapan yang sangat mirip dengan pengembang utama (yang sangat bagus), mungkin pada tahun 2000, ketika saya mulai menambahkan kunci asing. Dia berargumen (dengan sungguh-sungguh) bahwa itu tidak perlu over-engineering / idealisme (sesuatu seperti itu, sudah 17 tahun sejak percakapan itu) dan tidak sepadan dengan kinerja hit. Dia cukup jelas bahwa membersihkan data terkait harus ditangani di lapisan aplikasi. (ya, saya memang menambahkan FK karena dia tidak akan menjadi orang yang membersihkan data yatim yang akan dibuat oleh kodenya)
Bertahun-tahun kemudian dia meminta maaf karena membuat argumen itu ;-)
sumber
Ini mungkin masalah XY. Pengembang mungkin tidak terlalu peduli dengan memblokir pembaruan ke bidang yang benar-benar konstan seperti
created_on
. Contoh khusus ini merupakan kendala yang sangat sederhana.Pengembang mungkin khawatir bahwa tim DBA (yang termasuk Anda) berniat untuk menambahkan begitu banyak atau batasan yang rumit sehingga mulai menghambat kemampuan mereka untuk bekerja secara efektif, atau bahwa ketika sesuatu yang tidak biasa muncul atau sesuatu berubah, tim DBA akan menolak perubahan dan menghambat kemampuan tim pengembang untuk membuat kemajuan. Ini adalah keprihatinan yang relatif masuk akal. Birokrasi dan kehilangan kemampuan untuk mempengaruhi perubahan yang diperlukan adalah kejadian nyata, dan pengkodean terlalu banyak atau kendala kompleks dapat memiliki efek negatif pada kinerja dan pada kemampuan untuk menanggapi perubahan dalam persyaratan.
Pengembang mungkin bahkan tidak menyadari bahwa ini adalah sifat keprihatinan mereka. Mereka kemungkinan terbiasa memiliki pemerintahan bebas dari basis data, dan menyerahkan tingkat kebebasan itu sulit, terutama jika Anda tahu Anda tidak pernah menyalahgunakannya. Jadi rasa keprihatinan mereka tentang kehilangan kemampuan untuk melakukan apa yang mereka butuhkan bisa menjadi kabur dan tidak jelas.
Jadi ada beberapa hal yang harus Anda lakukan untuk meredakan ketakutan ini:
sumber
Anda memiliki pernyataan yang bertentangan
Apakah benar-benar terserah Anda untuk mendiktekan yang pertama?
Anda memberikan hak istimewa setidaknya untuk membuat aplikasi berfungsi tanpa bukti bahwa aplikasi tidak perlu memperbarui nilai.
Siapa yang bertanggung jawab atas integritas data?
Dengan kendala SQL, dapatkah Anda menjamin integritas data? Tidak, Anda tidak bisa karena sering ada aturan bisnis yang melampaui apa yang bisa dilakukan oleh basis data.
VendorID tidak boleh berubah tetapi bagaimana jika dua vendor bergabung. Jangan pernah bilang tidak akan pernah.
Jika tim aplikasi mencemari data dan mereka mengatakan mereka membutuhkan otoritas itu, itu ada di tangan mereka. Jika tim aplikasi bekerja untuk Anda, maka Anda dapat menentukan.
Pertanyaan yang tepat adalah apakah aplikasi harus memperbarui data.
sumber