Sicurezza dei servizi Web (WS) con SOAP: esempio

⚡ Riepilogo intelligente

La sicurezza dei servizi web (WS) è uno standard che protegge i dati scambiati durante una chiamata a un servizio web SOAP. Questa risorsa illustra le minacce alla sicurezza e le relative contromisure, gli standard WS-Security, la creazione di un servizio web sicuro con credenziali e le migliori pratiche per la sicurezza dei servizi web.

  • 🔐 Standard di base: WS-Security aggiunge un livello di sicurezza a SOAP, definendo il modo in cui le credenziali e le chiavi di crittografia vengono trasmesse all'interno dell'intestazione SOAP.
  • 🌐 Limiti HTTPS: HTTPS/SSL protegge il traffico punto-punto, ma nei flussi multi-server solo WS-Security mantiene il messaggio protetto end-to-end.
  • 🎫 Token di credenziali: Le credenziali vengono trasmesse utilizzando un UsernameToken per nome utente e password, oppure un BinarySecurityToken per i certificati Kerberos o X.509.
  • Esempio di build sicura: Un servizio web .Net ASMX aggiunge una classe AuthHeader in modo che l'intestazione SOAP contenga nome utente e password per l'autenticazione.
  • 📋 migliori pratiche: Richieste di verifica e registrazione, track operazioni aziendali, autenticarsi correttamente e non memorizzare o registrare mai credenziali sensibili.

Sicurezza del servizio Web WS

Cos'è la sicurezza WS?

WS Security è uno standard che si occupa della sicurezza durante lo scambio di dati nell'ambito di un servizio Web. Questa è una caratteristica fondamentale di SOAP che lo rende molto popolare per la creazione di servizi Web.

La sicurezza è una caratteristica importante in qualsiasi applicazione web. Poiché quasi tutte le applicazioni web sono esposte a Internet, esiste sempre la possibilità di una minaccia alla sicurezza delle applicazioni web. Pertanto, durante lo sviluppoping Nel caso di applicazioni web, è sempre consigliabile assicurarsi che l'applicazione sia progettata e sviluppata tenendo conto della sicurezza.

Minacce alla sicurezza e contromisure

Per comprendere le minacce alla sicurezza che possono essere ostili a un'applicazione web, analizziamo un semplice scenario di un'applicazione web e vediamo come funziona in termini di sicurezza.

Una delle misure di sicurezza disponibili per HTTP è il protocollo HTTPS. HTTPS è il metodo sicuro per la comunicazione tra client e server sul web. HTTPS utilizza il Secure Sockets Layer, o SSL, per garantire una comunicazione sicura. Sia il client che il server dispongono di un certificato digitale per identificarsi come autentici durante qualsiasi comunicazione tra di loro.

Minacce alla sicurezza e contromisure HTTPS

In una comunicazione HTTPS standard tra client e server, si verificano i seguenti passaggi:

  1. Il client invia una richiesta al server tramite il certificato client. Quando il server vede il certificato client, lo prende nota nel suo sistema di cache in modo che sappia che la risposta dovrebbe tornare solo a questo client.
  2. Il server quindi si autentica presso il client inviando il proprio certificato. Ciò garantisce che il client comunichi con il server giusto.
  3. Tutte le comunicazioni successive tra client e server sono crittografate. Ciò garantisce che, qualora altri utenti tentassero di violare la sicurezza e ottenere i dati richiesti, non sarebbero in grado di leggerli perché crittografati.

Tuttavia, il tipo di sicurezza descritto sopra non funziona in tutte le situazioni. Può capitare che il client debba comunicare con più server contemporaneamente. L'esempio riportato di seguito mostra un client che comunica contemporaneamente con un database e un server web. In questi casi, non tutte le informazioni possono transitare attraverso il protocollo HTTPS.

Minacce alla sicurezza e contromisure per più server

È qui che SOAP entra in gioco per superare tali ostacoli grazie alla specifica WS Security. Con questa specifica, tutti i dati relativi alla sicurezza sono definiti nell'elemento di intestazione SOAP. L'elemento di intestazione può contenere le seguenti informazioni:

  1. Se il messaggio all'interno del corpo SOAP è stato firmato con una chiave di sicurezza, tale chiave può essere definita nell'elemento header.
  2. Se un qualsiasi elemento all'interno del corpo SOAP è crittografato, l'intestazione conterrà le chiavi di crittografia necessarie affinché il messaggio possa essere decrittografato una volta raggiunto il destinatario.

In un ambiente multi-server, la tecnica di autenticazione SOAP descritta sopra risulta utile nei seguenti modi:

  • Poiché il corpo SOAP è crittografato, potrà essere decrittografato solo dal server Web che ospita il servizio Web. Ciò è dovuto al modo in cui è progettato il protocollo SOAP.
  • Supponiamo che il messaggio venga inviato al server del database tramite una richiesta HTTP; non può essere decifrato perché il database non dispone dei meccanismi necessari per farlo.
  • Solo quando la richiesta raggiunge effettivamente il server Web come protocollo SOAP, quest'ultimo sarà in grado di decifrare il messaggio e inviare la risposta appropriata al client.

Vedremo nei prossimi argomenti come lo standard WS Security può essere utilizzato per SOAP.

Standard di sicurezza dei servizi Web

Come discusso nella sezione precedente, lo standard WS-Security si basa sull'inclusione della definizione di sicurezza nell'intestazione SOAP. Le credenziali nell'intestazione SOAP vengono gestite in due modi.

Innanzitutto, definisce un elemento speciale chiamato UsernameToken. Questo viene utilizzato per passare nome utente e password al servizio web. L'altro metodo consiste nell'utilizzare un token binario tramite il BinarySecurityToken. Questo viene utilizzato in situazioni in cui si impiegano tecniche di crittografia come Kerberos o X.509.

Il diagramma seguente mostra il flusso di funzionamento del modello di sicurezza in WS Security.

Flusso di lavoro degli standard di sicurezza dei servizi web

Di seguito sono riportate le fasi del flusso di lavoro descritto sopra:

  1. È possibile inviare una richiesta dal client del servizio Web al servizio di token di sicurezza. Questo servizio può essere un servizio Web intermedio, specificamente progettato per fornire nomi utente/password o certificati al servizio Web SOAP vero e proprio.
  2. Il token di sicurezza viene quindi passato al client del servizio Web.
  3. Il client del servizio Web chiama quindi il servizio Web, ma questa volta assicurandosi che il token di sicurezza sia incorporato nel messaggio SOAP.
  4. Il servizio Web comprende quindi il messaggio SOAP con il token di autenticazione e può quindi contattare il servizio token di sicurezza per verificare se il token di sicurezza è autentico o meno.

Il frammento di codice seguente mostra il formato della parte di autenticazione, che fa parte del documento WSDL. In base a questo frammento, il messaggio SOAP conterrà due elementi aggiuntivi: il nome utente e la password.

<xs:element name="UsernameToken">
   <xs:complexType>
      <xs:sequence>
         <xs:element ref="Username"/>
         <xs:element ref="Password" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:ID"/>
   </xs:complexType>
</xs:element>

Quando il messaggio SOAP viene effettivamente trasmesso tra client e server, la parte del messaggio contenente le credenziali dell'utente potrebbe apparire come quella mostrata sopra. Il nome dell'elemento wsse è un nome di elemento speciale definito per SOAP e indica che contiene informazioni di sicurezza.

Come creare servizi web sicuri

Ora esaminiamo un esempio di sicurezza per un servizio web SOAP. Costruiremo un sistema di sicurezza per servizi web basandoci sull'esempio mostrato in precedenza nel capitolo SOAP e aggiungeremo un ulteriore livello di sicurezza.

Nel nostro esempio, creeremo un semplice servizio web che verrà utilizzato per restituire una stringa all'applicazione che lo richiama. Questa volta, però, quando il servizio web viene invocato, è necessario fornire le credenziali al servizio chiamante. Seguiamo i passaggi seguenti per creare il nostro servizio web SOAP e aggiungere la definizione di sicurezza.

Passo 1) Il primo passo è creare un file vuoto Asp.Net Applicazione Web. Da Visual Studio 2013, fare clic sull'opzione di menu File->Nuovo progetto.

Creazione di un nuovo progetto per servizi web sicuri

Una volta cliccato sull'opzione Nuovo progetto, Visual Studio ti darà un'altra finestra di dialogo per scegliere il tipo di progetto e per fornire i dettagli necessari del progetto. Questo è spiegato nel passaggio successivo.

Passo 2) In questa fase,

  1. Assicurati di scegliere prima il C# Modello Web per applicazioni Web ASP.NET. Il progetto deve essere di questo tipo per poter creare un progetto di servizi Web. Scegliendo questa opzione, Visual Studio eseguirà automaticamente i passaggi necessari per aggiungere i file richiesti da qualsiasi applicazione Web.
  2. Dai un nome al tuo progetto che nel nostro caso è stato dato come "servizio web.asmxAssicurati quindi di specificare la posizione in cui verranno archiviati i file del progetto.

Dettagli del progetto Build Secure Web Services

Una volta completata l'operazione, il file di progetto creato sarà visibile in Esplora soluzioni di Visual Studio 2013.

Esplora soluzioni per la creazione di servizi Web sicuri

Passo 3) In questo passaggio, aggiungeremo un file di servizio Web al nostro progetto.

  1. Innanzitutto, fai clic con il pulsante destro del mouse sul file di progetto, come mostrato di seguito.

Progetto di creazione di servizi Web sicuri (fare clic con il pulsante destro del mouse)

  1. Dopo aver fatto clic con il pulsante destro del mouse sul file di progetto, è possibile scegliere l'opzione "Aggiungi -> Servizio Web (ASMX)" per aggiungere un file di servizio web. È sufficiente specificare il nome "Servizio Tutorial" per il file del servizio web.

Creare servizi Web sicuri aggiungere servizio Web

Il passaggio precedente visualizzerà una finestra di dialogo in cui è possibile inserire il nome del file del servizio web. Quindi, nella finestra di dialogo sottostante, inserire il nome TutorialService come nome del file.

Finestra di dialogo per la creazione del nome dei servizi Web sicuri

Passo 4) Aggiungi il seguente codice al tuo file asmx del Tutorial Service. Il frammento di codice seguente viene utilizzato per aggiungere una classe personalizzata che verrà utilizzata per modificare l'intestazione SOAP quando viene generato il messaggio SOAP. Poiché ora vogliamo aggiungere credenziali di sicurezza all'intestazione SOAP, questo passaggio è obbligatorio.

Creazione del codice AuthHeader per servizi Web sicuri

      return "This is a Guru99 Web Service";
   }

   public class AuthHeader : SoapHeader
   {
      public string UserName;
      public string Password;
   }
}

Code Spiegazione:

  1. Stiamo ora creando una classe separata chiamata AuthHeader che è di tipo Classe SoapHeaderOgni volta che si desidera modificare i dati trasmessi nell'intestazione SOAP, è necessario creare una classe che utilizzi la classe SoapHeader integrata di .NET. Personalizzando l'intestazione SOAP, è possibile passare un "Nome utente" e una "Password" quando viene richiamato il servizio web.
  2. Definiamo quindi le variabili "Nome Utente" e "Password" che sono di tipo stringa. Verranno utilizzati per contenere i valori del nome utente e della password che vengono passati al servizio web.

Passo 5) Come passaggio successivo, è necessario aggiungere il seguente codice allo stesso File TutorialService.asmx. Questo codice definisce effettivamente la funzione del nostro servizio web. Questa funzione restituisce una stringa "Questo è un Guru99 Servizio Web” al client. Ma questa volta, la stringa verrà restituita solo se l'applicazione client passa le credenziali al servizio web.

Tutorial sulla creazione di servizi Web sicuri Codice del servizio

public class TutorialService : System.Web.Services.WebService
{
   public AuthHeader Credentials;

   [SoapHeader("Credentials")]

   [WebMethod]
   public string Guru99WebService()
   {

      if (Credentials.UserName.ToLower() != "Guru99" ||
      Credentials.Password.ToLower() != "Guru99Password")
      {
         throw new SoapException("Unauthorized",
         SoapException.ClientFaultCode);
      }
      else
      return "This is a Guru99 Web service";
   }

Code Spiegazione:

  1. Qui stiamo creando un oggetto della classe AuthHeader creata nel passaggio precedente. Questo oggetto verrà passato al ns Guru99Webservice in cui il nome utente e la password possono essere esaminati attentamente.
  2. L'attributo [SoapHeader] viene ora utilizzato per specificare che quando viene chiamato il servizio Web, è necessario che vengano passati il ​​nome utente e la password.
  3. In questo blocco di codice, stiamo effettivamente esaminando il nome utente e la password passati quando viene chiamato il servizio web. Se il nome utente è uguale a "Guru99” e la password è uguale a “Guru99Password”, quindi il messaggio di “Questo è un GuruIl servizio Web "99" viene passato al client. Altrimenti, verrà inviato un errore al client se vengono inseriti nome utente e password errati.

Se il codice viene eseguito correttamente, quando si esegue il codice nel browser verrà visualizzato il seguente output.

Produzione:

Output della creazione di servizi Web sicuri

L'output sopra riportato viene mostrato quando il programma è in esecuzione, il che significa che il servizio Web è ora disponibile. Facciamo clic su Servizio Descriptcollegamento ionico.

Descrizione del servizio Build Secure Web Services

Dalla descrizione del servizio potrai ora vedere che il nome utente e la password sono elementi del servizio wsdl file. Questi parametri devono essere inviati quando viene richiamato il servizio web.

Le migliori pratiche per la sicurezza dei servizi Web

Di seguito sono riportate le considerazioni di sicurezza da tenere presenti quando si lavora con i servizi Web:

  1. Gestione delle verifiche e dei registri – Utilizza la registrazione delle applicazioni per registrare tutte le richieste in arrivo ai servizi web. Questo fornisce un report dettagliato su chi ha richiamato il servizio web e può essere utile per l'analisi dell'impatto in caso di violazione della sicurezza.
  2. Flusso delle chiamate al servizio web – Cercate di monitorare il flusso delle chiamate nei servizi web. Di default, un'applicazione può effettuare più richieste a servizi web, con token di autenticazione scambiati tra questi servizi. Tutte le chiamate tra servizi web devono essere monitorate e registrate.
  3. Informazione sensibile – Non includere informazioni sensibili nei tuoi log, come password, numeri di carta di credito o qualsiasi altra informazione riservata. Se un evento contiene una qualsiasi di queste informazioni, è necessario eliminarla prima di registrarlo.
  4. Track Business Operazioni - Track operazioni aziendali significative. Ad esempio, strumenta la tua applicazione per registrare l'accesso a metodi e logiche aziendali particolarmente sensibili. Prendiamo come esempio un negozio onlineping applicazione. Ci sono più passaggi in un'applicazione tipica, come la scelta degli articoli da acquistare, gli articoli caricati nel carrello e quindi l'acquisto finale. L'intero flusso di lavoro aziendale deve essere tracgestito dal servizio web.
  5. Autenticazione corretta L'autenticazione è il meccanismo tramite il quale i client possono stabilire la propria identità con il servizio web utilizzando un determinato insieme di credenziali che ne attestino l'identità. Le credenziali dell'utente non devono mai essere memorizzate; pertanto, se si utilizza WS Security per richiamare il servizio web, è importante notare che il servizio web non deve memorizzare le credenziali inviate nell'intestazione SOAP. Queste devono essere scartate dal servizio web.

DOMANDE FREQUENTI

L'intelligenza artificiale può monitorare il traffico dei servizi web in tempo reale, rilevare modelli di richiesta insoliti e segnalare potenziali attacchi come l'iniezione di codice o l'abuso di token. Può anche analizzare le configurazioni WSDL e SOAP alla ricerca di autenticazioni deboli o crittografia mancante.

Sì. I modelli di machine learning addestrati sul traffico normale possono individuare anomalie come il credential stuffing, le intestazioni SOAP non valide o gli attacchi di replay. I team di sicurezza dovrebbero comunque esaminare gli avvisi prima di bloccare le richieste per evitare di interrompere il servizio ai client legittimi.

HTTPS crittografa la connessione tra due punti, quindi i dati vengono esposti una volta raggiunto un server intermedio. WS-Security protegge il messaggio SOAP stesso, mantenendoloping Garantisce una protezione completa, anche quando i dati transitano attraverso più server.

Un UsernameToken è un elemento WS-Security inserito nell'intestazione SOAP che contiene un nome utente e, facoltativamente, una password. Consente a un servizio web di autenticare il chiamante prima di elaborare la richiesta.

Riassumi questo post con: