10

Per un database di applicazioni Web, da un punto di vista di sicurezza solo, quali argomenti sono contrari al punto per una soluzione sp solo dove l'account db dell'app non ha diritti su tabelle e viste e solo exec su sps?Stored procedure vs nessuna stored procedure - Security Viewpoint

Se qualcuno intercetta l'account db dell'app, l'area di superficie esposta ad un attacco è molto meno quando le tabelle e le viste non sono esposte. Quali vantaggi per la sicurezza offrirebbe o meno una soluzione non sp? Vedo molti vantaggi nell'usare una soluzione non sp, ma l'esposizione di tutti i tavoli mi lascia un po 'preoccupato.

La domanda è per i principali prodotti di database vendor in generale, ma in particolare, di SQL Server 2008.

risposta

13

Da un punto di vista della sicurezza solo, non riesco a vedere alcun vantaggio di un approccio non-SP avrebbe più di un approccio SP perché:

  • si deve concedere le autorizzazioni direttamente alle tabelle sottostanti ecc
  • con uno sProc, tutte le informazioni di reale sottostante schema possono essere incapsulati/nascosta (SP possono essere crittografati troppo)
+0

+1 per l'astrazione ("incapsulato/nascosto") –

3

Beh, credo che davvero catturato il cuore del problema da soli: se non si utilizza le stored procedure per tutti CRUD operazioni, devi concedere almeno un account utente db specifico dell'app almeno i diritti SELECT su tutte le tabelle.

Se si desidera consentire all'account db di eseguire ancora più operazioni, tale account potrebbe anche richiedere altre autorizzazioni, ad esempio la possibilità di AGGIORNARE ed eventualmente DELETE su determinate tabelle.

Non vedo come un approccio proc non memorizzato possa avere vantaggi di sicurezza - apre il gate ancora un po ', la domanda è davvero: ci si può permettere? È possibile proteggere l'account DB specifico dell'app in modo tale da non compromettere la sicurezza generale del sistema?

Un possibile compromesso potrebbe essere quello di utilizzare le visualizzazioni o l'accesso tavolo per consentire SELECT, ma gestire tutto il resto (aggiornamenti, eliminazioni, inserti) utilizzando stored procedure - mezzo sicuro, mezzo comodo ...

Come spesso è - questo è un classico compromesso tra convenienza (approccio non-sp; uso di un ORM possibilmente) e sicurezza (tutto l'approccio di SProc, probabilmente più ingombrante, ma un po 'più sicuro).

Marc

+0

Grazie. Ho pensato alla tua soluzione parziale: seleziona le tabelle, gli aggiornamenti alle sp. Hai provato questo approccio? Qualcosa di inaspettato che ha causato problemi? – Steve

+0

@Steve: no, non ho mai fatto questo approccio ibrido. Il mio precedente lavoro era tutto-SProc - sicuro, ma un dolore contro cui lavorare. Il mio attuale è tutto l'accesso diretto al tavolo - conveniente ma non terribilmente sicuro .... –

4

Questo è uno di quei settori in cui la saggezza convenzionale è corretta: esponendo solo le stored procedure consente un maggiore controllo sulla sicurezza. Offrire accesso diretto a tabelle e viste è più semplice, e ci sono momenti in cui devi farlo, ma sarà meno sicuro.

5

il più grande vantaggio della sicurezza di non utilizzo di stored procedure è la chiarezza. Sai esattamente cosa può fare un account, vedendo quale accesso ha alle tabelle. Con le stored procedure, questo non è necessariamente il caso. Se un account ha la capacità di eseguire la procedura X, ciò limita l'account all'esecuzione di quello e non colpisce una tabella sottostante, ma X può fare qualsiasi cosa. Potrebbe far cadere tabelle, alterare dati, cancellare dati, ecc.

Per sapere cosa può fare un account con le stored procedure, è necessario esaminare la stored procedure. Ogni volta che uno sproc viene aggiornato, qualcuno dovrà vedere cosa fa per assicurarsi che qualcosa non venga inserito "accidentalmente" in esso. Il vero problema con la sicurezza in sprocs viene dall'interno dell'organizzazione, non da parte di aggressori malintenzionati.

Ecco un esempio:

Diciamo che si sta cercando di limitare l'accesso alla tabella dei dipendenti. Senza stored procedure, si nega semplicemente l'accesso al tavolo. Per ottenere l'accesso a qualcuno, in modo abbastanza esplicito, devi chiederti esplicitamente di concedere le autorizzazioni. Certo, potrebbero farti eseguire uno script per concedere l'accesso, ma la maggior parte delle persone cerca almeno di rivedere uno script che altera lo schema del database (supponendo che lo script non aggiorni uno sproc, di cui parlerò di seguito).

Esistono potenzialmente centinaia di stored procedure per un'applicazione. Nella mia esperienza, si aggiornano abbastanza frequentemente, aggiungono un campo qui, ne eliminano uno lì. Affinché qualcuno riesamini il numero di script della procedura di aggiornamento tutto il tempo diventi scoraggiante, e nella maggior parte delle organizzazioni il team del database inizia a esaminare solo rapidamente la procedura (o non guardare tutto) e a spostarla. È qui che entra in gioco il vero problema. Ora, in questo esempio, se qualcuno dello staff IT vuole consentire l'accesso a un tavolo, quella persona deve semplicemente inserire una riga di codice che concede l'accesso o fare qualcos'altro. In un mondo perfetto questo sarebbe catturato. Molti di noi non lavorano in un mondo perfetto.

Il vero problema con le procedure memorizzate è che aggiungono un livello di offuscamento al sistema. Con l'offuscamento arriva la complessità, e con la complessità arriva in definitiva più lavoro per capire e amministrare il sistema sottostante. La maggior parte delle persone nell'IT è oberata di lavoro e le cose scivolano via. In questo caso non si tenta di attaccare il sistema per accedere, si utilizza la persona responsabile del sistema per ottenere ciò che si desidera. Mitnick aveva ragione, nella sicurezza le persone sono il problema.

Gli attacchi di maggioranza contro un'organizzazione vengono dall'interno. Ogni volta che si introduce complessità in qualsiasi sistema, appaiono dei buchi, le cose possono essere trascurate. Non ci credo, pensa a dove lavori. Passare attraverso i passaggi su chi chiederebbe di accedere a un sistema. Presto ti renderai conto che puoi far sì che le persone trascurino le cose al momento giusto. La chiave per penetrare con successo in un sistema con le persone coinvolte è fare qualcosa che sembra innocuo, ma è davvero sovversivo.

Ricorda, se sto cercando di attaccare un sistema: non sono tuo amico; Non ho alcun interesse per i tuoi figli o hobby; Ti userò in qualsiasi modo necessario per ottenere ciò che voglio; Non mi interessa se ti tradisco. L'idea di "ma era mio amico ed è per questo che mi sono fidato che credesse che quello che stava facendo fosse corretto", non è di conforto dopo il fatto.

+0

chiarezza per chi? Se il team DB è responsabile dell'accesso db, gli sviluppatori non devono mai conoscere il nome degli oggetti del database (tabelle). Non sono sicuro del fatto che vedere gli sviluppatori vedere il codice db è un vantaggio per la sicurezza. –

+1

L'offuscamento non è sicurezza. È come dire che i ladri non troveranno i gioielli, perché li ho nascosti nell'armadio. Se voglio davvero entrare in qualcosa, non sapere che lo schema è un fastidio minore, non un ostacolo. Il mio punto è che non usare sprocs semplifica la sicurezza, che è il più grande fattore per rendere sicuro un sistema. Meno modifiche al sistema db rendono il sistema più sicuro da questo punto di vista, perché la possibilità che qualcosa venga trascurato è minore. Cambiando la funzionalità di sprocs ogni release aumenta la possibilità che qualcosa venga perso. – kemiller2002

+0

Se si dispone di SQL inline, è più vulnerabile all'iniezione SQL ma con Sprocs è appena memorizzato in una variabile e non influenza la struttura della chiamata – AutomatedTester

1

Oltre alla tradizionale separazione di sicurezza con procedure memorizzate (autorizzazione EXEC sulle procedure, affidamento sulla concatenazione della proprietà per l'accesso ai dati) le stored procedure possono essere code signed, con conseguente controllo dell'accesso molto granulare e specifico a qualsiasi funzionalità server come server collegati, server scoped management views, accesso controllato a stored procedures and even data in other databases al di fuori dell'accesso ordinario dell'utente.

richieste ordinarie fatte in lotti T-SQL, non importa come fantasia e quanti strati su strati di generazione del codice e ORM sono dietro di esso, semplicemente non può essere firmato e quindi non è possibile utilizzare uno dei più specifica e potente meccanismi di controllo accessi disponibili.

6

Prendiamo un sistema che deve essere veramente sicuro, ad esempio il sistema di contabilità della vostra azienda. Se usi procs e concedi l'accesso solo ai procs, allora gli utenti non possono fare altro che quello che fa il proc, sempre. Si tratta di un controllo interno progettato per garantire che le regole aziendali per il sistema non possano essere acquisite da alcun utente del sistema. Questo è ciò che impedisce alle persone di fare un acquisto aziendale e quindi di approvare i fondi stessi aprendo la porta alle frodi.Ciò impedisce anche a molte persone dell'organizzazione di eliminare tutti i record nella tabella degli account perché non hanno diritti di eliminazione tranne quelli concessi dal proc che consentiranno solo una cancellazione alla volta.

Ora gli sviluppatori devono avere più diritti per svilupparsi, ma non dovrebbero avere più diritti su una macchina di produzione se si vuole considerare la sicurezza. È vero che uno sviluppatore potrebbe scrivere uno sp malizioso che fa qualcosa di brutto quando viene messo a punto. Questo stesso sviluppatore però potrebbe mettere lo stesso codice nella versione dell'applicazione e avere la stessa probabilità di essere catturato o meno come se cambiassero maliziosamente un proc. Personalmente ritengo che il proc potrebbe essere più facile da catturare perché potrebbe essere visualizzato separatamente dal codice dal dbas che potrebbe significare il manager o il responsabile della configurazione e il dbas ha avuto la possibilità di vederlo vice solo al manager o al responsabile della configurazione. Sappiamo tutti che la realtà è che nessuno che spinga codice ai prodotti ha il tempo di esaminarne personalmente ogni parte, quindi assumere degli sviluppatori affidabili è fondamentale. Avere la revisione del codice e il controllo del codice sorgente in atto può aiutare a trovare una modifica malevola o riportarla a una versione precedente, ma l'uso del codice di applicazione di sps vice è a rischio sia degli sviluppatori che del resto.

Lo stesso vale per gli amministratori di sistema. Il deve avere pieni diritti al sistema per svolgere il proprio lavoro. Possono potenzialmente fare molti danni senza essere catturati. Il meglio che puoi fare in questo caso è limitare questo accesso al minor numero possibile di persone e fare il meglio che puoi nell'assumere persone fidate. Almeno se hai poche persone con questo accesso, è più facile trovare la fonte del problema se si verifica. È possibile ridurre al minimo il rischio mediante backup off-site (quindi, almeno quello che l'amministratore interrompe se diventa cattivo può essere risolto in una certa misura), ma non si può mai eliminare completamente questo rischio. Anche in questo caso, indipendentemente dal modo in cui si consente alle applicazioni di accedere ai dati.

Quindi il vero utilizzo delle sp non è quello di eliminare tutti i possibili rischi, ma di far sì che meno persone possano danneggiare il sistema. L'uso del codice dell'applicazione per influenzare le informazioni del database è intrinsecamente non sicuro e, a mio parere, non dovrebbe essere consentito a nessun sistema che memorizzi informazioni finanziarie o personali.

1

È un'analogia imperfetta, ma mi piace confrontare le tabelle nello schema "dbo" del DB con i dati "privati" nella terminologia OO e le viste e Processi memorizzati su "pubblico". Si può persino rendere uno schema "pubblico" separato dallo schema dbo per rendere esplicita la distinzione. Se segui questa idea, ottieni un vantaggio in termini di sicurezza e un vantaggio di estensibilità.

Un account (non l'account dell'app Web) ha accesso dbo e possiede il database e l'app Web si connette utilizzando un altro account limitato alle strutture pubbliche.

0

L'unico argomento possibile contro è che ho imbattuto in casi in cui determinate istruzioni non possono essere parametrizzate in modo efficace in un SP (e SQL dinamico è richiesto) e questo ti dà la possibilità di in-SP SQL-injection. Questa è comunque una considerazione molto ristretta ed è un caso raro. Almeno in PostgreSQL ho visto di tanto in tanto alcuni casi in cui questo doveva essere soggetto a una revisione extra.

Nel complesso, anche in questi casi, penso che gli approcci di tipo SP offrano un vantaggio in termini di sicurezza perché significano che l'applicazione può utilizzare meccanismi di Injection anti-SQL generici dove altrimenti non sarebbe possibile, e il vostro SP può essere utilizzato da molte applicazioni. Inoltre, se tutte le attività devono passare attraverso SP, è possibile ridurre l'esposizione a sql-injection e centralizzare gli audit per i problemi.

In generale, meno un utente può fare meno esposizione di sicurezza in genere. Ciò significa che meno un utente può fare con un attacco SQL injection.

Le stored procedure generalmente offrono una sicurezza migliore e più granulare di quella che è possibile fare a meno.

0

La maggior parte delle risposte specificano i vantaggi di sicurezza dell'utilizzo di stored procedure. Senza trascurare questi vantaggi, ci sono alcuni grandi svantaggi che non sono stati menzionati:

modelli di accesso
  • i dati sono a volte molto più importante di una procedura specifica che si sta facendo. Vogliamo registrare/monitorare/analizzare/sollevare avvisi/bloccare chi accede ai dati, quando e come. Non possiamo sempre ottenere queste informazioni quando si utilizzano stored procedure.

  • Alcune organizzazioni possono avere tonnellate di stored procedure. È impossibile rivederli tutti e potrebbe essere più sensato concentrarsi sulle tabelle (specialmente considerando che le stored procedure possono essere molto complesse, avere bug e introdurre altri problemi di sicurezza).

  • Alcune organizzazioni possono richiedere una separazione dei problemi. Gli amministratori di database (o chiunque scriva stored procedure) non fanno sempre parte della sicurezza personale. A volte è necessario che la sicurezza personale si concentri solo sui dati semplicemente perché non sono responsabili della logica di business e i ragazzi che scrivono la logica di business non sono completamente affidabili.