Personalizzazione della crittografia per i mount di Archiviazione BLOB di Azure
Questa sezione descrive la personalizzazione della crittografia per l'archiviazione del contenuto in un formato crittografato su Archiviazione BLOB di Azure. A livello predefinito, il contenuto archiviato in Archiviazione BLOB di Azure viene crittografato utilizzando il tipo di crittografia serverSideEncryption. Il contenuto memorizzato in archivi basati sul file system è in formato normale.
Windchill supporta i seguenti tipi di crittografia:
1. Lato server - Sono disponibili due opzioni tra cui scegliere:
a. Chiave gestita di Azure - Questo è il tipo di crittografia di default e viene impostato automaticamente dal sistema Azure.
b. Chiave gestita di Azure Key Vault - È possibile impostare la chiave di Key Vault per un container dal portale di Azure.
2. Lato client - Sono disponibili due opzioni tra cui scegliere:
a. clientSideEncryption-keyvault - Questo tipo di crittografia utilizza le chiavi gestite di Azure Key Vault.
b. clientSideEncryption - Questo tipo di crittografia utilizza le chiavi gestite del cliente.
I dettagli delle implementazioni del delegato per la crittografia lato client sono forniti nella sezione "Scrittura delle implementazioni del delegato per la crittografia lato client".
|
L'utente è responsabile della gestione delle opzioni di crittografia. È necessario verificare che il contenuto sia accessibile in caso di modifiche alle opzioni di crittografia.
|
Scrittura delle implementazioni del delegato per la crittografia lato client
Per personalizzare la crittografia del contenuto su Archiviazione BLOB di Azure, scrivere implementazioni del delegato come descritto di seguito.
1. Delegato del configuratore di crittografia BLOB - Il delegato di default è
com.ptc.windchill.objectstorage.azureblob.encryption.DefaultBlobEncryptConfigurator. Il delegato di default restituisce il tipo di crittografia come
serverSideEncryption. Se si intende utilizzare un altro tipo di crittografia, scrivere un delegato che restituisca il tipo di crittografia previsto, distribuire i file di classe ed eseguire la configurazione utilizzando lo strumento da riga di comando. Per maggiori dettagli sulla configurazione, vedere
Configurazione degli archivi file di Windchill per l'utilizzo dei BLOB di Azure.
Di seguito è riportato un delegato di esempio.
SampleBlobEncryptConfigurator.java:
package com.abc.windchill.objectstorage.azureblob.encryption;
import com.ptc.windchill.objectstorage.azureblob.exception.BlobException;
public class SampleBlobEncryptConfigurator implements BlobEncryptConfigurator {
private static final String CSE_KEYVAULT_FOLDER = "keyvault";
private static final String CSE_FOLDER = "cse";
@Override
public String getBlobEncryptionType(String storageAccountName, String containerName, String blobName) throws BlobException {
if (blobName != null && blobName.contains(CSE_KEYVAULT_FOLDER)) {
return BlobEncryptionType.CSE_KEYVAULT;
} else if (blobName != null && blobName.contains(CSE_FOLDER)) {
return BlobEncryptionType.CSE;
} else {
return BlobEncryptionType.SSE;
}
}
}
A seconda del percorso mount (nome del BLOB), SampleBlobEncryptConfigurator restituisce serverSideEncryption, clientSideEncryption o clientSideEncryption-keyvault come tipo di crittografia. Il contenuto archiviato in Archiviazione BLOB di Azure viene crittografato utilizzando questi tipi di crittografia. L'API getBlobEncryptionType riceve il nome dell'account di archiviazione, il nome del contenitore e il nome del BLOB come argomento. È possibile programmare il tipo di crittografia utilizzando il nome dell'account di archiviazione, il nome del contenitore e il nome del BLOB. Ad esempio, per il contenitore c1 viene restituito il tipo di crittografia serverSideEncryption, mentre per il contenitore c2 viene restituito il tipo di crittografia clientSideEncryption-keyvault.
Di seguito sono riportati i valori validi per il tipo di crittografia.
a. serverSideEncryption - Il contenuto viene archiviato utilizzando la crittografia sul lato server con le chiavi gestite di Azure.
b. clientSideEncryption-keyvault - Il contenuto viene archiviato utilizzando la crittografia sul lato client con le chiavi gestite di Azure Key Vault.
c. clientSideEncryption - Il contenuto viene archiviato utilizzando la crittografia sul lato client con le chiavi fornite dal cliente.
2. CSEKeyVaultKeyProvider Delegate - Questo delegato è applicabile se il tipo di crittografia è configurato come
clientSideEncryption-keyvault. Per questo delegato non esiste alcuna implementazione predefinita di default. È necessario scrivere un delegato che restituisca i parametri di connessione di Azure Key Vault previsti, distribuire i file di classe ed eseguire la configurazione utilizzando lo strumento da riga di comando. Per maggiori dettagli sulla configurazione, vedere
Configurazione degli archivi file di Windchill per l'utilizzo dei BLOB di Azure.
|
Non utilizzare le seguenti implementazioni di esempio così come sono in un ambiente di produzione.
|
Di seguito è riportato un delegato di esempio.
SampleCSEKeyVaultKeyProvider.java - In questa implementazione di esempio viene illustrato come restituire i parametri di connessione di Azure Key Vault. Per maggiori dettagli su Azure Key Vault e sulla registrazione dell'applicazione, vedere la sezione "Configurazione della crittografia dell'insieme di credenziali delle chiavi nei BLOB di Azure" in
Configurazione degli archivi file di Windchill per l'utilizzo dei BLOB di Azure.
package com.abc.windchill.objectstorage.azureblob.encryption.csekeyvault;
import com.ptc.windchill.objectstorage.azureblob.encryption.csekeyvault.CSEKeyVaultKeyProvider;
import com.ptc.windchill.objectstorage.azureblob.encryption.csekeyvault.KeyVaultConnectionParams;
import com.ptc.windchill.objectstorage.azureblob.exception.BlobException;
/**
* Sample implementation of CSEKeyVaultKeyProvider.
*/
public class SampleCSEKeyVaultKeyProvider implements CSEKeyVaultKeyProvider {
@Override
public KeyVaultConnectionParams getKeyVaultConnectionDetails(String containerName, String blobName)
throws BlobException {
String keyVaultKeyIdUrl = "https://mykeyvault.vault.azure.net/keys/MyKeyVaultKey";
String appId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
String appAuthKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
KeyVaultConnectionParams connectionParams = new KeyVaultConnectionParams(keyVaultKeyIdUrl, appId,
appAuthKey);
return connectionParams;
}
}
3. CSESecKeyGenerator Delegate - Se si configura il tipo di crittografia come
clientSideEncryption, è necessario scrivere l'implementazione per questo delegato e configurarlo. Questo delegato è applicabile solo se il tipo di crittografia è configurato come
clientSideEncryption. Per questo delegato non esiste alcuna implementazione predefinita di default. Scrivere un delegato che gestisca
KeyPair e
KeyId, distribuire i file di classe ed eseguire la configurazione utilizzando lo strumento da riga di comando. Per maggiori dettagli sulla configurazione, vedere
Configurazione degli archivi file di Windchill per l'utilizzo dei BLOB di Azure.
Di seguito è riportato un delegato di esempio.
SampleCSESecKeyGenerator.java - Si tratta di un'implementazione di esempio che illustra come generare KeyPair e KeyId. L'implementazione di esempio cerca un elemento KeyPair esistente. Se lo trova, viene restituito KeyPair. In caso contrario, genera un nuovo elemento KeyPair, lo archivia in un file sul disco e lo restituisce. È possibile scegliere la strategia per archiviare KeyPair in modo sicuro. L'implementazione di esempio utilizza inoltre un singolo elemento KeyPair per tutti i file presenti nell'archivio. È possibile scrivere il proprio algoritmo per gestire più elementi KeyPair per i contenitori o i BLOB archiviati in Azure.
package com.abc.windchill.objectstorage.azureblob.encryption.cse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import com.ptc.windchill.objectstorage.azureblob.encryption.cse.CSESecKeyGenerator;
import com.ptc.windchill.objectstorage.azureblob.exception.BlobException;
import wt.util.WTException;
import wt.util.WTProperties;
import wt.wrmf.delivery.ObjectIS;
import wt.wrmf.delivery.PayloadShippingItem;
import wt.wrmf.delivery.ShippingHelper;
/**
* Sample implementation of CSESecKeyGenerator.
*/
public class SampleCSESecKeyGenerator implements CSESecKeyGenerator {
private File keyPairFile;
public static String keyPairFileName;
static {
try {
WTProperties props = WTProperties.getLocalProperties();
String windchillHome = props.getProperty("wt.home");
keyPairFileName = windchillHome + File.separator + "RsaKey";
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Override
public KeyPair getKeyPair(String storageAccountName, String containerName, String blobName) throws BlobException {
try{
KeyPair wrapKey = getKeyPairFromFileStore();
if(wrapKey == null){
// Create the IKey used for encryption.
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
wrapKey = keyGen.generateKeyPair();
storeKeyPairInFileStore(containerName, blobName, wrapKey);
storeKeyPairInFileStoreOnReplica(containerName, blobName, wrapKey);
}
return wrapKey;
}
catch(Exception e){
throw new BlobException(e);
}
}
@Override
public String getKeyId(String storageAccountName, String containerName, String blobName) throws BlobException {
return containerName;//using container name as key id
}
private KeyPair getKeyPairFromFileStore()throws IOException, ClassNotFoundException{
KeyPair keyPair = null;
File keyPairFile = getKeyPairFile();
try(
FileInputStream fis = new FileInputStream(keyPairFile);
ObjectInputStream ois = new ObjectInputStream(fis);){
keyPair = (KeyPair)ois.readObject();
}catch (IOException ignore){
ignore.printStackTrace();
}
return keyPair;
}
public synchronized void storeKeyPairInFileStore(String containerName, String blobName, KeyPair keyPair)throws IOException{
File keyPairFile = getKeyPairFile();
try(FileOutputStream fos = new FileOutputStream(keyPairFile, true);
ObjectOutputStream oos = new ObjectOutputStream(fos);){
oos.writeObject(keyPair);
oos.flush();
}
}
private synchronized void storeKeyPairInFileStoreOnReplica(String containerName, String blobName, KeyPair keyPair)
throws Exception {
//this is a private method that invokes method call on replica site
invokeMethodOnReplica(getReplicaSite(),
SampleCSESecKeyGenerator.class.getName(), "setKeyPairOnReplica",
new String[] { String.class.getName(), String.class.getName(), KeyPair.class.getName() },
new Serializable[] { containerName, blobName, keyPair });
}
private synchronized File getKeyPairFile() throws IOException {
if (keyPairFile == null) {
keyPairFile = new File(keyPairFileName);
if (!keyPairFile.exists()) {
keyPairFile.createNewFile();
}
}
return keyPairFile;
}
@Override
public boolean removeKeyPair(String storageAccountName, String containerName, String blobName) {
return true;//do not remove the KeyPair, since sample code uses single KeyPair for all files in vault.
}
public static PayloadShippingItem setKeyPairOnReplica(String storageAccountName,
String containerName, String blobName, KeyPair keyPair) throws WTException {
PayloadShippingItem psi = ShippingHelper.service.createPayloadShippingItem();
try {
File keyPairFile = new File(keyPairFileName);
if (!keyPairFile.exists()) {
keyPairFile.createNewFile();
}
try (FileOutputStream fos = new FileOutputStream(keyPairFile, false);
ObjectOutputStream oos = new ObjectOutputStream(fos);) {
oos.writeObject(keyPair);
oos.flush();
}
Object[] valuesToReturn = new Object[] {};
ObjectIS retValsIS = new ObjectIS(valuesToReturn);
psi.setPayload(retValsIS);
} catch (Exception e) {
throw new WTException(e);
}
return psi;
}
}
Gestione del tipo di crittografia
Se si desidera modificare il tipo di crittografia per un archivio file, attenersi alla procedura descritta di seguito.
1. Creare un nuovo archivio e configurarlo in base al tipo di crittografia desiderato utilizzando l'implementazione del delegato. Per ulteriori dettagli, fare riferimento alla sezione "Scrittura delle implementazioni del delegato per la crittografia lato client".
2. Aggiornare la regola di archiviazione per indirizzare il contenuto al nuovo archivio.
3. Eseguire la programmazione di archiviazione temporizzata.