Come proteggere un servizio Web per le applicazioni Web utilizzando lo stesso database?

1

Ho 2 o più applicazioni web che devono essere in grado di comunicare insieme usando un'interfaccia di servizio web.

Informazioni

  • Tutte le applicazioni utilizzano TLS / SSL (https)
  • Tutte le applicazioni hanno accesso allo stesso database e tale database può essere accessibile solo da queste applicazioni

Il mio problema è che non voglio che nessun altro sia in grado di utilizzare il servizio web. Significa che solo le applicazioni dovrebbero essere in grado di chiamare il servizio web per ottenere informazioni o eseguire un'azione su un'altra applicazione.

C'è un modo "semplice" per farlo?

Ho pensato che dal momento che solo le applicazioni hanno accesso al database, potrei probabilmente usarlo come terza parte fidata per convalidare l'identità di chi chiama il servizio web.

Modifica

C'è stata una certa confusione con la configurazione corrente, quindi ecco alcune informazioni aggiuntive

  • Le applicazioni e il servizio web sono la stessa cosa. Ogni applicazione definisce un'interfaccia del servizio Web per consentire alle altre applicazioni di comunicare con essa
  • Le applicazioni e il database sono tutti ospitati sullo stesso server ed è un server dedicato che ospita solo quelle applicazioni e quel database ed è gestito da "me stesso"
  • Tutte le applicazioni sono sicure e richiedono l'autenticazione
  • Ho bisogno di utilizzare un servizio web invece di usare il database per comunicare tra le applicazioni perché ogni applicazione utilizza una lingua diversa e la logica aziendale è tutto nel codice delle applicazioni. Questo codice di business logic deve essere chiamato quando le applicazioni comunicano tra loro.
posta Gudradain 28.08.2014 - 20:59
fonte

2 risposte

3

My problem is that I don't want anyone else to be able to use the web service. Meaning that only the applications should be able to call the web service to get information or execute an action on another application.

Is there any "simple" way to do that?

Ci sono diversi modi. Tu dici di usare HTTPS; quindi è possibile aggiungere un semplice schema di autenticazione (segreto condiviso) con una sicurezza molto ragionevole. Presumo che le applicazioni stesse siano protette.

È anche possibile utilizzare i certificati client per la conversazione SSL (ad esempio, il canale SSL fornisce anche la certificazione di identità). A seconda della configurazione, potrebbe essere più semplice da implementare rispetto all'aggiunta dell'autenticazione al servizio web.

Probabilmente, puoi usare un proxy di autenticazione. Ciò richiede una configurazione più scomoda, dal momento che in pratica si utilizza il proxy per eseguire un attacco man-in-the-middle contro la propria connessione SSL. Oppure puoi utilizzare una sorta di front-end compatibile con i servizi Web sviluppato a tale scopo, che farebbe essenzialmente lo stesso (identificarsi come il vero servizio web, quindi passare la connessione al servizio web reale dopo aver rimosso ulteriori informazioni di autenticazione).

In tutti i casi, puoi ridurre la superficie di attacco negando sistematicamente l'accesso ai servizi a livello IP, a meno che le richieste non provengano da una serie di installazioni di applicazioni conosciute.

Una specializzazione di questo approccio sarebbe quella di stabilire una VPN completa tra le applicazioni e il servizio web. Ciò avrebbe il vantaggio che né le app né il servizio web richiederebbero modifiche sostanziali, ma comporterebbero dei costi di rendimento (si sta eseguendo una connessione crittografata all'interno di un'altra).

I figured that since only the applications have access to the database, I could probably use it as a trusted third party to validate the identity of the one calling the web service.

Puoi, ma a quel punto le tue applicazioni sono già in comunicazione con il sistema che esegue il servizio web attraverso il database. Indipendentemente dal canale che utilizzi per il database, puoi utilizzare lo stesso canale / metodo oppure sospettare che non sia sicuro.

Ad esempio, le applicazioni (o il servizio) stanno ora accedendo a un server di database esterno - può chiunque acceda quel server? Se sì, potresti avere qualche problema proprio lì. Se no, che è più probabile, allora perché? (E suppongo che la risposta sia "Connessione crittografata SSL, autenticazione password / certificato e / o verifica IP, o VPN completa").

Aggiornamento

Nella tua configurazione, le applicazioni e i servizi Web che espongono sono sulla stessa macchina (non è così comune, motivo per cui non avevo pensato a questa possibilità). Ciò consente la 'sicurezza banale', ad esempio, è possibile esporre le interfacce del servizio Web su "localhost". Puoi persino usarli in chiaro, eliminando del tutto il protocollo SSL, poiché le comunicazioni localhost non fuoriusciranno dalla macchina. E per intercettarli, è necessario un livello sufficiente di accesso al server che il punto sia comunque valido.

Se vuoi, o se ne hai mai bisogno, puoi anche esporre un (diverso?) servizio web sull'interfaccia esterna ed eseguire quell'estremità con autenticazione e sicurezza SSL (possibilmente anche con controllo del certificato client).

Allo stato attuale mi sembra che tu sia già al sicuro . Basta controllare che la configurazione predefinita di applicazioni / framework / server non includa il binding a qualsiasi interfaccia (è molto spesso l'impostazione predefinita), perché che consentirebbe potenzialmente l'accesso dall'esterno.

    
risposta data 28.08.2014 - 23:46
fonte
0

Se si utilizza WCF, è possibile utilizzare l'autenticazione per consentire solo a utenti specifici di eseguire metodi specifici. Lo uso in un ambiente intranet. Non sono al 100% ma potrebbe essere un buon punto di partenza per utilizzare WCF o trovare un metodo equivalente in qualsiasi tecnologia utilizzata per chiamare i metodi.

    
risposta data 28.08.2014 - 23:16
fonte

Leggi altre domande sui tag