Mengapa tidak disarankan untuk memiliki database dan server web pada mesin yang sama?


127

Mendengarkan wawancara Scott Hanselman dengan tim Stack Overflow ( bagian 1 dan 2 ), ia bersikeras bahwa server SQL dan server aplikasi harus berada di mesin yang terpisah. Apakah ini hanya untuk memastikan bahwa jika satu server dikompromikan, kedua sistem tidak dapat diakses? Apakah masalah keamanan lebih penting daripada kompleksitas dua server (biaya tambahan, koneksi jaringan khusus antara keduanya, lebih banyak pemeliharaan, dll.), Terutama untuk aplikasi kecil, di mana tidak ada yang menggunakan terlalu banyak CPU atau memori? Bahkan dengan dua server, dengan satu server dikompromikan, penyerang masih bisa melakukan kerusakan serius, baik dengan menghapus database, atau mengacaukan kode aplikasi.

Mengapa ini menjadi masalah besar jika kinerja tidak menjadi masalah?

Jawaban:


158
  1. Keamanan. Server web Anda tinggal di DMZ, dapat diakses oleh internet publik dan mengambil input yang tidak terpercaya dari pengguna anonim. Jika server web Anda dikompromikan, dan Anda telah mengikuti aturan privilege paling sedikit dalam menghubungkan ke DB Anda, paparan maksimum adalah apa yang dapat dilakukan aplikasi Anda melalui API basis data. Jika Anda memiliki tingkat bisnis di antaranya, Anda memiliki satu langkah lagi antara penyerang dan data Anda. Jika, di sisi lain, database Anda berada di server yang sama, penyerang sekarang memiliki akses root ke data dan server Anda.
  2. Skalabilitas. Menjaga server web Anda tanpa kewarganegaraan memungkinkan Anda untuk mengukur server web Anda secara horizontal dengan cukup mudah. Hal ini sangat sulit untuk horizontal skala server database.
  3. Performa. 2 kotak = 2 kali CPU, 2 kali RAM, dan 2 kali spindle untuk akses disk.

Semua yang dikatakan, saya tentu bisa melihat kasus-kasus yang masuk akal bahwa tidak ada poin yang benar-benar penting.


27
Tapi dengan 2 mesin Anda memiliki dua kemungkinan kegagalan hardware;)
TWith2Sugars

4
@ TWith2Sugars - yang bertentangan dengan apa?
Kev

3
Ref. poin 1. Jika Tier Web dimiliki, lalu apa lagi yang Anda inginkan atau butuhkan dari antarmuka API App / database? Tentunya itu sudah berakhir pada saat itu? Hal-hal kemudian menjadi sangat menarik dalam hal layanan yang diperlukan untuk mendukung infrastruktur DMZ misalnya layanan AD atau Microsoft yang sedang bermain?
Noelie Dunne

4
@Noelie - Tingkat web Anda tidak akan memiliki akses untuk mengatakan, backup database ke file dan ftp file tersebut ke ftp.hackers.com menggunakan xp_cmdshell. Atau jatuhkan database. Atau ubah nilai konfigurasi. dll.
Mark Brackett

6
@kirgy - karena kedua mesin paralel dan masing-masing titik kegagalan tunggal, keandalan keseluruhan kurang; itu tidak secara teknis ganda (itu sebenarnya 1 - (r1 * r2)) tetapi cukup dekat untuk keandalan besar dan node kecil .... Dalam kasus 0,01%, itu akan menjadi 0,0199%. Tetapi untuk 100 node, itu akan menjadi 36,6%, bukan 100% tersirat oleh pernyataan penggandaan.
Mark Brackett

45

Ini tidak benar-benar peduli (Anda dapat cukup bahagia menjalankan situs Anda dengan web / database pada mesin yang sama), itu hanya langkah termudah di skala ..

Persis seperti yang dilakukan oleh StackOverflow - dimulai dengan mesin tunggal yang menjalankan IIS / SQL Server, kemudian ketika mulai mendapatkan banyak muatan, server kedua dibeli dan server SQL dipindahkan ke sana.

Jika kinerja tidak menjadi masalah, jangan buang uang untuk membeli / memelihara dua server.


3
Saya setuju, itu bisa dilakukan saat beban rendah ... karena beban meningkat, mudah untuk memisahkannya menjadi 2 atau lebih mesin.
EJ Brennan

4
Saya masuk dan akan mengomentari hal yang sama. Mengubah server DB Anda semudah mengubah string koneksi Anda (dalam kebanyakan kasus).
CitizenBane

Uuh, aku suka itu. Seseorang memikirkan konteksnya sebelum menyarankan solusi!
demisx

22

Di sisi lain, merujuk pada blogging yang berbeda Scott (Watermasyck, dari Telligent) - mereka menemukan bahwa sebagian besar pengguna dapat mempercepat situs web (menggunakan Server Komunitas Telligent), dengan meletakkan basis data pada mesin yang sama dengan situs web. Namun, dalam kasus pelanggan mereka, biasanya db & server web adalah satu-satunya aplikasi pada mesin itu, dan situs web tidak terlalu melelahkan mesin. Kemudian, efisiensi tidak harus mengirim data di jaringan lebih banyak yang dibuat untuk meningkatkan ketegangan.


4
... sampai penggunaan bersamaan meningkat, dan server db membutuhkan lebih banyak memori untuk menggunakan buffer dan cache secara efektif. Setelah server web / aplikasi dan server db membutuhkan lebih banyak memori daripada yang dapat mereka bagikan dalam satu kotak, paging dan I / O disk meningkat, dan kinerja meningkat.
kermatt

@MattK - tetapi bagaimana jika Anda memiliki banyak memori? Kami memiliki aplikasi tempat setiap klien memiliki basis data sendiri, sehingga basis data dan server web dapat menskala secara horizontal dengan sangat mudah. Mengingat bahwa kami memiliki lebih banyak memori daripada disk yang digunakan (64GB vs. ~ 40GB), bukankah lebih baik bagi kinerja untuk menyimpan semuanya di mesin yang sama?
Bip bip

1
Jika set kerja Anda sesuai dengan memori, maka Anda mungkin tidak melihat masalah kinerja yang saya sebutkan. Lebih sering server memiliki lebih banyak disk daripada RAM, tetapi kedengarannya seperti dalam kasus Anda, Anda memiliki basis data yang sepenuhnya sesuai dengan RAM - selama aplikasi pada server bersama tidak mengkonsumsi terlalu banyak.
kermatt

15

Saya akan berpikir faktor besar adalah kinerja. Server web / kode aplikasi dan SQL Server akan melakukan cache data yang biasanya diminta dalam memori dan Anda membunuh kinerja cache Anda dengan menjalankannya di ruang memori yang sama.


12
Bagaimana jika Anda memiliki basis data kecil (ish), tetapi dengan banyak memori? Bukankah biaya untuk pergi melalui jaringan untuk setiap panggilan basis data, terutama jika ada banyak, lebih besar daripada manfaatnya?
Bip bip

1
@ Tom Ritter Meskipun kinerja adalah masalah (Per jawaban ini, dan tunjukkan # 3 dalam jawaban Mark Brackett) Saya tahu bahwa beberapa orang (termasuk saya) kemungkinan akan menyimpan uang dengan TIDAK mendapatkan server DB terpisah ke LEBIH CPU / RAM / dll. pada server satu-satunya yang menggantikannya. Jadi ini harus diperhitungkan. Adapun memori yang dipisahkan, IIS dan SQL dapat dikonfigurasi untuk memperhitungkan persaingan mereka atas sumber daya. Secara pribadi, "kicker" bagi saya adalah poin # 1 Markus ... keamanan. Saya suka membayangkan akses terbatas server web yang dikompromikan harus ke server DB yang terpisah .
Dylan - INNO Software

@ Tom, Anda selalu dapat membagi ruang memori menjadi dua unit terpisah. Satu setengah untuk server dan setengah untuk database.
Pacerier

15

Tom benar dalam hal ini. Beberapa alasan lain adalah karena tidak efektif biaya dan ada risiko keamanan tambahan.

Webservers memiliki persyaratan perangkat keras yang berbeda dari server database. Server database berjalan lebih baik dengan banyak memori dan array disk yang sangat cepat sementara server web hanya membutuhkan cukup memori untuk menyimpan file cache dan permintaan DB yang sering (tergantung pada pengaturan Anda). Mengenai efektivitas biaya, kedua server tidak harus lebih murah, namun rasio kinerja / biaya harus lebih tinggi karena Anda tidak perlu aplikasi yang berbeda bersaing untuk sumber daya. Untuk alasan ini, Anda mungkin harus menghabiskan lebih banyak untuk satu server yang melayani keduanya dan menawarkan kinerja setara dengan 2 yang khusus.

Kekhawatiran keamanan adalah bahwa jika mesin tunggal dikompromikan, baik server web dan basis data rentan. Dengan dua server, Anda memiliki ruang bernapas karena server ke-2 akan tetap aman (setidaknya untuk sementara waktu).

Juga, ada beberapa manfaat skalabilitas karena Anda mungkin hanya perlu memelihara beberapa server basis data yang digunakan oleh banyak aplikasi web yang berbeda. Dengan cara ini Anda memiliki lebih sedikit pekerjaan untuk melakukan peningkatan atau perbaikan dan melakukan penyesuaian kinerja. Saya percaya bahwa ada alat manajemen server untuk membuat tugas-tugas ini lebih mudah (dalam kasus mesin tunggal).


2
Jika Anda menjalankan sesuatu selain SPs maka server web Anda mungkin memiliki akses penuh ke data dalam basis data Anda
George Mauer

Mengapa tidak hemat biaya? Silakan tentukan.
Robert Jeppesen

Robert I memperluas hal itu dan menambahkan beberapa komentar tentang skalabilitas dan pemeliharaan.
Dana the Sane

9

Keamanan adalah masalah utama. Idealnya server basis data Anda harus duduk di belakang firewall dengan hanya port yang diperlukan untuk melakukan akses data yang dibuka. Aplikasi web Anda harus terhubung ke server database dengan akun SQL yang hanya memiliki cukup hak untuk aplikasi berfungsi dan tidak lebih. Misalnya Anda harus menghapus hak yang mengizinkan dijatuhkannya objek dan tentunya Anda tidak boleh terhubung menggunakan akun seperti 'sa'.

Jika Anda kehilangan server web karena dibajak (yaitu eskalasi hak istimewa yang ditiup penuh ke hak administrator), skenario terburuk adalah bahwa database aplikasi Anda mungkin dikompromikan tetapi tidak seluruh server database (seperti halnya jika server database dan server web adalah mesin yang sama). Jika Anda telah mengenkripsi string koneksi database Anda dan peretas tidak cukup cerdas untuk mendekripsi mereka, maka yang hilang adalah server web.


Tapi Anda membuat cadangan database, kan? Kalau tidak, Anda akan berisiko kehilangan itu karena kegagalan perangkat keras atau bug yang jarang bersemangat. Serangan yang membunuh server web akan menyebabkan downtime dengan sendirinya. Cukup hak untuk menambahkan catatan ke tabel sudah cukup untuk membuat situs tidak berguna.
Daniel Earwicker

Tentu saja Anda membuat cadangan database, itu implisit, di mana dalam posting saya saya menyarankan sebaliknya.
Kev

1
Ya, tetapi kesimpulannya adalah bahwa serangan yang dimaksudkan untuk menjatuhkan situs dapat melakukannya dengan menghancurkan konfigurasi server web atau database, dan solusinya sama untuk keduanya: memulihkan dari cadangan. Khusus melindungi basis data adalah (a) tidak perlu dan (b) tidak mungkin.
Daniel Earwicker

@ Earwicker - bagaimana dengan semua database lain yang berada di server DB? Yang hilang hanyalah satu basis data.
Kev

8
Selain Daniel, Anda kehilangan poin BESAR. Ini bukan tentang cadangan basis data, ini tentang data yang dikompromikan. Apakah pelanggan Anda akan baik-baik saja bahwa "Seorang hacker mencuri semua data pelanggan dan penjualan Anda, tetapi jangan khawatir, saya punya cadangan." :)
Dylan - INNO Software

9

Salah satu faktor yang belum disebutkan adalah load balancing. Jika Anda mulai memikirkan server web dan database sebagai mesin yang terpisah, Anda mengoptimalkan untuk round trip jaringan yang lebih sedikit dan juga semakin mudah untuk menambahkan server web kedua atau mesin database kedua seiring meningkatnya kebutuhan.


6

Saya dapat berbicara dari pengalaman langsung bahwa sering kali ide yang baik untuk menempatkan server web dan database pada mesin yang berbeda. Jika Anda memiliki aplikasi yang membutuhkan banyak sumber daya, ia dapat dengan mudah menyebabkan siklus CPU pada mesin memuncak, yang pada dasarnya membuat mesin berhenti. Namun, jika aplikasi Anda memiliki keterbatasan penggunaan database, mungkin bukan masalah besar jika mereka berbagi server.


6

Wow, Tidak ada yang mengemukakan fakta bahwa jika Anda benar-benar membeli SQL server seharga $ 5k, Anda mungkin ingin menggunakannya lebih dari aplikasi web Anda. Jika Anda menggunakan express, mungkin Anda tidak peduli. Saya melihat server SQL menjalankan Database selama 20 hingga 30 aplikasi, jadi menaruhnya di server web tidak akan menjadi pintar.

Kedua, tergantung pada siapa server itu digunakan. Saya bekerja untuk perusahaan keuangan dan pemerintah. Jadi kita menggunakan rasa sakit yang gila dalam pendekatan pantat menggunakan hanya sprocs dan membatasi port dari server ke SQL. Jadi jika aplikasi web diretas. Satu-satunya hal yang dapat dilakukan peretas adalah memanggil sprocs karena akun pengguna pada server web dikunci untuk hanya melihat / memanggil sprocs pada DB. Jadi sekarang peretas harus mencari cara untuk masuk ke DB. Jika itu di server web juga jenisnya mudah dijangkau.


5

Saya setuju dengan Daniel Earwicker - pertanyaan keamanannya cukup banyak cacatnya.

Jika Anda memiliki satu pengaturan kotak dengan server web dan hanya database untuk server web itu, jika server web itu dikompromikan Anda kehilangan server web dan hanya database untuk aplikasi spesifik itu.

Ini persis sama dengan apa yang terjadi jika Anda kehilangan server web pada pengaturan 2-server. Anda kehilangan server web, dan hanya database untuk aplikasi spesifik itu.

Argumen bahwa 'sisa integritas server DB dipertahankan' di mana Anda memiliki pengaturan 2-server tidak relevan, karena dalam skenario pertama, setiap server database lain yang terkait dengan setiap aplikasi lain (jika ada) tetap tidak terpengaruh juga - menjadi, sebagaimana adanya, diselenggarakan di tempat lain.

Demikian pula, untuk pertanyaan yang diajukan oleh Kev 'bagaimana dengan semua database lain yang berada di server DB? Yang hilang hanyalah satu basis data. '

  • jika Anda meng-hosting aplikasi dan database pada satu server, Anda hanya akan meng-host database di server yang terkait dengan aplikasi itu. Oleh karena itu, Anda tidak akan kehilangan database tambahan dalam pengaturan server tunggal jika dibandingkan dengan pengaturan server ganda.

Sebaliknya, dalam pengaturan 2 server, di mana penyerang memiliki akses ke Web Server, dan dengan proxy, hak terbatas (dalam skenario kasus terbaik) ke server database, mereka dapat menempatkan database setiap aplikasi lain dalam bahaya dengan membawa lambat, permintaan intensif memori atau memaksimalkan ruang penyimpanan yang tersedia di server database. Dengan memisahkan aplikasi menjadi keprihatinan mereka sendiri, seperti virtualisasi, Anda juga mengisolasi mereka untuk tujuan keamanan dengan cara yang positif.


4

Itu tergantung pada aplikasi dan tujuannya. Ketika ketersediaan tinggi dan kinerja tidak kritis, tidak buruk untuk tidak memisahkan DB dan server web. Terutama mengingat keuntungan kinerja - jika aplikasi membuat sejumlah besar permintaan basis data, sejumlah besar beban jaringan dapat dihilangkan dengan menyimpan semuanya pada sistem yang sama, menjaga waktu respons tetap rendah.


2

Saya pikir ini karena dua mesin biasanya perlu dioptimalkan dengan cara yang berbeda. Selain itu saya tidak tahu, kami menjalankan semua aplikasi kami dengan server-database pada mesin yang sama - asalkan kami tidak menghadapi publik - tapi kami tidak punya masalah.

Saya tidak bisa membayangkan bahwa terlalu banyak orang peduli tentang satu mesin yang dikompromikan karena keduanya aplikasi web biasanya akan memiliki akses yang hampir tidak terbatas untuk setidaknya data jika bukan skema di dalam database.

Tertarik dengan apa yang orang lain katakan.


1
George, saya pikir Anda harus merujuk pada jawaban Mark Brackett. Keamanan server web Anda terhadap database TIDAK akan sama dengan jika server terpisah. Khususnya "disk lokal" tidak akan dapat diakses. Selain itu, jika hanya satu situs web (dari banyak situs) yang diretas, mereka kemungkinan hanya akan mengkompromikan akses ke database SITUS SITUS itu (kecuali jika Anda menggunakan pengguna yang terlalu kuat untuk string koneksi itu). Ada banyak skenario lain, saya pikir komentar di sini bukan tempatnya.
Dylan - INNO Software

2

Saya mendengarkan podcast itu, dan itu lucu, tetapi argumen keamanan tidak masuk akal bagi saya. Jika Anda telah mengompromikan server A, dan server itu dapat mengakses data di server B, maka Anda langsung memiliki akses ke data di server B.


Tidak benar. Anda memiliki akses ke data atau hak istimewa apa pun yang dimiliki Kotak A ke Kotak B. Dalam pengaturan yang aman, itu berarti Anda memiliki tingkat akses DB tertinggi yang dimiliki aplikasi pada Kotak A. Anda tidak, bagaimanapun, memiliki privasi pada DB, atau root pada OS Kotak B.
Mark Brackett

2
"Anda memiliki akses ke data atau hak istimewa apa pun yang dimiliki Kotak A ke Kotak B" - itulah yang saya maksud dengan "Anda langsung memiliki akses ke data di server B". Jika RDBMS ada di kotak A dan tidak ada kotak B, apa bedanya? NB. kami berasumsi Anda sudah meretas kotak A, bagaimanapun.
Daniel Earwicker

Dalam konfigurasi dua kotak, jika Anda menerapkan prinsip privilege paling rendah, jika kotak A (web) dikompromikan, maka hal terburuk yang seharusnya terjadi adalah Anda kehilangan DB di kotak B dan tidak lebih.
Kev

1
Dan pada konfigurasi satu kotak, jika satu kotak itu dikompromikan, Anda telah kehilangan satu kotak itu, yang termasuk DB di dalamnya. Apa bedanya?
Daniel Earwicker

2
Perbedaannya adalah bahwa pada konfigurasi dua kotak, jika server web dikompromikan, semua yang Anda hilang adalah server web dan paling buruk DB. Integritas server DB lainnya dipertahankan.
Kev

2

Lisensi database tidak ciak dan sering dibebankan per CPU, oleh karena itu dengan memisahkan server web Anda, Anda dapat mengurangi biaya lisensi database Anda.

Misalnya, jika Anda memiliki 1 server yang melakukan web dan database yang berisi 8 CPU Anda harus membayar untuk lisensi 8 cpu. Namun jika Anda memiliki dua server masing-masing dengan 4 CPU dan menjalankan database pada satu server, Anda hanya perlu membayar untuk lisensi 4 cpu


Tolong jelaskan bagaimana ini berarti penghematan.
John Saunders

1
John - dia mengatakan bahwa untuk mendapatkan kinerja yang setara dengan 2 mesin, Anda harus menggandakan # core, yang akan menggandakan biaya lisensi SQL Server. Mengapa membayar ekstra $ 10-20k untuk SQL Server jika semua yang Anda dapatkan adalah kinerja yang sama dengan menggunakan 2 mesin.
Bip bip

hanya benar jika kinerja / pemanfaatan sumber daya (mis. CPU) didominasi oleh server aplikasi dan bukan oleh server db. jika db membutuhkan 8 CPU, itu tidak akan berfungsi.
Andreas Dietrich

1

Kekhawatiran tambahan adalah bahwa basis data ingin mengambil semua memori yang tersedia dan menyimpannya sebagai cadangan ketika ingin menggunakannya. Anda dapat memaksanya untuk membatasi memori tetapi ini dapat memperlambat akses data.


-1

Argumen bahwa ada keuntungan kinerja nyata yang bisa didapat dengan menjalankan server database pada server web adalah argumen yang cacat.

Karena server Database mengambil string kueri dan mengembalikan set hasil, data yang sebenarnya mengalir dari server data ke server web relatif kecil, tetapi tenaga kuda yang diperlukan untuk memproses kueri dan menghasilkan set hasil relatif besar. Mengoptimalkan kinerja di sekitar waktu transfer data karenanya mengoptimalkan hal yang salah.

Mengenai keamanan, ada keuntungan memiliki server data pada kotak yang berbeda dari server web. Memiliki pengaturan seperti itu bukanlah segalanya dan mengakhiri semua keamanan, tetapi merupakan langkah ke arah yang benar.

Mengenai skalabilitas, mudah dan relatif murah untuk menambahkan server web dan memasukkannya ke dalam cluster untuk menangani peningkatan lalu lintas. Tidak mudah dan murah untuk menambahkan server data dan mengelompokkannya. Juga, server web dan server data memiliki kebutuhan perangkat keras yang berbeda, sehingga beberapa kotak membantu dengan skalabilitas.

Jika Anda memulai dari yang kecil dan hanya memiliki satu kotak, maka cara yang baik adalah menggunakan mesin virtual. Menjalankan server web dan server data dalam berbagai VM pada satu host memberi Anda semua keuntungan dari kotak yang terpisah dengan biaya satu harga kotak besar.


1
Pertanyaan awal diajukan tentang server aplikasi, tidak harus internet publik yang menghadap server web.
João Bragança

-2

Sistem operasi adalah pertimbangan lain. Meskipun database Anda mungkin memerlukan ruang memori yang lebih besar dan karenanya UNIX, server web Anda - atau lebih khusus server aplikasi Anda karena Anda hanya menyebutkan dua tingkatan - mungkin berbasis .Net, dan karenanya memerlukan Windows.


Saya tidak memilih ini, tetapi "Meskipun database Anda mungkin membutuhkan ruang memori yang lebih besar dan karenanya UNIX" - Jika Anda menjalankan windows 64 bit dan 64 bit SQL, ada banyak memori untuk dimainkan.
Kev

Maaf, memori dimaksudkan sebagai contoh alasan yang diperlukan untuk penggelaran untuk membagi OS. Alasan lain termasuk: kinerja, keamanan, standar / lisensi perusahaan, dukungan vendor, dll.
Chris Noe

-6

Baik! Inilah masalahnya, lebih aman untuk menginstal DB Server Anda di Mesin lain dan Aplikasi Anda di Web Server. Anda kemudian menghubungkan aplikasi Anda ke DB dengan Tautan Web. Terima kasih itu


3
mengapa lebih aman?
Bryan Chen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.