Skip to Content
Nuova versione 12 disponibile 🎉
LicensingConformità FIPS

Conformità FIPS

Babel Licensing funziona sugli host Linux con FIPS abilitato e la sua convalida della licenza non si basa su alcun algoritmo vietato da FIPS. Questa pagina spiega come si comporta la libreria su questi host, quale problema di avvio puoi incontrare nei container e come risolverlo.

Contesto

Molti clienti distribuiscono su host il cui sistema operativo funziona in modalità FIPS: su Linux questa condizione è esposta come /proc/sys/crypto/fips_enabled = 1. In questa modalità il provider crittografico della piattaforma (OpenSSL su Linux) deve eseguire ogni operazione crittografica tramite un modulo FIPS certificato.

Un problema frequente si presenta quando un container eredita il flag FIPS dell’host ma la sua immagine di base non include un provider FIPS di OpenSSL certificato. OpenSSL 3 tenta allora di entrare in modalità FIPS, non riesce a caricare il modulo del provider FIPS e finisce in uno stato non funzionante in cui falliscono tutte le operazioni di digest e di cifratura, non solo quelle che FIPS normalmente vieterebbe. L’errore tipico è:

Interop+Crypto+OpenSslCryptographicException: error:03000086:digital envelope routines::initialization error

Si tratta di una condizione dell’ambiente, non di un difetto di Babel Licensing. È documentata indipendentemente da Babel: vedi dotnet/dotnet-docker#5849  e dotnet/runtime#87884 . Riguarda qualsiasi operazione crittografica .NET basata su OpenSSL nel processo, TLS compreso (HttpClient, gRPC), non solo la convalida della licenza.

Come può manifestarsi durante la convalida della licenza

Poiché l’intero strato OpenSSL è inutilizzabile, l’errore compare alla prima operazione crittografica eseguita all’avvio. Quando una licenza ha una data di scadenza, Babel Licensing apre un piccolo archivio locale che usa per tenere traccia della scadenza e per rilevare se l’orologio è stato portato indietro. Nelle versioni moderne di .NET l’inizializzazione dell’archivio calcola un hash di identità tramite il provider della piattaforma, che su un host con FIPS non funzionante genera un’eccezione. L’errore viene segnalato così:

Babel.Licensing.BabelLicenseException: Internal error ---> ...OpenSslCryptographicException: error:03000086:...

Rafforzamento (Babel Licensing 11.7.x e versioni successive). L’archivio delle licenze è stato rielaborato in modo che uno stack crittografico della piattaforma non funzionante non comprometta più la convalida della licenza: l’archivio ripiega in modo trasparente su un’implementazione interamente gestita e la convalida della licenza prosegue in forma ridotta anziché fallire. Sugli host che funzionano correttamente il comportamento non cambia. Sulle build precedenti, applica la correzione dell’ambiente descritta di seguito.

Risolvere il problema nei container

Rendi OpenSSL utilizzabile all’interno del container. Entrambe le opzioni risolvono il sintomo della convalida della licenza e ogni altra operazione del tuo processo basata su OpenSSL.

Opzione 1: non entrare automaticamente in modalità FIPS nel container

Nelle immagini .NET basate su Ubuntu, OpenSSL rispetta la variabile d’ambiente OPENSSL_FORCE_FIPS_MODE. Impostala a 0, così OpenSSL non tenta di entrare in modalità FIPS con un provider che l’immagine non include.

In docker-compose.yml, aggiungila all’ambiente del servizio licensing:

environment: # Do not auto-enter FIPS mode using a provider the image doesn't ship OPENSSL_FORCE_FIPS_MODE: 0

oppure in un Dockerfile:

ENV OPENSSL_FORCE_FIPS_MODE=0

Usa questa opzione quando il container in sé non deve essere validato FIPS: l’host resta con FIPS abilitato e solo l’OpenSSL di questo container rinuncia all’attivazione automatica di FIPS, che non funziona.

Opzione 2: usa un’immagine di base con un provider FIPS certificato

Se la conformità FIPS è richiesta all’interno del container, usa un’immagine di base che include un provider FIPS validato, così lo strato crittografico si inizializza correttamente anziché fallire:

  • Immagini .NET Azure Linux 3.0 (mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0 e simili), che includono il provider SymCrypt di Microsoft, certificato FIPS,
  • immagini .NET basate su Red Hat UBI 9 (registry.access.redhat.com/ubi9/dotnet-90 e simili), oppure
  • Ubuntu Pro con i pacchetti OpenSSL certificati FIPS.

Babel Licensing Service sugli host FIPS

Il Babel Licensing Service funziona sugli host con FIPS abilitato purché l’immagine includa effettivamente un modulo del provider FIPS. L’intero flusso di lavoro delle licenze è stato verificato su Azure Linux 3.0, le cui immagini .NET includono il provider SymCrypt di Microsoft, certificato FIPS, con la modalità FIPS imposta:

  • il servizio si avvia e convalida la propria licenza,
  • vengono creati i modelli di licenza e le licenze firmate con RSA,
  • i client attivano e convalidano le licenze tramite gRPC,
  • il vincolo al computer, i token di attivazione, gli heartbeat e la disattivazione funzionano tutti.

Che cosa succede quando manca il modulo FIPS

La distinzione che conta non è “FIPS attivo o non attivo”, ma se il modulo del provider richiesto dalla modalità FIPS è presente.

OpenSSL 3 non implementa direttamente gli algoritmi: li carica da provider installati come moduli. In modalità FIPS la configurazione richiede che ogni algoritmo provenga dal provider FIPS certificato (il modulo fips.so). Se quel modulo non è installato nell’immagine, come accade per le immagini .NET standard Debian/Ubuntu, OpenSSL non può soddisfare alcuna richiesta, quindi falliscono tutti gli algoritmi, compresi quelli che FIPS stesso consente.

Poiché .NET su Linux delega a OpenSSL tutte le operazioni crittografiche, a smettere di funzionare non sono solo gli hash e i cifrari:

Operazione .NETRisultato quando manca fips.so
SHA256 / SHA1error:03000086 ...initialization error
Aeserror:0308010C ...unsupported
RandomNumberGeneratorerror:12000090 ...unable to fetch drbg

Poiché fallisce anche la generazione dei numeri casuali, su un host di questo tipo un’applicazione ASP.NET Core non può avviarsi affatto: durante l’avvio ha bisogno di valori casuali (chiavi di protezione dei dati, TLS). Il problema riguarda ogni applicazione ASP.NET Core, non solo il Babel Licensing Service, ed è un errore di configurazione dell’ambiente: si pretende FIPS da un’immagine che non può fornirlo. Risolvilo con l’opzione 1 o l’opzione 2 descritte sopra.

Verificare l’ambiente

Un controllo rapido dall’interno del container ti dice se OpenSSL funziona correttamente:

# Fails on a broken-FIPS host, succeeds once fixed echo test | openssl dgst -sha1
  • Errore error:03000086 (o un messaggio che segnala che fips.so non può essere caricato): OpenSSL è nello stato non funzionante; applica l’opzione 1 o 2.
  • Una normale riga SHA1(stdin)= ...: OpenSSL funziona correttamente e Babel Licensing viene eseguito normalmente.

Anche con il rafforzamento della convalida della licenza, ti consigliamo di correggere comunque l’ambiente OpenSSL: in caso contrario le altre operazioni del tuo processo basate su OpenSSL (in particolare TLS verso il Babel Licensing Service) continueranno a fallire.

Last updated on