Sicurezza di Azure Service Fabric

Per altre informazioni sulle procedure consigliate per la sicurezza di Azure, vedere Procedure consigliate per la sicurezza di Azure Service Fabric

Insieme di credenziali delle chiavi di

Azure Key Vault e il servizio di gestione dei segreti consigliato per le applicazioni e i cluster Azure Service Fabric.

Nota

Se i certificati/segreti da un insieme di credenziali delle chiavi vengono distribuiti in un set di scalabilità di macchine virtuali come segreto del set di scalabilità di macchine virtuali, l'insieme di credenziali delle chiavi e il set di scalabilità di macchine virtuali devono avere un percorso condiviso.

Creare un certificato di Service Fabric rilasciato da un'autorità di certificazione

Un certificato di Azure Key Vault può essere creato o importato in un insieme di credenziali delle chiavi. Quando viene creato un certificato di Key Vault, la chiave privata viene creata all'interno dell'insieme di credenziali delle chiavi e mai esposta al proprietario del certificato. Questi sono i modi per creare un certificato in Key Vault:

  • Creare un certificato autofirmato per creare una coppia di chiavi pubblica e privata e associarla a un certificato. Il certificato viene firmato dalla propria chiave.
  • Creare un nuovo certificato manualmente per creare una coppia di chiavi pubblica e privata e generare una richiesta di firma del certificato X.509. La richiesta di firma può essere firmata dall'autorità di registrazione o di certificazione. Per completare il certificato KV in Key Vault, il certificato X.509 firmato può essere unito con la coppia di chiavi in sospeso. Anche se questo metodo richiede più passaggi, offre maggiore sicurezza perché la chiave privata viene creata e limitata a Key Vault. Il concetto è illustrato nel diagramma seguente.

Per altri dettagli, vedere Metodi di creazione dei certificati.

Distribuire i certificati di Key Vault nei set di scalabilità di macchine virtuali del cluster di Service Fabric

Per distribuire i certificati da un insieme di credenziali con percorso condiviso a un set di scalabilità di macchine virtuali, usare osProfile del set di scalabilità di macchine virtuali. Di seguito sono elencate le proprietà del modello di Resource Manager:

"secrets": [
   {
       "sourceVault": {
           "id": "[parameters('sourceVaultValue')]"
       },
       "vaultCertificates": [
          {
              "certificateStore": "[parameters('certificateStoreValue')]",
              "certificateUrl": "[parameters('certificateUrlValue')]"
          }
       ]
   }
]

Nota

L'insieme di credenziali deve essere abilitato per la distribuzione dei modelli di Resource Manager.

Applicare un elenco di controllo di accesso (ACL) al certificato per il cluster di Service Fabric

Per configurare la sicurezza dei nodi viene usato il modello Estensioni set di scalabilità di macchine virtuali con editore Microsoft.Azure.ServiceFabric. Per applicare un ACL ai certificati per i processi del cluster di Service Fabric, usare le proprietà del modello di Resource Manager seguenti:

"certificate": {
   "commonNames": [
       "[parameters('certificateCommonName')]"
   ],
   "x509StoreName": "[parameters('certificateStoreValue')]"
}

Proteggere un certificato del cluster di Service Fabric in base al nome comune

Per proteggere il cluster di Service Fabric in base al valore Common Name del certificato, usare la proprietà del modello di Resource Manager certificateCommonNames, come indicato di seguito:

"certificateCommonNames": {
    "commonNames": [
        {
            "certificateCommonName": "[parameters('certificateCommonName')]",
            "certificateIssuerThumbprint": "[parameters('certificateIssuerThumbprint')]"
        }
    ],
    "x509StoreName": "[parameters('certificateStoreValue')]"
}

Nota

I cluster di Service Fabric useranno il primo certificato valido trovato nell'archivio certificati dell'host. In Windows, questo sarà il certificato con la data di scadenza più recente corrispondente al nome comune e all'identificazione digitale dell'autorità emittente.

I domini di Azure, ad esempio *<SOTTODOMINIO>.cloudapp.azure.com o <SOTTODOMINIO>.trafficmanager.net, sono di proprietà di Microsoft. Le autorità di certificazione non rilasceranno certificati per i domini a utenti non autorizzati. La maggior parte degli utenti dovrà acquistare un dominio da un registrar, o essere un amministratore di dominio autorizzato, per ottenere il rilascio di un certificato con tale nome comune da un'autorità di certificazione.

Per altri dettagli su come configurare il servizio DNS per risolvere il dominio in un indirizzo IP di Microsoft, vedere come configurare DNS di Azure per ospitare il dominio.

Nota

Dopo aver delegato i server dei nomi di domini ai server dei nomi di zona di DNS di Azure, aggiungere i due record seguenti alla zona DNS:

  • Un record 'A' per un dominio APEX che non è un Alias record set per tutti gli indirizzi IP che verranno risolti dal dominio personalizzato.
  • Un record "C" per i sottodomini Microsoft di cui è stato effettuato il provisioning che NON sono un Alias record set. Ad esempio, è possibile usare il nome DNS di Gestione traffico o Load Balancer.

Per aggiornare il portale in modo da visualizzare un nome DNS personalizzato per il cluster di Service Fabric "managementEndpoint", aggiornare le proprietà del modello di Resource Manager del cluster di Service Fabric seguenti:

 "managementEndpoint": "[concat('https://<YOUR CUSTOM DOMAIN>:',parameters('nt0fabricHttpGatewayPort'))]",

Crittografia dei valori dei segreti dei pacchetti di Service Fabric

I valori comuni crittografati nei pacchetti di Service Fabric includono le credenziali di Registro Azure Container, le variabili di ambiente, le impostazioni e chiavi dell'account di archiviazione del plug-in Azure Volume.

Per configurare un certificato di crittografia e crittografare segreti in cluster Windows:

Generare un certificato autofirmato per crittografare il segreto:

New-SelfSignedCertificate -Type DocumentEncryptionCert -KeyUsage DataEncipherment -Subject mydataenciphermentcert -Provider 'Microsoft Enhanced Cryptographic Provider v1.0'

Usare le istruzioni in Distribuire i certificati di Key Vault nei set di scalabilità di macchine virtuali del cluster di Service Fabric per distribuire i certificati di Key Vault nei set di scalabilità di macchine virtuali del cluster di Service Fabric.

Crittografare il segreto con il comando PowerShell seguente e quindi aggiornare il manifesto dell'applicazione di Service Fabric con il valore crittografato:

Invoke-ServiceFabricEncryptText -CertStore -CertThumbprint "<thumbprint>" -Text "mysecret" -StoreLocation CurrentUser -StoreName My

Per configurare un certificato di crittografia e crittografare segreti in cluster Linux:

Generare un certificato autofirmato per crittografare i segreti:

openssl req -newkey rsa:2048 -nodes -keyout TestCert.prv -x509 -days 365 -out TestCert.pem
cat TestCert.prv >> TestCert.pem

Usare le istruzioni in Distribuire i certificati di Key Vault nei set di scalabilità di macchine virtuali del cluster di Service Fabric per distribuire i certificati di Key Vault nei set di scalabilità di macchine virtuali del cluster di Service Fabric.

Crittografare il segreto usando i comandi seguenti e quindi aggiornare il manifesto dell'applicazione di Service Fabric con il valore crittografato:

echo "Hello World!" > plaintext.txt
iconv -f ASCII -t UTF-16LE plaintext.txt -o plaintext_UTF-16.txt
openssl smime -encrypt -in plaintext_UTF-16.txt -binary -outform der TestCert.pem | base64 > encrypted.txt

Dopo aver crittografato i valori protetti specificare i segreti crittografati nell'applicazione di Service Fabric e decrittografare i segreti crittografati dal codice del servizio.

Includere il certificato endpoint nelle applicazioni di Service Fabric

Per configurare il certificato dell'endpoint dell'applicazione, includere il certificato aggiungendo un elemento EndpointCertificate insieme all'elemento User per l'account principale al manifesto dell'applicazione. Per impostazione predefinita, l'account principale è NetworkService. In questo modo verrà fornita la gestione dell'ACL della chiave privata del certificato dell'applicazione per l'entità fornita.

<ApplicationManifest … >
  ...
  <Principals>
    <Users>
      <User Name="Service1" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Certificates>
    <EndpointCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbprint]"/>
  </Certificates>
</ApplicationManifest>

Includere il certificato segreto nelle applicazioni di Service Fabric

Per concedere all'applicazione l'accesso ai segreti, includere il certificato aggiungendo un elemento SecretsCertificate al manifesto dell'applicazione.

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbprint]"/>
  </Certificates>
</ApplicationManifest>

Autenticare le applicazioni di Service Fabric per le risorse di Azure usando l'identità del servizio gestita

Per informazioni sulle identità gestite per le risorse di Azure, vedere Informazioni sulle identità gestite per le risorse di Azure. I cluster di Azure Service Fabric sono ospitati in set di scalabilità di macchine virtuali, che supportano l'identità del servizio gestita. Per ottenere un elenco dei servizi a cui è possibile usare MSI per l'autenticazione, vedere Servizi di Azure che supportano l'autenticazione di Microsoft Entra.

Per abilitare l'identità gestita assegnata dal sistema durante la creazione di un set di scalabilità di macchine virtuali o per un set di scalabilità di macchine virtuali esistente, dichiarare la proprietà "Microsoft.Compute/virtualMachinesScaleSets" seguente:

"identity": { 
    "type": "SystemAssigned"
}

Per altre informazioni, vedere Informazioni sulle identità gestite per le risorse di Azure.

Se è stata creata un'identità gestita assegnata dall'utente, dichiarare la risorsa seguente nel modello per assegnarla al set di scalabilità di macchine virtuali. Sostituire \<USERASSIGNEDIDENTITYNAME\> con il nome dell'identità gestita assegnata dall'utente che è stata creata:

"identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
        "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
    }
}

Prima che l'applicazione di Service Fabric possa usare un'identità gestita, è necessario concedere autorizzazioni per le risorse di Azure necessarie per l'autenticazione. I comandi seguenti consentono di concedere l'accesso a una risorsa di Azure:

PRINCIPAL_ID=$(az resource show --id /subscriptions/<YOUR SUBSCRIPTON>/resourceGroups/<YOUR RG>/providers/Microsoft.Compute/virtualMachineScaleSets/<YOUR SCALE SET> --api-version 2018-06-01 | python -c "import sys, json; print(json.load(sys.stdin)['identity']['principalId'])")

az role assignment create --assignee $PRINCIPAL_ID --role 'Contributor' --scope "/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/<PROVIDER NAME>/<RESOURCE TYPE>/<RESOURCE NAME>"

Nel codice dell'applicazione di Service Fabric ottenere un token di accesso per Azure Resource Manager rendendo rest tutto simile al seguente:

ACCESS_TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true | python -c "import sys, json; print json.load(sys.stdin)['access_token']")

L'applicazione di Service Fabric può quindi usare il token di accesso per l'autenticazione per le risorse di Azure che supportano Active Directory. L'esempio seguente illustra come eseguire questa operazione per una risorsa di Azure Cosmos DB:

COSMOS_DB_PASSWORD=$(curl 'https://management.azure.com/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/Microsoft.DocumentDB/databaseAccounts/<YOUR ACCOUNT>/listKeys?api-version=2016-03-31' -X POST -d "" -H "Authorization: Bearer $ACCESS_TOKEN" | python -c "import sys, json; print(json.load(sys.stdin)['primaryMasterKey'])")

Elementi di base della sicurezza di Windows

È consigliabile implementare una configurazione standard del settore ampiamente nota e testata correttamente, ad esempio le baseline di sicurezza Microsoft, anziché creare una baseline manualmente; un'opzione per il provisioning di questi elementi nel set di scalabilità di macchine virtuali consiste nell'usare il gestore dell'estensione DSC (Desired State Configuration) di Azure, per configurare le macchine virtuali quando vengono online, in modo che eseguano il software di produzione.

Firewall di Azure

Firewall di Azure è un servizio di sicurezza di rete gestito basato sul cloud che consente di proteggere le risorse della rete virtuale di Azure. È un firewall completo con stato distribuito come servizio con disponibilità elevata incorporata e scalabilità cloud illimitata.; In questo modo è possibile limitare il traffico HTTP/S in uscita a un elenco specificato di nomi di dominio completi (FQDN) inclusi i caratteri jolly. Questa funzionalità non richiede la terminazione TLS/SSL. È consigliabile sfruttare i tag FQDN Firewall di Azure per Windows Aggiornamenti e abilitare il traffico di rete verso gli endpoint di Microsoft Windows Update possono fluire attraverso il firewall. Distribuire Firewall di Azure usando un modello fornisce un esempio per la definizione del modello di risorsa Microsoft.Network/azureFirewalls. Le regole del firewall comuni alle applicazioni di Service Fabric consentono quanto segue per la rete virtuale dei cluster:

  • *download.microsoft.com
  • *servicefabric.azure.com
  • *.core.windows.net

Queste regole del firewall integrano i gruppi di sicurezza di rete in uscita consentiti, che includono ServiceFabric e Archiviazione, come destinazioni consentite dalla rete virtuale.

TLS 1.2

Microsoft Azure consiglia a tutti i clienti di completare la migrazione verso soluzioni che supportano TLS 1.2 (Transport Layer Security) 1.2 e assicurarsi che TLS 1.2 venga usato per impostazione predefinita.

I servizi di Azure, incluso Service Fabric, hanno completato il lavoro di progettazione per rimuovere la dipendenza dai protocolli TLS 1.0/1.1 e fornire supporto completo ai clienti che vogliono avere i carichi di lavoro configurati per accettare e avviare solo connessioni TLS 1.2.

I clienti devono configurare i carichi di lavoro ospitati in Azure e le applicazioni locali che interagiscono con i servizi di Azure per usare TLS 1.2 per impostazione predefinita. Ecco come configurare nodi e applicazioni del cluster di Service Fabric per l'uso di una versione TLS specifica.

Windows Defender

Per impostazione predefinita, Windows Defender Antivirus è installato in Windows Server 2016. Per informazioni dettagliate, vedere Windows Defender Antivirus in Windows Server 2016. L'interfaccia utente viene installata per impostazione predefinita in alcuni SKU, ma non è obbligatoria. Per ridurre eventuali effetti sulle prestazioni e il sovraccarico di utilizzo delle risorse dovuti a Windows Defender e se i criteri di sicurezza consentono di escludere processi e i percorsi per il software open source, dichiarare le proprietà seguenti del modello di Resource Manager Estensioni set di scalabilità di macchine virtuali per escludere il cluster di Service Fabric dalle analisi:

 {
    "name": "[concat('VMIaaSAntimalware','_vmNodeType0Name')]",
    "properties": {
        "publisher": "Microsoft.Azure.Security",
        "type": "IaaSAntimalware",
        "typeHandlerVersion": "1.5",
        "settings": {
            "AntimalwareEnabled": "true",
            "Exclusions": {
                "Paths": "[concat(parameters('svcFabData'), ';', parameters('svcFabLogs'), ';', parameters('svcFabRuntime'))]",
                "Processes": "Fabric.exe;FabricHost.exe;FabricInstallerService.exe;FabricSetup.exe;FabricDeployer.exe;ImageBuilder.exe;FabricGateway.exe;FabricDCA.exe;FabricFAS.exe;FabricUOS.exe;FabricRM.exe;FileStoreService.exe;FabricBRS.exe;BackupCopier.exe"
            },
            "RealtimeProtectionEnabled": "true",
            "ScheduledScanSettings": {
                "isEnabled": "true",
                "scanType": "Quick",
                "day": "7",
                "time": "120"
            }
        },
        "protectedSettings": null
    }
}

Nota

Se non si usa Windows Defender, fare riferimento alla documentazione dell'antimalware in uso per informazioni sulle regole di configurazione. Windows Defender non è supportato in Linux.

Hosting di applicazioni non attendibili in un cluster di Service Fabric

Un cluster di Service Fabric è un singolo tenant per progettazione e le applicazioni ospitate vengono considerate attendibili. Alle applicazioni viene quindi concesso l'accesso al runtime di Service Fabric, che si manifesta in forme diverse, alcune delle quali: variabili di ambiente che puntano ai percorsi di file nell'host corrispondente ai file dell'applicazione e dell'infrastruttura, percorsi host montati con accesso in scrittura ai carichi di lavoro del contenitore, un endpoint di comunicazione tra processi che accetta richieste specifiche dell'applicazione e il certificato client che Fabric prevede l'uso dell'applicazione per l'autenticazione.

Se si sta valutando l'hosting di applicazioni non attendibili, è necessario eseguire passaggi aggiuntivi per definire e possedere l'esperienza multi-tenant ostile per il cluster di Service Fabric. Ciò richiederà di considerare più aspetti, nel contesto dello scenario, tra cui, a titolo esemplificativo, quanto segue:

  • Revisione approfondita della sicurezza delle interazioni delle applicazioni non attendibili con altre applicazioni, del cluster stesso e dell'infrastruttura di calcolo sottostante.
  • Uso della tecnologia di sandboxing più avanzata applicabile (ad esempio, modalità di isolamento appropriate per i carichi di lavoro dei contenitori).
  • La valutazione dei rischi delle applicazioni non attendibili che eseggono dalla tecnologia di sandboxing, poiché il limite di attendibilità e sicurezza successivo è il cluster stesso.
  • Rimozione dell'accesso delle applicazioni non attendibili al runtime di Service Fabric.

RemoveServiceFabricRuntimeAccess

L'accesso al runtime di Service Fabric può essere rimosso usando la dichiarazione seguente nella sezione Criteri del manifesto dell'applicazione:

<ServiceManifestImport>
    <Policies>
        <ServiceFabricRuntimeAccessPolicy RemoveServiceFabricRuntimeAccess="true"/>
    </Policies>
</ServiceManifestImport>

Passaggi successivi