Perché non è consigliabile disporre del database e del server Web sullo stesso computer?


127

Ascoltando l'intervista di Scott Hanselman con il team Stack Overflow ( parte 1 e 2 ), era fermamente convinto che il server SQL e il server delle applicazioni dovessero essere su macchine separate. Questo è solo per assicurarsi che se un server è compromesso, entrambi i sistemi non sono accessibili? I problemi di sicurezza superano la complessità di due server (costo aggiuntivo, connessione di rete dedicata tra i due, più manutenzione, ecc.), Soprattutto per una piccola applicazione, dove nessuno dei due componenti utilizza troppa CPU o memoria? Anche con due server, con un server compromesso, un utente malintenzionato può comunque causare seri danni, eliminando il database o giocando con il codice dell'applicazione.

Perché questo sarebbe un grosso problema se le prestazioni non fossero un problema?

Risposte:


158
  1. Sicurezza. Il tuo server web vive in una DMZ, accessibile a Internet pubblico e riceve input non attendibili da utenti anonimi. Se il tuo server Web viene compromesso e hai seguito le regole dei privilegi minimi per la connessione al tuo DB, l'esposizione massima è ciò che la tua app può fare attraverso l'API del database. Se hai un livello aziendale nel mezzo, hai un altro passo tra il tuo aggressore e i tuoi dati. Se, d'altra parte, il database si trova sullo stesso server, l'attaccante ora ha accesso root ai dati e al server.
  2. Scalabilità. Mantenere il tuo server Web senza stato ti consente di ridimensionare i server Web in orizzontale praticamente senza sforzo. È molto difficile ridimensionare orizzontalmente un server di database.
  3. Prestazione. 2 scatole = 2 volte la CPU, 2 volte la RAM e 2 volte i mandrini per l'accesso al disco.

Detto questo, posso certamente vedere casi ragionevoli che nessuno di questi punti conta davvero.


27
Ma con 2 macchine hai il doppio della probabilità di guasti hardware;)
TWith2Sugars

4
@ TWith2Sugars - al contrario di cosa?
Kev

3
Ref. punto 1. Se il livello Web è di proprietà, quale altro si desidera o è necessario dell'interfaccia API App / database? Sicuramente a quel punto è finita la partita? Le cose diventano molto interessanti in termini di servizi richiesti per supportare l'infrastruttura DMZ, ad esempio qualsiasi servizio AD o Microsoft in gioco?
Noelie Dunne,

4
@Noelie - Il tuo livello Web non avrebbe accesso a dire, esegui il backup del database su un file e ftp quel file su ftp.hackers.com usando xp_cmdshell. Oppure rilascia il database. Oppure modifica i valori di configurazione. ecc.
Mark Brackett,

6
@kirgy: poiché le due macchine sono in parallelo e rappresentano un singolo punto di errore, l'affidabilità complessiva è inferiore; non è tecnicamente doppio (in realtà è 1 - (r1 * r2)) ma abbastanza vicino per grande affidabilità e piccoli nodi .... Nel caso dello 0,01%, sarebbe 0,0199%. Ma per 100 nodi, sarebbe il 36,6% invece del 100% implicito dalla dichiarazione di raddoppio.
Mark Brackett,

45

E non lo fa davvero importa (si può tranquillamente eseguire il sito con web / base di dati sulla stessa macchina), è solo il passo più semplice in scala ..

È esattamente ciò che StackOverflow ha fatto: a partire da una singola macchina che esegue IIS / SQL Server, quindi quando ha iniziato a essere caricato pesantemente, è stato acquistato un secondo server e il server SQL è stato spostato su quello.

Se le prestazioni non rappresentano un problema, non sprecare denaro per acquistare / gestire due server.


3
Sono d'accordo, può essere fatto mentre il carico è basso ... all'aumentare del carico, è facile separarli in 2 o più macchine.
EJ Brennan,

4
Entrai e commentavo la stessa cosa. Cambiare server DB è facile come cambiare la stringa di connessione (nella maggior parte dei casi).
CitizenBane,

Mi piace. Qualcuno sta pensando al contesto prima di suggerire una soluzione!
Demisx

22

D'altra parte, riferendosi a un diverso blog di Scott (Watermasyck, di Telligent), hanno scoperto che la maggior parte degli utenti potrebbe velocizzare i siti Web (utilizzando Telligent's Community Server), inserendo il database sullo stesso computer del sito web. Tuttavia, nel caso dei loro clienti, di solito il db e il web server sono le uniche applicazioni su quella macchina, e il sito web non sta stressando così tanto la macchina. Quindi, l'efficienza di non dover inviare dati attraverso la rete più ha compensato l'aumento della tensione.


4
... fino a quando non aumenta l'utilizzo simultaneo e il server db ha bisogno di più memoria per utilizzare in modo efficace buffer e cache. Una volta che i server web / app e db hanno bisogno di più memoria di quanta ne possano condividere su un singolo box, il paging e l'I / O del disco aumentano e le prestazioni dei serbatoi.
Kermatt,

@MattK - ma cosa succede se si dispone di enormi quantità di memoria? Abbiamo un'app in cui ogni client ha il proprio database, quindi sia il database che i server web possono scalare in orizzontale molto facilmente. Dato che abbiamo più memoria rispetto al disco in uso (64 GB contro ~ 40 GB), non sarebbe meglio per le prestazioni mantenere tutto sullo stesso computer?
Bip bip

1
Se il tuo set di lavoro si adatta alla memoria, potresti non vedere nessuno dei problemi di prestazioni che menziono. Più spesso i server hanno più disco della RAM, ma nel tuo caso sembra che tu abbia database che si adatteranno interamente alla RAM - purché le applicazioni sul server condiviso non ne consumino troppo.
kermatt,

15

Penserei che il grande fattore sarebbe la prestazione. Sia il server web / il codice app che SQL Server memorizzerebbero nella cache i dati richiesti comunemente e tu stai uccidendo le prestazioni della cache eseguendoli nello stesso spazio di memoria.


12
Cosa succede se si dispone di un piccolo database (ish), ma con tonnellate di memoria? Il costo di andare in rete per ogni chiamata al database, in particolare se ce ne sono molti, supererebbe i vantaggi?
Bip bip

1
@Tom Ritter Anche se le prestazioni sono un problema (per questa risposta, e il punto 3 nella risposta di Mark Brackett) So che alcune persone (me incluso) probabilmente metterebbero i soldi risparmiati NON ottenendo un server DB separato in PIÙ CPU / RAM / eccetera. sul server unico che lo ha sostituito. Quindi questo dovrebbe essere preso in considerazione. Per quanto riguarda la memoria separata, IIS e SQL potrebbero essere configurati per tenere conto della concorrenza sulle risorse. Personalmente, il "kicker" per me era il punto n. 1 di Mark ... la sicurezza. Mi piace il pensiero dell'accesso limitato che un server Web compromesso dovrebbe avere su un server DB separato .
Dylan - Software INNO,

@ Tom, puoi sempre dividere lo spazio di memoria in due unità separate. Metà per server e metà per database.
Pacerier,

15

Tom ha ragione su questo. Alcuni altri motivi sono che non è conveniente e che ci sono ulteriori rischi per la sicurezza.

I server web hanno requisiti hardware diversi rispetto ai server database. I server di database funzionano meglio con molta memoria e un array di dischi molto veloce mentre i server Web richiedono solo memoria sufficiente per memorizzare nella cache i file e le richieste di DB frequenti (a seconda della configurazione). Per quanto riguarda il rapporto costo-efficacia, i due server non saranno necessariamente meno costosi, tuttavia il rapporto prestazioni / costi dovrebbe essere più elevato poiché non è necessario utilizzare diverse applicazioni in competizione per le risorse. Per questo motivo, probabilmente dovrai spendere molto di più per un server che si rivolge a entrambi e offre prestazioni equivalenti a 2 specializzati.

Il problema di sicurezza è che se il singolo computer è compromesso, sia il server web che il database sono vulnerabili. Con due server, hai un po 'di respiro perché il secondo server sarà ancora sicuro (almeno per un po').

Inoltre, ci sono alcuni vantaggi della scalabilità poiché potrebbe essere necessario mantenere solo alcuni server di database utilizzati da un gruppo di diverse applicazioni Web. In questo modo hai meno lavoro da fare per applicare aggiornamenti o patch e per ottimizzare le prestazioni. Credo che ci siano strumenti di gestione del server per rendere più semplici queste attività (nel caso della macchina singola).


2
Se stai eseguendo qualsiasi cosa tranne SP, probabilmente il tuo server web ha pieno accesso ai dati nel tuo database
George Mauer,

Perché non è conveniente? Per favore specificare.
Robert Jeppesen,

Robert l'ho ampliato e ho aggiunto alcuni commenti su scalabilità e manutenzione.
Dana the Sane,

9

La sicurezza è una delle maggiori preoccupazioni. Idealmente, il tuo server di database dovrebbe trovarsi dietro un firewall con solo le porte necessarie per eseguire l'accesso ai dati aperto. L'applicazione Web deve essere connessa al server di database con un account SQL che disponga dei diritti sufficienti per il funzionamento dell'applicazione e non di più. Ad esempio, è necessario rimuovere i diritti che consentono l'eliminazione di oggetti e sicuramente non è necessario connettersi utilizzando account come "sa".

Nel caso in cui si perda il server Web a causa di un dirottamento (vale a dire un'escalation dei privilegi in piena regola per i diritti di amministratore), lo scenario peggiore è che il database dell'applicazione potrebbe essere compromesso ma non l'intero server del database (come sarebbe se il database server e web server erano la stessa macchina). Se hai crittografato le stringhe di connessione al database e l'hacker non è abbastanza esperto da decrittografarle, tutto ciò che hai perso è il web server.


Ma esegui il backup del database, giusto? Altrimenti rischieresti di perderlo a causa di un guasto hardware o di un bug raramente eccitato. Un attacco che uccide il server web causerà tempi di inattività da solo. Sono sufficienti i privilegi per aggiungere record alle tabelle per rendere inutile un sito.
Daniel Earwicker,

Naturalmente fai il backup del database, è implicito, dove nel mio post ho suggerito diversamente.
Kev

1
Sì, ma la conclusione è quindi che un attacco destinato a far crollare il sito può farlo distruggendo la configurazione del server web o del database e la soluzione è la stessa per entrambi: ripristinare dal backup. La protezione speciale del database è (a) non necessaria e (b) comunque impossibile.
Daniel Earwicker,

@Earwicker: che dire di tutti gli altri database che risiedono sul server DB? Tutto quello che hai perso è un database.
Kev

8
Oltre a Daniel, ti manca un punto ENORME. Non si tratta di un backup del database, si tratta dei dati compromessi. I vostri clienti sarebbero d'accordo sul fatto che "Un hacker ha rubato tutti i dati dei clienti e delle vendite, ma non preoccupatevi, ho un backup". :)
Dylan - Software INNO

9

Un fattore che non è stato ancora menzionato è il bilanciamento del carico. Se inizi a pensare al server Web e al database come macchine separate, ottimizzi per un minor numero di viaggi di andata e ritorno in rete e diventa anche più facile aggiungere un secondo server Web o un secondo motore di database all'aumentare delle esigenze.


6

Posso dire per esperienza diretta che spesso è una buona idea posizionare il web server e il database su macchine diverse. Se si dispone di un'applicazione che utilizza molte risorse, può facilmente causare il picco dei cicli della CPU sulla macchina, interrompendo sostanzialmente la macchina. Tuttavia, se l'applicazione ha un uso limitato del database, probabilmente non sarebbe un grosso problema farli condividere un server.


6

Wow, nessuno evidenzia il fatto che se acquisti effettivamente un server SQL a 5.000 dollari, potresti volerlo usare per più della tua applicazione web. Se usi express, forse non ti interessa. Vedo che i server SQL eseguono database per 20-30 applicazioni, quindi metterlo sul server web non sarebbe intelligente.

In secondo luogo, dipende da chi è il server. Lavoro per le società finanziarie e il governo. Quindi usiamo un dolore pazzesco nell'approccio ass di usare solo sprocs e limitare le porte dal server web a SQL. Quindi se l'app Web viene hackerata. L'unica cosa che l'hacker può fare è chiamare sprocs poiché l'account utente sul server web è bloccato per vedere / chiamare sprocs solo sul DB. Quindi ora l'hacker deve capire come entrare nel DB. Se si trova sul server Web è facile da raggiungere.


5

Sono d'accordo con Daniel Earwicker - la domanda di sicurezza è praticamente imperfetta.

Se si dispone di una configurazione a casella singola con un server Web e solo il database per quel server Web su di esso, se quel server Web è compromesso, si perde sia il server Web sia solo il database per quella specifica applicazione.

Questo è esattamente lo stesso di quello che succede se si perde il server web in una configurazione a 2 server. Si perde il server Web e solo il database per quella specifica applicazione.

L'argomento secondo cui "viene mantenuta l'integrità del resto del server DB" laddove si disponga di una configurazione a 2 server è irrilevante, poiché nel primo scenario, anche tutti gli altri server di database relativi a qualsiasi altra applicazione (se presenti) rimangono inalterati - essere, per come sono, ospitati altrove.

Allo stesso modo, alla domanda posta da Kev 'che dire di tutti gli altri database che risiedono sul server DB? Tutto ciò che hai perso è un database. '

  • se si ospitasse un'applicazione e un database su un server, si ospiterebbero solo i database su quel server che si riferivano a tale applicazione. Pertanto, non si perderebbero ulteriori database in una configurazione a server singolo rispetto a una configurazione a più server.

Al contrario, in una configurazione a 2 server, in cui l'attaccante aveva accesso al server Web e, per delega, diritti limitati (nel migliore dei casi) al server di database, potevano mettere a rischio i database di ogni altra applicazione portando query lente, che richiedono molta memoria o che massimizzano lo spazio di archiviazione disponibile sul server di database. Separando le applicazioni nelle loro preoccupazioni, proprio come la virtualizzazione, le isolate anche per motivi di sicurezza in modo positivo.


4

Dipende dall'applicazione e dallo scopo. Quando l'alta disponibilità e le prestazioni non sono fondamentali, non è male non separare DB e web server. Soprattutto se si considerano i miglioramenti delle prestazioni: se l'applicazione effettua una grande quantità di query sul database, è possibile rimuovere una notevole quantità di carico di rete mantenendo tutto sullo stesso sistema, mantenendo bassi i tempi di risposta.


2

Penso che sia perché le due macchine di solito dovrebbero essere ottimizzate in modi diversi. A parte questo, non ne ho idea, eseguiamo tutte le nostre applicazioni con il server-database sulla stessa macchina - ammesso che non siamo di fronte al pubblico - ma non abbiamo avuto problemi.

Non riesco a immaginare che troppe persone si preoccupino del fatto che una macchina sia compromessa su entrambi poiché l'applicazione Web di solito avrà accesso quasi illimitato almeno ai dati se non allo schema all'interno del database.

Interessato a ciò che gli altri potrebbero dire.


1
George, penso che dovresti fare riferimento alla risposta di Mark Brackett. La sicurezza che il tuo server web ha sul database NON sarebbe la stessa che sarebbe se il server fosse separato. In particolare il "disco locale" non sarebbe accessibile. Inoltre, se fosse stato violato solo un singolo sito Web (di molti), probabilmente avrebbero solo compromesso l'accesso al database di QUESTO SITO (a meno che non si utilizzi un utente troppo potente per quella stringa di connessione). Ci sono innumerevoli altri scenari, ma non credo che un commento qui sia il posto giusto per loro.
Dylan - Software INNO

2

Ho ascoltato quel podcast ed è stato divertente, ma l'argomento della sicurezza non ha senso per me. Se hai compromesso il server A e quel server può accedere ai dati sul server B, allora hai immediatamente accesso ai dati sul server B.


Non vero. Hai accesso a qualsiasi dato o privilegio che il Box A avesse sul Box B. In una configurazione sicura, ciò significherebbe avere il più alto livello di accesso al DB che l'app sul Box A abbia. Tuttavia, non hai un priv sul DB o root sul sistema operativo del riquadro B.
Mark Brackett

2
"Hai accesso a tutti i dati o privilegi che la casella A aveva sulla casella B" - questo è ciò che intendevo per "hai accesso istantaneo ai dati sul server B". Se il RDBMS fosse nella casella A e non ci fosse la casella B, che differenza farebbe? NB. supponiamo che tu abbia già hackerato la casella A, in entrambi i casi.
Daniel Earwicker,

In una configurazione a due caselle, se stai applicando il principio del privilegio minimo, se la casella A (web) è compromessa, il peggio che avrebbe dovuto accadere è che hai perso il DB nella casella B e non di più.
Kev

1
E su una configurazione di una casella, se quella casella è compromessa, hai perso quella casella, che include il DB su di essa. Qual è la differenza?
Daniel Earwicker,

2
La differenza è che su una configurazione a due caselle, se il web server è compromesso, tutto ciò che hai perso è il web server e nel peggiore dei casi il DB. Il resto dell'integrità del server DB viene mantenuto.
Kev

2

Le licenze del database non sono scadenti e sono spesso addebitate per CPU, quindi separando i server Web è possibile ridurre il costo delle licenze del database.

Ad esempio, se si dispone di 1 server che esegue sia il Web che il database che contiene 8 CPU, è necessario pagare per una licenza da 8 cpu. Tuttavia, se hai due server ciascuno con 4 CPU ed esegui il database su un server dovrai pagare solo per una licenza di 4 cpu


Spiegare come questo equivale a un risparmio.
John Saunders,

1
John - sta dicendo che per ottenere prestazioni equivalenti a 2 macchine, dovresti raddoppiare il numero di core, il che raddoppierebbe i costi di licenza di SQL Server. Perché pagare un extra di $ 10-20k per SQL Server se tutto ciò che ottieni sono le stesse prestazioni dell'utilizzo di 2 macchine.
Bip beep

vero solo se l'utilizzo delle prestazioni / risorse (ad esempio cpu) è dominato dai server delle app e non dal server db. se il db ha bisogno di 8 cpus non funzionerà.
Andreas Dietrich,

1

Un'ulteriore preoccupazione è che ai database piace occupare tutta la memoria disponibile e tenerla riservata per quando vuole usarla. È possibile forzarlo per limitare la memoria, ma ciò può rallentare notevolmente l'accesso ai dati.


-1

Sostenere che si può ottenere un reale guadagno in termini di prestazioni eseguendo un server di database su un server Web è un argomento errato.

Poiché i server di database accettano stringhe di query e restituiscono set di risultati, i dati che fluiscono effettivamente dal server di dati al server Web sono relativamente piccoli, ma la potenza richiesta per elaborare la query e generare il set di risultati è relativamente grande. Pertanto, l'ottimizzazione delle prestazioni in relazione al tempo di trasferimento dei dati sta ottimizzando la cosa sbagliata.

Per quanto riguarda la sicurezza, ci sono vantaggi nell'avere il data server in una scatola diversa rispetto al web server. Avere una tale configurazione non è tutto e termina tutta la sicurezza, ma è un passo nella giusta direzione.

Per quanto riguarda la scalabilità, è facile e relativamente economico aggiungere server Web e inserirli nel cluster per gestire l'aumento del traffico. Aggiungere i server di dati e raggrupparli non è così semplice ed economico. Inoltre, i server Web e i server di dati hanno esigenze hardware diverse, quindi più box aiutano con la scalabilità.

Se stai iniziando in piccolo e hai solo una scatola, un buon modo sarebbe usare le macchine virtuali. L'esecuzione del server Web e del server di dati in diverse macchine virtuali su un host offre tutti i vantaggi di box separati al costo di un prezzo box elevato.


1
La domanda originale si poneva sui server delle applicazioni, non necessariamente sui server Web pubblici di Internet.
João Bragança,

-2

Il sistema operativo è un'altra considerazione. Mentre il tuo database può richiedere spazi di memoria più grandi e quindi UNIX, il tuo server web - o più specificamente il tuo server app poiché menzioni solo due livelli - può essere basato su .Net e quindi richiedere Windows.


Non ho votato in negativo, ma "Anche se il tuo database potrebbe richiedere spazi di memoria più grandi e quindi UNIX" - Se stai eseguendo Windows a 64 bit e SQL a 64 bit, c'è molta memoria con cui giocare.
Kev

Spiacenti, la memoria era intesa come un motivo di esempio necessario per la distribuzione su sistemi operativi divisi. Altri motivi includono: prestazioni, sicurezza, standard aziendali / licenze, supporto del fornitore, ecc.
Chris Noe,

-6

Ok! Ecco il punto, è più sicuro che il tuo DB Server sia installato su un altro computer e la tua applicazione sul Web Server. Quindi collegare l'applicazione al DB con un collegamento Web. Grazie


3
perché è più sicuro?
Bryan Chen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.