Bagaimana saya bisa mencegah jacking dengan database produksi secara tidak sengaja?

31

Baru-baru ini, saya memiliki pengembang yang secara tidak sengaja mencoba mengembalikan database ke produksi, ketika ia seharusnya mengembalikan ke salinan stage. Sangat mudah dilakukan, mengingat bahwa nama db serupa, yaitu, CustomerName_Staging versus CustomerName_Production.

Idealnya, saya memiliki ini di kotak yang sepenuhnya terpisah, tetapi itu mahal, dan, sebenarnya, itu tidak mencegah hal yang sama terjadi jika pengguna terhubung ke kotak yang salah.

Ini bukan masalah keamanan, per se - itu adalah pengguna yang benar yang bekerja dengan database pementasan, dan jika ada pekerjaan yang harus dilakukan pada basis data produksi, itu akan menjadi miliknya juga. Saya ingin memiliki petugas penyebaran untuk memisahkan masalah-masalah itu, tetapi timnya tidak cukup besar untuk itu.

Saya ingin mendengar beberapa saran dalam hal praktik, konfigurasi, dan kontrol tentang cara mencegah hal ini.

Chris B. Behrens
sumber
25
Pengembang seharusnya tidak memiliki akses tulis ke basis data produksi, atau lebih disukai, akses apa pun .
Michael Hampton
12
@MichaelHampton - Ini aku dan dia. Saya juga seorang pengembang. Apa yang Anda sarankan?
Chris B. Behrens
10
Pisahkan akun pengguna untuk setiap peran (dev vs ops / DBA). Dan banyak kehati-hatian.
Michael Hampton
2
Saya akan sangat menyarankan agar Anda memiliki lingkungan produksi di kotak yang terpisah. Jika tidak, pementasan dan produksi harus berbagi sumber daya - disk, cpu, dll. - dan jika pementasan memonopoli sumber daya, lingkungan produksi Anda mungkin akan terganggu.
Thorbjørn Ravn Andersen
1
Pisahkan saja pengguna / kata sandi dengan basis data tersebut.
neutrinus

Jawaban:

32

Jika ini adalah sesuatu yang Anda sering lakukan, otomatisasi. Dan karena Anda berdua pengembang, menulis beberapa kode harus di ruang kemudi Anda. :) Serius sekali ... dengan mengotomatiskannya, Anda dapat melakukan hal-hal seperti:

  • Pastikan Anda memulihkan di server yang benar (mis. No dev -> prod restore)
  • Verifikasi bahwa itu adalah "tipe" database yang tepat (dalam kasus Anda, "pementasan" dan "produksi")
  • Cari tahu cadangan apa yang harus dipulihkan secara otomatis dengan melihat tabel cadangan di msdb

Dll. Anda hanya dibatasi oleh imajinasi Anda.

Ben Thul
sumber
1
Itu ide yang menarik ... kami sudah memiliki kode yang mengelola pemulihan db (untuk pengujian otomatis). Kita bisa meletakkan lapisan abstraksi di antara yang hanya menunjuk pada pementasan sehingga mengembalikan ke produksi adalah proses yang sama sekali berbeda ...
Chris B. Behrens
11
Sekarang Anda berpikir dengan portal. :)
Ben Thul
4
Untuk pekerjaan otomatis yang memengaruhi produksi, saya ingin menambahkan langkah manual yang mengharuskan pengguna untuk mengetik kata "produksi" untuk mengurangi kemungkinan yang mereka pikir sedang mereka lihat misalnya setara dengan pementasan.
Joe Lee-Moyet
2
Saya downvoted karena tidak ada yang seharusnya memiliki akses ke produksi secara default. Anda harus memiliki proses khusus untuk mengambil kata sandi produk. Ini tidak nyaman tetapi benar-benar minimum.
OliverS
1
@BenThul Menambahkan akun yang berbeda untuk akses prod dan menjadikannya satu langkah lagi tidak nyaman masih merupakan solusi yang tepat untuk saya. Kebutuhan bisnis bukan untuk memiliki DEV menyimpan 2 menit tetapi untuk mengembalikan DB yang dapat dengan sempurna dipindahkan ke akun prod.
OliverS
32

Saya tidak setuju dengan asumsi dalam pertanyaan - ini adalah keamanan - tetapi saya juga tidak setuju bahwa otomasi akan menyelamatkan hari itu sendiri. Saya akan mulai dengan masalah:

Anda seharusnya tidak dapat secara tidak sengaja melakukan sesuatu untuk produksi!

Itu termasuk melakukan hal-hal otomatis secara tidak sengaja.

Anda membingungkan sistem keamanan dengan konsep-konsep seperti "siapa yang boleh melakukan apa". Akun pengembangan Anda seharusnya hanya dapat menulis ke salinannya, server kontrol versi, dan database dev. Jika mereka dapat membaca / menulis produksi, mereka dapat diretas dan dieksploitasi untuk mencuri data pelanggan atau (seperti yang telah Anda tunjukkan) dapat disalahgunakan untuk kehilangan data pelanggan.

Anda harus mulai dengan memilah alur kerja Anda.

  • Akun pengembang Anda harus dapat menulis ke salinan mereka sendiri, kontrol versi dan mungkin menarik dari kontrol versi ke lingkungan pengujian.

  • Pengguna cadangan hanya dapat membaca dari produksi dan menulis ke toko cadangan Anda (yang harus dilindungi dengan tepat).

  • Melakukan membaca / menulis pada produksi harus memerlukan otentikasi khusus dan tidak nyaman . Anda seharusnya tidak dapat menyelinap ke dalamnya atau lupa Anda login. Kontrol akses fisik berguna di sini. Kartu pintar, flip-switch untuk "mempersenjatai" akun, simultan-putar akses tombol ganda.

    Mengakses produksi seharusnya bukan sesuatu yang perlu Anda lakukan setiap hari. Sebagian besar pekerjaan harus pada platform pengujian Anda dan penyebaran di luar jam yang dibuat untuk produksi setelah pengawasan cermat. Sedikit ketidaknyamanan tidak akan membunuhmu.

Otomasi adalah bagian dari solusi.

Saya tidak buta terhadap kenyataan bahwa perputaran penuh (mengunggah ke VCS, memeriksa cakupan, menarik ke server uji, menjalankan tes otomatis, reauthentication, membuat cadangan, menarik dari VCS) adalah proses yang panjang.

Di situlah otomatisasi dapat membantu, sesuai jawaban Ben. Ada banyak bahasa scripting yang membuat menjalankan tugas-tugas tertentu jauh lebih mudah. Pastikan Anda tidak membuatnya terlalu mudah untuk melakukan hal-hal bodoh. Langkah reauthentication Anda tetap harus diucapkan (dan jika berbahaya) mereka harus merepotkan dan sulit dilakukan tanpa berpikir.

Tapi sendirian , otomasi lebih buruk daripada tidak berguna. Itu hanya akan membantu Anda membuat kesalahan yang lebih besar dengan sedikit pemikiran.

Cocok untuk tim dari semua ukuran.

Saya perhatikan Anda menunjukkan ukuran tim Anda. Saya seorang lelaki dan saya harus menyelesaikan semua ini karena hanya perlu satu orang untuk mengalami kecelakaan. Ada overhead tetapi itu sepadan. Anda berakhir dengan lingkungan pengembangan dan produksi yang jauh lebih aman dan lebih aman.

Oli
sumber
2
Selain itu, satu hal yang ingin saya lakukan adalah menggunakan dua akun bernama per pengguna. Salah satunya adalah untuk login pengguna normal, operasi, pekerjaan sehari-hari, dll., Sedangkan akun kedua (biasanya dengan beberapa jenis akhiran seperti + atau garis bawah) memiliki hak penuh untuk menekan dan menghancurkan yang diperlukan pengguna. Dengan begitu, pengguna harus membuat keputusan aktif untuk mendorong ke prod sebagai lawan dev. Ini mirip dengan bullet 3 yang dijelaskan di atas, tetapi tidak memerlukan infrastruktur atau biaya tambahan yang signifikan untuk menunjukkan nilainya.
user24313
3
Penting juga untuk menghindari kebiasaan melakukan apa pun selain mempertahankan pemeliharaan di akun prod Anda. Untuk itu, pastikan prod tidak dapat melihat kode sumber, tidak dapat memulai IDE, dll.
Eric Lloyd
Di mana saya mendapatkan salah satu dari alat-alat dual-key simultan-turn dan apakah itu datang dengan USB?
Lilienthal
Hal lain yang mungkin membantu adalah mengotomatisasi sepenuhnya (satu atau dua klik) prosedur dalam pementasan dan pengembangan, tetapi tidak sepenuhnya mengotomatiskan penyebaran produksi. Harus secara manual jauh ke dalam kotak untuk melakukan apa saja untuk produksi tetapi tidak untuk lingkungan lain adalah perbedaan yang signifikan dalam kenyamanan, seperti yang Anda sarankan. (Anda masih dapat skrip langkah-langkah yang terlibat dan menggunakan skrip itu di semua lingkungan; yang saya maksud adalah bahwa Anda harus secara manual menjalankan eksekusi skrip tersebut untuk produksi.) Itu tentu saja dapat dilakukan di samping jenis otentikasi prosedur yang Anda rekomendasikan.
jpmc26
1
@Lilienthal Itu adalah metafora untuk teater keamanan tinggi tetapi Anda bisa meniru tongkat USB yang murah menyerang masing-masing pengembang dan kemudian memeriksa otomatisasi Anda untuk setidaknya dua nomor seri mereka ketika menjalankan hal-hal berbahaya. Dalam tim yang lebih besar, Anda kemudian dapat login untuk melihat siapa yang mengganggu produksi dan meminta pertanggungjawaban orang yang tepat ketika semuanya salah.
Oli
12

Salah satu rekan kerja saya memiliki pendekatan yang menarik untuk ini. Skema warna terminal-nya untuk produksi jelek . Abu-abu, merah muda, dan sulit dibaca, yang secara teoritis seharusnya memastikan bahwa apa pun yang ia tulis, ia benar-benar bermaksud menulis.

Jarak tempuh Anda mungkin bervariasi ... dan saya mungkin tidak perlu mengatakan bahwa itu hampir tidak tahan peluru. :)

Robhol
sumber
2
Saya juga menggunakan warna latar belakang merah besar pada koneksi terminal / db ke server produksi, serta wallpaper merah cerah untuk admin yang diterima pada PC ...
Falco
Ya, saya sedang memikirkan itu. Jadikan produksi pemadam kebakaran merah ...
Chris B. Behrens
Pengodean warna membantu. Sama seperti dalam IDE.
Thorbjørn Ravn Andersen
1

Pengembang seharusnya tidak mengetahui kata sandi ke basis data produksi. Kata sandi prod harus acak dan tidak mudah diingat - sesuatu seperti hasil keyboard mashing ( Z^kC83N*(#$Hx). Kata sandi dev Anda bisa $YourDog'sNameatau correct horse battery stapleatau apa pun.

Tentu, Anda bisa mengetahui apa kata sandinya, terutama jika Anda tim kecil, dengan melihat file konfigurasi aplikasi klien. Itulah satu-satunya tempat di mana kata sandi prod harus ada. Itu memastikan bahwa Anda harus melakukan upaya yang disengaja untuk mendapatkan kata sandi produk.

(Seperti biasa, Anda harus memiliki cadangan point-in-time untuk database produksi Anda. Misalnya, dengan MySQL, arsipkan log biner sebagai cadangan tambahan. Untuk PostgreSQL, arsipkan log menulis-depan. Itu adalah perlindungan Anda dari upaya terakhir untuk segala jenis bencana, yang ditimbulkan sendiri atau yang lainnya.)

200_sukses
sumber
Saya tidak bisa sepenuhnya setuju dengan ini, karena dalam lingkungan besar yang realistis ada contoh yang cukup teratur di mana pengembang / admin perlu mengakses database produksi. Tentu di dunia yang sempurna dengan sistem sempurna ini seharusnya tidak pernah terjadi, tetapi dalam kebanyakan sistem saya tahu Anda harus memperbaiki beberapa data penting produksi dengan tangan ... Jadi saya dengan Oli, login produksi harus merepotkan, tetapi layak
Falco
1
@ Falco Itulah yang saya sarankan. Tidak nyaman tetapi layak.
200_sukses
Masalah dengan pendekatan Anda hanya, jika ada keadaan darurat dan produksi turun, waktu diperhitungkan. Jadi devs Anda harus tahu di mana menemukan kata sandi dan mendapatkannya dengan cepat. Jika mereka harus bertanya-tanya, cari repositori dan file konfigurasi dan coba-coba Anda kehilangan waktu berharga = uang. Jadi saya lebih suka memiliki kata sandi di tempat di mana semua orang tahu ke mana harus mencari, tetapi masih merepotkan, tetapi cepat jika perlu
Falco
2
@ Falco Karena lingkungan prod harus mencerminkan lingkungan dev, file konfigurasi akan berada di tempat analog pada server prod seperti di mesin dev. Setiap pengembang yang kompeten harus tahu ke mana harus mencari, dan jika mereka tidak tahu ke mana harus mencari, maka Anda menginginkan penundaan itu - tepatnya untuk mencegah kerusakan jenis yang dinyatakan dalam pertanyaan.
200_sukses
Tidak mengetahui kata sandi tidak menghalangi kecelakaan. Justru sebaliknya, itu menciptakan motivasi untuk hanya membuat pencarian kata sandi hanya sekali, dan setelah itu pengembang dapat mulai menggunakan sejarah bash atau bahkan mungkin membuat alias untuk terhubung ke database. Dan kemudian, kecelakaan lebih mungkin terjadi.
k0pernikus
0

Jawaban singkatnya adalah RBAC - kontrol akses berbasis peran.

Izin Anda untuk semua lingkungan harus berbeda - dan sama menjengkelkannya dengan hal-hal seperti UAC, Anda membutuhkannya: terutama untuk lingkungan PROD.

Tidak pernah ada alasan bagi devs untuk memiliki akses langsung ke Prod - terlepas dari seberapa kecil organisasi / timnya. "Dev" Anda mungkin juga mengenakan topi "Panggung" dan "Prod", tetapi ia harus memiliki kredensial dan proses yang berbeda untuk mencapai lingkungan yang berbeda.

Apakah itu menyebalkan? Benar. Tetapi apakah itu [membantu] mencegah membongkar lingkungan Anda? Benar.

warren
sumber
0

Solusi cepat dan sederhana: gunakan dua akun pengguna yang berbeda, satu untuk pekerjaan pengembangan normal Anda yang hanya memiliki akses ke database pengembangan, dan yang lain untuk benar-benar beroperasi pada database produksi, dengan akses penuh ke sana. Dengan cara ini, Anda harus secara aktif mengubah akun yang Anda gunakan sebelum dapat membuat perubahan dalam produksi, yang seharusnya cukup untuk mencegah kesalahan yang tidak disengaja.

Pendekatan yang sama dapat digunakan jika Anda memiliki dua situs web, atau dua server, atau dua lingkungan secara keseluruhan: satu akun pengguna untuk pengembangan tanpa akses (atau setidaknya tanpa akses tulis ) ke produksi, akun pengguna lain untuk bekerja pada sistem produksi ( s).


Ini adalah pendekatan yang sama dengan sysadmin yang memiliki akun non-admin standar untuk pekerjaan rutin (membaca email, menjelajahi web, melacak tiket, mengisi timesheets, menulis dokumentasi, dll.) Dan akun admin penuh yang berbeda untuk digunakan ketika benar-benar beroperasi di server dan / atau Direktori Aktif.

Massimo
sumber