Febbraio 2019

Volume 34 Numero 2

Il presente articolo è stato tradotto automaticamente.

[Computing riservati azure]

Proteggi i tuoi dati con il Confidential computing di Azure

Dal Stefano Tempesta | Febbraio 2019

La sicurezza è un fattore fondamentale per accelerare l'adozione del cloud computing, ma è anche delle principali preoccupazioni quando si passa a un publiccloud estremamente riservati di proprietà intellettuale (IP) e i dati. Esistono modi comuni per la protezione dei dati inattivi e in transito, ma le minacce possono verificarsi anche durante l'elaborazione di dati in memoria. Computing riservati nuovi dati vengono aggiunti alle tue applicazioni con funzionalità di sicurezza attendibili gli ambienti di esecuzione (TEE) e i meccanismi di crittografia per proteggere i dati mentre è in uso. TEE, noto anche come zone franche, sono implementazioni di hardware o software che salvaguardare i dati elaborati da un accesso dall'esterno dell'enclave. Un'enclave fornisce un contenitore protetto attraverso la protezione di una parte del processore e memoria, come illustrato nella figura 1. Solo il codice autorizzato è consentito eseguire e accedere ai dati, in modo da codice e i dati siano protetti da visualizzazione e modifica dall'esterno di TEE.

Codice e i dati in esecuzione in un'Enclave protetta
Figura 1 codice e i dati in esecuzione in un'Enclave protetta

Una questione di attendibilità

Con il recente annuncio della disponibilità pubblica dell'informatica riservate in Azure, Microsoft è diventato il primo provider di cloud che offre protezione per i dati in uso (bit.ly/2OyyxaH e bit.ly/2BxQkpp). Il post sul blog di Azure ufficiale (bit.ly/2I692X1) descrive anche: "... Computing riservati Azure protegge i dati mentre è in uso. Si tratta della parte finale per abilitare la protezione dei dati tramite il ciclo di vita se inattivi, in transito, o è in uso. È l'elemento fondamentale della nostra visione 'Cloud riservato', che mira a rendere i dati e codice opaca per il provider di servizi cloud".

Il concetto di "dati opachi e il codice" è rivoluzionario. Per la prima volta, si può avere attendibilità nel cloud che nessun, tra cui il provider di cloud, possono leggere i dati. I dati vengono crittografati in ogni fase e solo le applicazioni autorizzate dispongono della chiave per decrittografare i dati e accedervi. Questa operazione viene eseguita in due modi:

• Hardware: Grazie a una partnership con Intel, Azure può offrire macchine virtuali protette da hardware che eseguono sulla tecnologia Intel Software Guard Extensions (SGX). Intel SGX è un set di estensioni per l'architettura della CPU Intel che mira a fornire l'integrità e riservatezza garantisce al calcolo sensibile eseguite in un computer, in cui potrebbe essere potenzialmente tutto il software privilegiato (kernel, hypervisor e così via) compromessi.

• Hypervisor: La sicurezza basata su virtualizzazione (VBS) è un TEE basata su software che viene implementato da Hyper-V in Windows 10 e Windows Server 2016. Hyper-V impedisce l'esecuzione nel computer o server, così come gli amministratori locali e gli amministratori del servizio cloud di visualizzazione del contenuto dell'enclave o modificare l'esecuzione di codice di amministratore.

Le applicazioni potenziale per il calcolo riservati sono realmente illimitate. Ogni volta che un requisito per la protezione dei dati sensibili, gli ambienti di esecuzione affidabile rappresentano le procedure di base su cui è possibile abilitare nuovi scenari di business sicure e casi d'uso. SQL Server Always Encrypted rappresenta un'applicazione tipica che fornisce i dati di una maggiore riservatezza e integrità (bit.ly/2zS7TPQ). Always Encrypted protegge i dati in uso da un Insider malintenzionato con privilegi amministrativi e protegge da malware e di utenti malintenzionati che sfruttano i bug nel sistema operativo, applicazioni o hypervisor. Con l'utilizzo di calcolo riservati, SQL Always Encrypted consente di proteggere dati riservati in uso la crittografia sul posto, mantenendo tuttavia le funzionalità di query avanzate di SQL Server. Questo è un miglioramento della funzionalità crittografia sempre attiva corrente in SQL Server, che ora garantisce che i dati sensibili all'interno di un database SQL possono essere crittografati a tutte le volte senza compromettere la funzionalità di query SQL. Always Encrypted esegue questa operazione tramite delega calcoli sui dati riservati a un'enclave, in cui i dati in modo sicuro decrittografati ed elaborati.

Oltre a SQL Server, molti settori e tecnologie possono trarre vantaggio dall'elaborazione riservate di Azure. In finance, ad esempio, strategie di gestione dati e l'ampia gamma di portafoglio personale non è più sarebbe visibile all'esterno di un TEE. Le organizzazioni sanitarie possono collaborare condividendo i dati dei pazienti privati, come le sequenze di genomiche, per ottenere informazioni più dettagliate da machine learning in più set di dati, senza il rischio che i dati vengano trasferiti ad altre organizzazioni. Le organizzazioni possono condividere i set di dati in modo riservato per combinare più origini dati per supportare la protezione più parti scenari di machine learning. Servizi di Machine learning per ottenere una maggiore precisione della stima, lavorando a un modello sottoposto a training più grande, ma le organizzazioni possono comunque mantenere le proprie informazioni dei clienti (i dati vengono condivisi in formato crittografato, visibile solo per il servizio di machine learning). Nel petrolio e gas e scenari IoT, dati sismici sensibili che rappresenta la proprietà intellettuale principale di un'azienda possono essere spostati nel cloud per l'elaborazione, ma con la protezione della tecnologia di crittografia in uso.

Un'altra applicazione significativa è la creazione di una rete attendibile distribuita tra un set di partecipanti non attendibili. Il Framework di Blockchain Consortium riservati consente reti blockchain estremamente scalabile e riservate possono risiedere in un'infrastruttura di cloud pubblico e a usufruire dei vantaggi ampi di Azure. Le reti di blockchain con autorizzazione che si basano su nodi attendibili denominati validator per certificare le transazioni vantaggio dalla piattaforma di calcolo riservate di Azure per una migliore verificare la catena di attendibilità in una rete decentralizzata. Ciò semplifica il consenso e, infine, l'elaborazione per la riservatezza e l'elevata velocità effettiva delle transazioni.

A tale scopo, le applicazioni in esecuzione in un'enclave necessari:

1. Un'API multipiattaforma comune che siano coerente in TEE, entrambi hardware e software, in modo che il codice dell'applicazione riservati è portabile.

2. Attestazione, che include la verifica dell'identità del codice in esecuzione in Tee per stabilire relazioni di trust con il codice e determinare se rilasciare i dati protetti a esso.

Inizia subito

Per iniziare a usare l'elaborazione riservate in Azure, accedere al Marketplace di Azure, distribuire e configurare una macchina virtuale e installare il SDK per l'Enclave Open (openenclave.io/sdk). il SDK di Enclave aprire è un progetto open source per la creazione di un'astrazione singolo enclaving unificata per gli sviluppatori a creare applicazioni basate su TEE nei linguaggi C e C++. Supporta un set di API che consente di compilare un'applicazione una sola volta e distribuirlo in più piattaforme (Linux e Windows) e ambienti, dai sistemi cloud a hybrid al bordo.

Durante la distribuzione di una macchina virtuale, molte delle configurazioni di distribuzione della macchina virtuale di base sono supportati tramite il flusso di lavoro di distribuzione di macchine Virtuali di elaborazione riservate nel portale di Azure, ad esempio la scelta della piattaforma supportata, la creazione di un nuovo o join di un gruppo di risorse e della rete virtuale, scelta del tipo di archiviazione e il disco, l'abilitazione di diagnostica e altre proprietà esistenti.

È possibile leggere come installare il SDK di Enclave aperto dal repository GitHub ufficiale nella bit.ly/2AdKs4D.

Dopo aver installato il SDK, è possibile iniziare a compilare la prima applicazione per l'esecuzione in un'enclave. Come illustrato nella figura 2, un'applicazione di enclave stesso suddivide in due componenti: un componente non attendibile, denominato host e un componente attendibile, chiamato l'enclave. Un'enclave è un contenitore protetto di cui memoria è protetti dall'accesso da entità esterne, inclusi il sistema operativo host, gli utenti con privilegi e anche l'hardware. Tutte le funzionalità che devono essere eseguito in un TEE devono essere compilata nell'enclave binario. Un host è un'applicazione in modalità utente normale che carica un'enclave nel proprio spazio degli indirizzi prima di iniziare a interagire con l'enclave.

Il modello di App di Enclave
Figura 2 modello App Enclave

L'applicazione di Enclave

L'applicazione di esempio che utilizzerò per compilare stampa un messaggio nell'enclave prima di chiamare nuovamente all'host per stampare un messaggio da qui, troppo. L'host crea inizialmente una enclave e quindi chiama la funzione enclave_message nell'enclave per stampare un messaggio. Questa funzione chiama quindi nuovamente all'host per stampare un messaggio di conferma prima di restituire l'enclave. Dopo la funzione di enclave restituzione all'host, il processo viene terminato.

In primo luogo, definire le funzioni che vuole chiamare tra l'enclave e l'host. A tale scopo, creare un file functions.edl, che contiene l'enclave e l'host, le definizioni di funzione:

enclave {
  trusted {
    public void enclave_message();
  };

  untrusted {
    void host_acknowledgment();
  };
};

Il file EDL definisce le funzioni che chiamano in e da zone franche, insieme ai parametri che vengono passati in queste funzioni. Lo strumento oeedger8r, disponibile nel SDK di Apri dell'Enclave, viene utilizzato per generare il codice di marshalling necessario per chiamare le funzioni tra l'enclave e l'host. Marshalling di codice dall'host dell'enclave viene eseguito per motivi di sicurezza, per ridurre i rischi ad alcune vulnerabilità del processore (ad esempio spectre). Troverai altre informazioni sull'utilizzo dello strumento oeedger8r Enclave Open in bit.ly/2BaQB2d.

Esaminiamo le due funzioni definite nel file EDL più in dettaglio. La funzione enclave_message figura 3 viene implementato all'interno dell'enclave attendibile e viene richiamato dall'host non attendibile. Per l'host sia in grado di chiamare questa funzione, l'host deve chiamare tramite SDK di Apri Enclave per la transizione dall'host non attendibile l'enclave attendibile. A tale scopo, lo strumento oeedger8r genera un codice di marshalling nella directory dell'host con la stessa firma della funzione nell'enclave, con l'aggiunta di un handle di enclave in modo che il SDK sappia quali enclave eseguirà il codice.

Figura 3, la funzione di Enclave

void enclave_message()
{
  // Print a message from the enclave.
  fprintf(stdout, "Hello from the enclave\n");

  // Call back into the host.
  oe_result_t result = host_acknowledgment();
  if (result != OE_OK)
  {
    fprintf(stderr, "Call to host failed: %u (%s)\n", result, 
      oe_result_str(result));
  }
}

Si noti che, sebbene enclave_message Usa fprintf per stampare un messaggio, questa funzione presenta una dipendenza sul kernel di stampare un messaggio sullo schermo, in modo che questo codice non può essere eseguito all'interno dell'enclave stesso. Al contrario, questa funzione effettua il marshalling la chiamata tramite all'host per eseguire la chiamata per conto dell'enclave.

L'operazione inversa vale anche per le funzioni definite nell'host non attendibili che deve chiamare in enclave attendibile. L'host non trusted viene eseguita la funzione host_acknowledgment, illustrata nella figura 4, e lo strumento oeedger8r genera un codice di marshalling con la stessa firma della funzione nell'host.

Figura 4 l'applicazione Host

#include <openenclave/host.h>
#include <stdio.h>
#include "functions_u.h"

void host_acknowledgment()
{
  fprintf(stdout, "Call from enclave acknowledged.\n");
}

int main(int argc, const char* argv[])
{
  oe_result_t result;
  oe_enclave_t* enclave = NULL;

  // Create the enclave.
  result = oe_create_functions_enclave(argv[1], OE_ENCLAVE_TYPE_SGX, 
    OE_ENCLAVE_FLAG_DEBUG, NULL, 0, &enclave);
  if (result != OE_OK)
  {
    fprintf(stderr, "Create enclave failed: %u (%s)\n", result, 
      oe_result_str(result));
    return 1;
  }

  // Call into the enclave.
  result = enclave_message(enclave);
  if (result != OE_OK)
  {
    fprintf(stderr, "Call to enclave failed: %u (%s)\n", result, 
      oe_result_str(result));
    // Clean up the enclave.
    oe_terminate_enclave(enclave);
    return 1;
  }
    
  return 0;
}

Il processo host, un file eseguibile del linguaggio C normale con una funzione main standard che crea l'enclave e le chiamate, è ciò che comporta l'app di enclave. È responsabile della gestione della durata dell'enclave e richiamo di metodi di enclave. Un host, anche se in esecuzione in un servizio cloud, deve sempre essere considerato un componente non attendibile che non ha mai consentito per la gestione dei dati di testo normale previsto per l'enclave.

Vale la pena notare l'inclusione dell'intestazione functions_u.h non attendibili che viene generato durante la compilazione. Questo file viene creato chiamando il oeedger8r strumento SDK in base al file functions.edl. Anche includere stdio. h per fprintf (funzione). A differenza dell'implementazione dell'enclave, che include una versione speciale dell'enclave della libreria stdio che effettua il marshalling di API per l'host, l'host non è protetto, e pertanto Usa tutte le funzioni e librerie di C normale. Questa funzione oe_create_functions_enclave viene generata da oeedger8r. Questa funzione crea un'enclave per l'uso nel processo host e l'enclave alloca spazio di indirizzi. Il codice e dati da proteggere vengono quindi caricati nell'enclave all'indirizzo allocato. Per eseguire l'applicazione host, che viene chiamato functionshost, è possibile semplicemente richiamarla dalla riga di comando come:

functionshost ./enc/functionsenc.signed

Le istruzioni su come compilare l'applicazione sono disponibili nel repository del SDK di Apri Enclave (bit.ly/2CrTM6m). Il primo parametro del metodo main dell'host identifica il percorso del file di libreria con segno dell'enclave. Per scopi di test, è anche possibile eseguire l'applicazione nel modello di simulazione con--simulare comando:

functionshost ./enc/functionsenc.signed --simulate

La Guida "Guida introduttiva con l'Enclave aperto in modalità simulatore" viene descritto come impostare il simulatore di enclave (bit.ly/2LvA2BT).

Attestazione

Prima di una enclave può essere considerato attendibile con i dati riservati, è necessario dimostrare che è un'enclave in esecuzione in un TEE valido e che presenta l'identità corretta e le proprietà di runtime deve essere attendibile. Questo processo di fornire le identità e attendibilità da un antagonista è noto come attestazione.

Intel SGX supporta l'attestazione basata sulla CPU, l'abilitazione di un sistema remoto verificare a livello di crittografia che è stato caricato software specifico all'interno di una enclave. Il processo di bootstrap anche un canale crittografato end-to-end con l'enclave per la condivisione dei dati in un
modalità protetta. Durante la creazione dell'enclave, un hash sicuro, noto come una misura, definisce lo stato iniziale dell'enclave. L'enclave in un secondo momento può recuperare un report connesso dal processore che dimostra la propria identità e comunica un valore univoco (ad esempio, una chiave pubblica) a un altro enclave locale. Usando una delimitazione enclave attendibile, questo meccanismo può essere sfruttato per ottenere una verifica di attestazione noto come una virgoletta, che dimostra a un sistema remoto che il report proviene da un'enclave in esecuzione in un'implementazione SGX autentica. In definitiva, il produttore del processore (ad esempio, Intel) è la radice di attendibilità per l'attestazione.

L'enclave sottoposti ad attestazione esigenze prima di generare un modello di prova con crittografia complessa della propria identità in grado di verificare l'host. Questa operazione viene eseguita inserendo la piattaforma SGX per generare un report connesso dal metodo oe_get_report nel SDK di Apri dell'Enclave, la cui firma è:

oe_result_t result = oe_get_report(OE_REPORT_OPTIONS_REMOTE_ATTESTATION, 
  reportDashHash, sizeof(reportDashHash), NULL, 0, quoteBuffer, quoteBuffesSize);

È possibile attivare alternativamente tipi locali e remoti di attestazione eliminando o aggiungendo l'opzione OE_REPORT_OPTIONS_REMOTE_ATTESTATION, rispettivamente. Il rapporto locale può essere verificato esclusivamente da un'altra istanza di questa enclave nello stesso computer, mentre i report remoto può essere verificato con il metodo oe_verify_report in esecuzione in un computer diverso.

Una caratteristica importante degli oe_get_report è che è possibile passare i dati specifici dell'applicazione per eseguire l'accesso al report. In genere, si accede ai dati (con il parametro reportDashHash) a report dal primo hashing prima di passarlo alla chiamata oe_get_report. Ciò è utile per l'avvio di un canale di comunicazione sicura tra l'enclave e l'antagonista.

Quando il report viene generato e passato all'antagonista, l'antagonista può chiamare oe_verify_report per convalidare che il report ha avuto origine da una piattaforma SGX valida. Un rapporto locale viene verificato mediante il report SGX chiavi utilizzate dalla piattaforma per la firma e un report remoto viene verificato mediante la catena di certificati rilasciata solo per piattaforme SGX valide da Intel. A questo punto, l'antagonista sa che il report ha avuto origine da un'enclave in esecuzione in una piattaforma SGX valida e che le informazioni del report possono essere considerato attendibile:

oe_result_t result = oe_verify_report(quote, quoteSize, &parsedReport);
bool verified = memcmp(parsedReport.identity.authorID, 
  g_MRSigner, sizeof(g_MRSigner)) == 0;

Infine, spetta all'app di enclave per verificare che l'identità e le proprietà dell'enclave visibili nel report corrisponde al relativo aspettativa. SDK di Apri Enclave espone un modello di identità generalizzato per supportare questo processo tra tipi TEE, definiti nella struttura di oe_identity_t:

typedef struct _oe_identity
{
uint32_t idVersion;
uint32_t idVersion;
uint32_t securityVersion;
uint64_t attributes;
uint8_t uniqueID[OE_UNIQUE_ID_SIZE];
uint8_t authorID[OE_AUTHOR_ID_SIZE];
uint8_t productID[OE_PRODUCT_ID_SIZE];
} oe_identity_t;

Test normalmente per productID e la versione securityVersion per convalidare l'identità prevista dell'enclave, come indicato di seguito:

bool productVerified = parsedReport.identity.productID[0] == 1;
bool versionVerified = parsedReport.identity.securityVersion >= 1;

Garantirà che l'identità dell'enclave corrisponda al valore previsto, verificando il valore ID univoco. Tenere presente che le eventuali patch all'enclave cambieranno in futuro l'ID univoco.

Prima di procedere

Prima di poter eseguire l'enclave, è necessario specificare le proprietà che definiscono la modalità deve essere caricato l'enclave. Queste proprietà, con la chiave di firma, definiscono l'identità dell'enclave che viene usato per operazioni di attestazione e il sigillo. Nel SDK di Apri dell'Enclave, queste proprietà possono essere collegate all'enclave come parte del processo di firma. A tale scopo, è necessario usare lo strumento oesign che accetta i parametri seguenti:

oesign ENCLAVE CONFFILE KEYFILE

Vale la pena sottolineare che, per scopi di test, è possibile eseguire un'enclave in modalità di debug senza firmarla prima di tutto. Tuttavia, come una parola dell'avviso, tenere presente che zone franche in esecuzione in modalità di debug non sono riservati e assicurarsi che la modalità debug è disabilitata prima di distribuire un'enclave all'ambiente di produzione. Informazioni dettagliate su come compilare e firmare un'enclave e come abilitare la modalità di debug, sono disponibili nella documentazione di SDK di Apri Enclave (bit.ly/2EH0eJ7).

Infine, il processo host è ciò che comporta l'app di enclave. È responsabile della gestione della durata dell'enclave e chiamata di funzioni di enclave. Gli host, anche se vengono eseguiti in un ambiente cloud, devono essere considerato un componente non attendibile che non ha mai consentito per la gestione come testo non crittografato o dati binari deve essere l'enclave. A differenza delle funzioni dell'enclave, sono presenti relativamente meno restrizioni sulla creazione di un'applicazione host. In generale, si possono collegare la scelta di librerie aggiuntive all'applicazione host. Al contrario, le funzioni di enclave hanno un supporto limitato per le librerie esterne, per motivi di sicurezza. Con SDK di Apri Enclave evoluzione, il supporto per librerie aggiuntive continua a migliorare. Per informazioni sulle librerie supportate, consultare il sito Web SDK Enclave aperti (openenclave.io).

È Open Source.

Come ho già detto, il SDK di Enclave aprire è open source. L'intenzione è una soluzione non fornitore specifico che supporta l'enclave applicazioni nelle piattaforme Windows sia Linux. L'implementazione corrente di Enclave Open è basato su Intel SGX; altre architetture di enclave, ad esempio soluzioni di AMD o ARM, verranno aggiunto in futuro.

Questo progetto è lieta di ricevere contributi e suggerimenti. La maggior parte dei contributi è necessario accettare a un collaboratore contratto di licenza (CLA) dichiara di avere il diritto di ed effettivamente concede, il team di Enclave aperti i diritti di utilizzo al contributo. Se si vuole contribuire al SDK di Apri dell'Enclave, consultare le linee guida per il contributo alla bit.ly/2TbQ4DJ.


Stefano Tempesta è un Microsoft Regional Director, MVP su intelligenza artificiale e applicazioni aziendali e membro del Consiglio di Blockchain. Partecipa regolarmente come oratore a conferenze IT internazionali, tra cui Microsoft Ignite e Tech Summit, interessi di Tempesta estendono blockchain e tecnologie correlate per intelligenza artificiale. Ha creato "Blogchain spazio" (blogchain.space), un blog sulle tecnologie della blockchain, scrive per MSDN Magazine e MS Dynamics e pubblica esperimenti di machine learning su "Azure AI Gallery" (Gallery.Azure.ai).


Discutere di questo articolo nel forum di MSDN Magazine