Verschlüsselungsanpassung für Azure Blob Storage-Zuordnungen
In diesem Abschnitt wird beschrieben, wie Sie die Verschlüsselung anpassen, um Inhalt in einem verschlüsselten Format in Azure Blob Storage zu speichern. Standardmäßig wird der in Azure Blob Storage gespeicherte Inhalt mit dem Verschlüsselungstyp serverSideEncryption verschlüsselt. Der in dateisystembasierten Depots gespeicherte Inhalt liegt im einfachen Textformat vor.
Windchill unterstützt die folgenden Verschlüsselungstypen:
1. Serverseitig – Es stehen zwei Optionen zur Auswahl:
a. Von Azure verwalteter Schlüssel – Dies ist der standardmäßige Verschlüsselungstyp, der automatisch vom Azure-System festgelegt wird.
b. Vom Azure-Schlüsseldepot verwalteter Schlüssel – Sie können den Schlüsseldepotschlüssel für einen Container über das Azure-Portal festlegen.
2. Client-seitig – Es stehen zwei Optionen zur Auswahl:
a. clientSideEncryption-keyvault – Dieser Verschlüsselungstyp verwendet vom Azure-Schlüsseldepot verwaltete Schlüssel.
b. clientSideEncryption – Dieser Verschlüsselungstyp verwendet vom Kunden verwaltete Schlüssel.
Die Details der Delegate-Implementierungen für die client-seitige Verschlüsselung werden im Abschnitt "Delegate-Implementierungen für die client-seitige Verschlüsselung schreiben" bereitgestellt.
|
Der Benutzer ist für die Verwaltung der Verschlüsselungsoptionen verantwortlich. Sie müssen sicherstellen, dass der Inhalt im Falle von Änderungen an den Verschlüsselungsoptionen zugänglich ist.
|
Delegate-Implementierungen für die client-seitige Verschlüsselung schreiben
Um die Verschlüsselung von Inhalt in Azure Blob Storage anzupassen, schreiben Sie Delegate-Implementierungen wie folgt:
1. Delegate für Blob-Verschlüsselungskonfigurator – Der Standard-Delegate ist
com.ptc.windchill.objectstorage.azureblob.encryption.DefaultBlobEncryptConfigurator. Der Default-Delegate gibt den Verschlüsselungstyp als
serverSideEncryption zurück. Wenn Sie einen anderen Verschlüsselungstyp verwenden möchten, erstellen Sie einen Delegate, der den erwarteten Verschlüsselungstyp zurückgibt, stellen Sie die Klassendateien bereit, und konfigurieren Sie mit dem Befehlszeilen-Tool. Weitere Details zur Konfiguration finden Sie unter
Windchill Dateidepots für die Verwendung von Azure Blobs konfigurieren.
Nachstehend finden Sie einen Beispiel-Delegate.
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;
}
}
}
Je nach Zuordnungspfad (Blob-Name) gibt der SampleBlobEncryptConfiguratorserverSideEncryption, clientSideEncryption oder clientSideEncryption-keyvault als Verschlüsselungstyp zurück. Der in Azure Blob Storage gespeicherte Inhalt wird mit diesen Verschlüsselungstypen verschlüsselt. Die API getBlobEncryptionType empfängt Speicherkontoname, Containername und Blob-Name als Argument. Sie können den Verschlüsselungstyp mithilfe von Speicherkontoname, Containername und Blob-Name programmieren. Beispiel: Geben Sie für Container c1 als Verschlüsselungstyp serverSideEncryption und für Container c2 als Verschlüsselungstyp clientSideEncryption-keyvault zurück.
Gültige Werte für den Verschlüsselungstyp sind:
a. serverSideEncryption – Der Inhalt wird unter Verwendung serverseitiger Verschlüsselung mit von Azure verwalteten Schlüsseln gespeichert.
b. clientSideEncryption-keyvault – Der Inhalt wird unter Verwendung clientseitiger Verschlüsselung mit Schlüsseln gespeichert, die vom Azure-Schlüsseldepot verwaltet werden.
c. clientSideEncryption – Der Inhalt wird unter Verwendung clientseitiger Verschlüsselung mit vom Kunden bereitgestellten Schlüsseln gespeichert.
2. CSEKeyVaultKeyProvider Delegate – Dieser Delegate ist anwendbar, wenn für den Verschlüsselungstyp
clientSideEncryption-keyvault konfiguriert ist. Für diesen Delegate gibt es keine standardmäßige Implementierung. Sie müssen einen Delegate erstellen, der die erwarteten Verbindungsparameter für das Azure-Schlüsseldepot zurückgibt, die Klassendateien bereitstellen und mithilfe des Befehlszeilentools konfigurieren. Weitere Details zur Konfiguration finden Sie unter
Windchill Dateidepots für die Verwendung von Azure Blobs konfigurieren.
|
Verwenden Sie die folgenden Beispielimplementierungen nicht in einer Produktionsumgebung.
|
Nachstehend finden Sie einen Beispiel-Delegate:
SampleCSEKeyVaultKeyProvider.java: Diese Beispielimplementierung zeigt, wie Sie die Verbindungsparameter für das Azure-Schlüsseldepot zurückgeben können. Weitere Details zur Schlüsseldepot- und Anwendungsregistrierung finden Sie im Abschnitt "Schlüsseldepot-Verschlüsselung in Azure Blob festlegen" unter
Windchill Dateidepots für die Verwendung von Azure Blobs konfigurieren.
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 – Wenn Sie
clientSideEncryption als Verschlüsselungstyp konfigurieren, müssen Sie die Implementierung für diesen Delegate erstellen und den Delegate konfigurieren. Dieser Delegate ist nur anwendbar, wenn der Verschlüsselungstyp als
clientSideEncryption konfiguriert ist. Für diesen Delegate gibt es keine standardmäßige Implementierung. Erstellen Sie einen Delegate, der
KeyPair und
KeyId verwaltet, stellen Sie die Klassendateien bereit, und konfigurieren Sie sie mithilfe dieses Befehlszeilentools. Weitere Details zur Konfiguration finden Sie unter
Windchill Dateidepots für die Verwendung von Azure Blobs konfigurieren.
Nachstehend finden Sie einen Beispiel-Delegate:
SampleCSESecKeyGenerator.java: Dies ist eine Beispielimplementierung, die zeigt, wie KeyPair und KeyId generiert werden. Diese Beispielimplementierung sucht nach einem vorhandenen KeyPair. Wenn KeyPair gefunden wird, wird es zurückgegeben. Andernfalls wird ein neues KeyPair generiert, in einer Datei auf einem Datenträger gespeichert und zurückgegeben. Sie können die Strategie zum sicheren Speichern des KeyPair wählen. Diese Beispielimplementierung verwendet außerdem ein einzelnes KeyPair für alle Dateien im Depot. Sie können Ihren eigenen Algorithmus schreiben, um mehrere KeyPairs für Container oder für Blobs zu verwalten, die in Azure gespeichert sind.
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;
}
}
Verschlüsselungstypen verwalten
Wenn Sie den Verschlüsselungstyp für ein Dateidepot ändern möchten, führen Sie die folgenden Schritte aus:
1. Erstellen Sie ein neues Depot, und konfigurieren Sie es mithilfe der Delegate-Implementierung auf den gewünschten Verschlüsselungstyp. Weitere Informationen finden Sie im Abschnitt "Delegate-Implementierungen für die client-seitige Verschlüsselung schreiben".
2. Aktualisieren Sie die Depotregel, um den Inhalt an das neue Depot weiterzuleiten.
3. Führen Sie den Revaulting-Zeitplan aus.