1. Genel Bakış
Başlamadan önce, tamamen gerekli olmasa da aşağıdaki özellikler ve kavramlar hakkında bilgi sahibi olmanız bu codelab'de işinize yarayacaktır.
- Cloud Storage, özellikle paketler
- Compute Engine, özellikle Gizli Sanal Makine
- Hizmet hesapları
- Kapsayıcılar ve uzak depolar
- İş yükü kimliği federasyonu ve özellik koşulları
Neler öğreneceksiniz?
Bu laboratuvarda, Gizli Alan'ı kullanarak MPC uyumlu blok zinciri imzalama işlemi gerçekleştirmek için bir referans uygulama sağlanmaktadır. Kavramları açıklamak için Primus şirketinin Secundus şirketine dijital öğeler aktarmak istediği bir senaryoyu ele alacağız. Bu senaryoda Primus şirketi, MPC uyumlu bir model kullanır. Bu, ayrı ayrı özel anahtarlar yerine dağıtılmış anahtar paylaşımları kullandıkları anlamına gelir. Bu anahtar paylaşımları birden fazla tarafça (bu örnekte Ayşe ve Ali) tutulur. Bu yaklaşım, Primus şirketine basitleştirilmiş kullanıcı deneyimi, operasyonel verimlilik ve özel anahtarları üzerinde kontrol gibi çeşitli avantajlar sağlar.
Bu sürecin temel yönlerini açıklamak için teknik kurulumu ayrıntılı olarak anlatacak ve Primus şirketinden Secundus şirketine dijital öğe aktarımını başlatan onay ve imzalama sürecinde size yol göstereceğiz. Primus şirketinin çalışanları olan Ali ve Ayşe'nin işlemi onaylamasının gerektiğini unutmayın.
Bu referans uygulamada imza işlemleri gösterilse de MPC anahtar yönetiminin tüm yönleri ele alınmamıştır. Örneğin, anahtar oluşturma hakkında bilgi vermiyoruz. Ayrıca, ortak imzalar oluşturmak için Google Cloud dışı hizmetlerin kullanılması veya ortak imzalayanların kendi ortamlarında blockchain imzaları oluşturması gibi alternatif ve tamamlayıcı yaklaşımlar da vardır. Bu yaklaşımlar daha merkezi olmayan bir mimaridir. Bu laboratuvarın, Google Cloud'da MPC'ye yönelik farklı yaklaşımlara ilham vermesini umuyoruz.
Gizli Alan'da, ortak imzalayan anahtar materyallerini kullanarak bir Ethereum işlemini imzalayan basit bir iş yükü ile çalışırsınız. Ethereum işlem imzalama, kullanıcının Ethereum blok zincirindeki bir işleme yetki verebileceği bir işlemdir. Ethereum işlemi göndermek için işlemi özel anahtarınızla imzalamanız gerekir. Bu işlem, hesabın sahibi olduğunuzu kanıtlar ve işlemi yetkilendirir. İmzalama süreci şu şekildedir:
- Gönderen, alıcı adresini, gönderilecek ETH miktarını ve diğer ilgili verileri belirten bir işlem nesnesi oluşturur.
- Gönderenin özel anahtarı, işlem verilerini karma oluşturmak için kullanılır.
- Ardından karma, özel anahtarla imzalanır.
- İmza, işlem nesnesine eklenir.
- İşlem, Ethereum ağına yayınlanır.
Ağdaki bir düğüm bir işlem aldığında, hesabın sahibi tarafından imzalandığından emin olmak için imzayı doğrular. İmza geçerliyse düğüm, işlemi blok zincirine ekler.
Başlamak için gerekli Cloud kaynaklarını yapılandırmanız gerekir. Ardından, iş yükünü Gizli Alan'da çalıştırırsınız. Bu kod laboratuvarı, aşağıdaki üst düzey adımlarda size rehberlik edecektir:
- Gizli Alan'ı çalıştırmak için gerekli Cloud kaynaklarını yapılandırma
- Aşağıdaki özelliklerine göre korunan kaynaklara erişim yetkisi verme:
- Nedir?: iş yükü kapsayıcısı
- Nerede: Gizli Alan ortamı (Gizli Sanal Makine'deki Gizli Alan görüntüsü)
- Kim: iş yükünü çalıştıran hesap
- İş yükünü, Gizli Alan sanal makinesi görüntüsünü çalıştıran bir Gizli Sanal Makine'de çalıştırma
Gerekli API'ler
Bu kılavuzu tamamlayabilmek için belirtilen projelerde aşağıdaki API'leri etkinleştirmeniz gerekir.
API adı | API başlığı |
cloudkms.googleapis.com | Cloud KMS |
compute.googleapis.com | Compute Engine |
confidentialcomputing.googleapis.com | Gizli Bilişim |
iamcredentials.googleapis.com | IAM ile yönetin. |
artifactregistry.googleapis.com | Artifact Registry |
2. Cloud Kaynakları Oluşturma
Başlamadan önce
- Bu kod laboratuvarının bir parçası olarak kullanılan gerekli komut dosyalarını almak için aşağıdaki komutu kullanarak bu deposu klonlayın.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Bu kod laboratuvarının dizinini değiştirin.
cd confidential-space/codelabs/digital_asset_transaction_codelab/scripts
- Gerekli proje ortam değişkenlerini aşağıda gösterildiği gibi ayarladığınızdan emin olun. GCP projesi oluşturma hakkında daha fazla bilgi için lütfen bu kod laboratuvarını inceleyin. Proje kimliğinin nasıl alınacağı ve proje adından ve proje numarasından nasıl farklı olduğu hakkında ayrıntılı bilgi edinmek için bu makaleyi inceleyebilirsiniz. .
export PRIMUS_PROJECT_ID=<GCP project id>
- Projeleriniz için Faturalandırmayı etkinleştirin.
- Confidential Computing API'yi ve aşağıdaki API'leri her iki proje için de etkinleştirin.
gcloud services enable \
cloudapis.googleapis.com \
cloudkms.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- Kaynak adları için değişkenleri ayarlamak üzere aşağıdaki komutu kullanabilirsiniz. Bu işlemin, A şirketi için GCP projenize özgü kaynak adlarını (ör.
export PRIMUS_INPUT_STORAGE_BUCKET='primus-input-bucket'
) geçersiz kılacağını unutmayın. - A Şirketi'ndeki GCP projeniz için aşağıdaki değişkenler ayarlanabilir:
$PRIMUS_INPUT_STORAGE_BUCKET | Şifrelenmiş anahtarları depolayan paket. |
$PRIMUS_RESULT_STORAGE_BUCKET | MPC işlem sonucunu depolayan paket. |
$PRIMUS_KEY | Primus Bank için $PRIMUS_INPUT_STORAGE_BUCKET adlı pakette depolanan verileri şifrelemek için kullanılan KMS anahtarı. |
$PRIMUS_KEYRING | Primus Bank için $PRIMUS_KEY şifreleme anahtarını oluşturmak üzere kullanılacak KMS anahtar zinciri. |
$PRIMUS_WIP_PROVIDER | MPC iş yükü hizmeti tarafından imzalanan jetonlar için kullanılacak özellik koşulunu içeren Workload Identity Pool sağlayıcısı. |
$PRIMUS_SERVICEACCOUNT | $PRIMUS_WORKLOAD_IDENTITY_POOL'un, korunan kaynaklara erişmek için kullandığı hizmet hesabı. Bu hizmet hesabı, $PRIMUS_INPUT_STORAGE_BUCKET havuzunda depolanan şifrelenmiş anahtarları görüntüleme iznine sahip olur. |
$PRIMUS_ARTIFACT_REPOSITORY | İş yükü kapsayıcı görüntüsünü depolamak için yapı deposu. |
$WORKLOAD_SERVICEACCOUNT | İş yükünü çalıştıran Gizli Sanal Makine'ye erişme izni olan hizmet hesabı. |
$WORKLOAD_CONTAINER | İş yükünü çalıştıran Docker kapsayıcısı. |
$WORKLOAD_IMAGE_NAME | İş yükü kapsayıcı resminin adı. |
$WORKLOAD_IMAGE_TAG | İş yükü kapsayıcı resminin etiketi. |
- Kalan değişken adlarını, kaynak adları için proje kimliğinize göre değerlere ayarlamak üzere aşağıdaki komut dosyasını çalıştırın.
source config_env.sh
Cloud kaynaklarını ayarlama
Bu adımda, çok taraflı hesaplama için gereken bulut kaynaklarını ayarlarsınız. Bu laboratuvarda aşağıdaki özel anahtarı kullanacaksınız: 0000000000000000000000000000000000000000000000000000000000000001
Üretim ortamında kendi özel anahtarınızı oluşturursunuz. Ancak bu laboratuvar için bu özel anahtarı iki paya ayırıp her birini şifreleriz. Anahtarlar, üretim senaryosundaki düz metin dosyalarında hiçbir zaman depolanmamalıdır. Bunun yerine, özel anahtar Google Cloud dışında oluşturulabilir (veya tamamen atlanıp özel MPC anahtar parçası oluşturma işlemiyle değiştirilebilir) ve ardından özel anahtara veya anahtar paylaşımlarına kimsenin erişememesi için şifrelenir. Bu laboratuvarda Gcloud KSA'yı kullanacağız.
Gerekli bulut kaynaklarını ayarlamak için aşağıdaki komut dosyasını çalıştırın. Bu adımlar kapsamında aşağıdaki kaynaklar oluşturulur:
- Şifrelenmiş özel anahtar paylaşımlarını depolamak için bir Cloud Storage paketi (
$PRIMUS_INPUT_STORAGE_BUCKET
). - Dijital öğe işleminin sonucunu depolamak için bir Cloud Storage paketi (
$PRIMUS_RESULT_STORAGE_BUCKET
). - Özel anahtar paylaşımlarını şifrelemek için KMS'de bir şifreleme anahtarı (
$PRIMUS_KEY
) ve anahtar zinciri ($PRIMUS_KEYRING
). - Sağlayıcısı altında yapılandırılan özellik koşullarına göre hak taleplerini doğrulamak için bir Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - Aşağıdaki IAM erişimine sahip, yukarıda belirtilen iş yükü kimlik havuzuna (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) bağlı bir hizmet hesabı ($PRIMUS_SERVICEACCOUNT
): roles/cloudkms.cryptoKeyDecrypter
kullanarak verilerin şifresini çözebilirsiniz.objectViewer
kullanarak Cloud Storage paketinden veri okuyabilirsiniz.roles/iam.workloadIdentityUser
bu hizmet hesabını Workload Identity havuzuna bağlamak için.
./setup_resources.sh
3. İş Yükü Oluşturma
İş yükü hizmet hesabı oluşturma
Artık iş yükü için gerekli rollere ve izinlere sahip bir hizmet hesabı oluşturacaksınız. Bunu yapmak için A Şirketi için bir iş yükü hizmet hesabı oluşturacak aşağıdaki komut dosyasını çalıştırın. Bu hizmet hesabı, iş yükünü çalıştıran sanal makine tarafından kullanılır.
İş yükü hizmet hesabı ($WORKLOAD_SERVICEACCOUNT
) aşağıdaki rollere sahip olur:
confidentialcomputing.workloadUser
onay jetonu almak içinlogging.logWriter
kullanarak Cloud Logging'e günlük yazabilirsiniz.$PRIMUS_INPUT_STORAGE_BUCKET
Cloud Storage paketinden veri okumak içinobjectViewer
objectUser
işlevini kullanarak iş yükü sonucunu$PRIMUS_RESULT_STORAGE_BUCKET
Cloud Storage paketine yazın.
./create_workload_service_account.sh
İş yükü oluşturma
Bu adımda, iş yükü Docker görüntüsü oluşturulur. Bu kod laboratuvarındaki iş yükü, şifrelenmiş özel anahtar paylaşımlarını kullanarak öğe aktarmak için dijital işlemleri imzalayan basit bir Node.js MPC uygulamasıdır. İş yükü proje kodu burada verilmiştir. İş yükü projesi aşağıdaki dosyaları içerir.
package.json: Bu dosya, iş yükü MPC uygulaması için kullanılması gereken paketlerin listesini içerir. Bu örnekte @google-cloud/kms, @google-cloud/storage, ethers ve fast-crc32c kitaplıklarını kullanıyoruz. Bu codelab için kullanacağımız package.json dosyasını burada bulabilirsiniz.
index.js: Bu, iş yükü uygulamasının giriş noktasıdır ve iş yükü kapsayıcısı başlatıldığında hangi komutların çalıştırılması gerektiğini belirtir. Ayrıca, normalde kullanıcılardan imza isteyen güvenilmeyen bir uygulama tarafından sağlanacak imzasız bir örnek işlem de ekledik. Bu index.js dosyası, daha sonra oluşturacağımız mpc.js dosyasından işlevleri de içe aktarır. index.js dosyasının içeriği aşağıda verilmiştir. Bu içeriği burada da bulabilirsiniz.
import {signTransaction, submitTransaction, uploadFromMemory} from './mpc.js';
const signAndSubmitTransaction = async () => {
try {
// Create the unsigned transaction object
const unsignedTransaction = {
nonce: 0,
gasLimit: 21000,
gasPrice: '0x09184e72a000',
to: '0x0000000000000000000000000000000000000000',
value: '0x00',
data: '0x',
};
// Sign the transaction
const signedTransaction = await signTransaction(unsignedTransaction);
// Submit the transaction to Ganache
const transaction = await submitTransaction(signedTransaction);
// Write the transaction receipt
uploadFromMemory(transaction);
return transaction;
} catch (e) {
console.log(e);
uploadFromMemory(e);
}
};
await signAndSubmitTransaction();
mpc.js: İşlemin imzalanması burada gerçekleşir. Bu işlev, kms-decrypt ve credential-config'den işlevleri içe aktarır. Bu işlevleri daha sonra ele alacağız. mpc.js dosyasının içeriği aşağıda verilmiştir. Bu içeriği burada da bulabilirsiniz.
import {Storage} from '@google-cloud/storage';
import {ethers} from 'ethers';
import {credentialConfig} from './credential-config.js';
import {decryptSymmetric} from './kms-decrypt.js';
const providers = ethers.providers;
const Wallet = ethers.Wallet;
// The ID of the GCS bucket holding the encrypted keys
const bucketName = process.env.KEY_BUCKET;
// Name of the encrypted key files.
const encryptedKeyFile1 = 'alice_encrypted_key_share';
const encryptedKeyFile2 = 'bob_encrypted_key_share';
// Create a new storage client with the credentials
const storageWithCreds = new Storage({
credentials: credentialConfig,
});
// Create a new storage client without the credentials
const storage = new Storage();
const downloadIntoMemory = async (keyFile) => {
// Downloads the file into a buffer in memory.
const contents =
await storageWithCreds.bucket(bucketName).file(keyFile).download();
return contents;
};
const provider =
new providers.JsonRpcProvider(`http://${process.env.NODE_URL}:80`);
export const signTransaction = async (unsignedTransaction) => {
/* Check if Alice and Bob have both approved the transaction
For this example, we're checking if their encrypted keys are available. */
const encryptedKey1 =
await downloadIntoMemory(encryptedKeyFile1).catch(console.error);
const encryptedKey2 =
await downloadIntoMemory(encryptedKeyFile2).catch(console.error);
// For each key share, make a call to KMS to decrypt the key
const privateKeyshare1 = await decryptSymmetric(encryptedKey1[0]);
const privateKeyshare2 = await decryptSymmetric(encryptedKey2[0]);
/* Perform the MPC calculations
In this example, we're combining the private key shares
Alternatively, you could import your mpc calculations here */
const wallet = new Wallet(privateKeyshare1 + privateKeyshare2);
// Sign the transaction
const signedTransaction = await wallet.signTransaction(unsignedTransaction);
return signedTransaction;
};
export const submitTransaction = async (signedTransaction) => {
// This can now be sent to Ganache
const hash = await provider.sendTransaction(signedTransaction);
return hash;
};
export const uploadFromMemory = async (contents) => {
// Upload the results to the bucket without service account impersonation
await storage.bucket(process.env.RESULTS_BUCKET)
.file('transaction_receipt_' + Date.now())
.save(JSON.stringify(contents));
};
kms-decrypt.js: Bu dosya, KMS'de yönetilen anahtarları kullanarak şifre çözme kodunu içerir. Aşağıda kms-decrypt.js dosyasının içeriği verilmiştir. Bu içeriği burada da bulabilirsiniz.
import {KeyManagementServiceClient} from '@google-cloud/kms';
import crc32c from 'fast-crc32c';
import {credentialConfig} from './credential-config.js';
const projectId = process.env.PRIMUS_PROJECT_ID;
const locationId = process.env.PRIMUS_LOCATION;
const keyRingId = process.env.PRIMUS_ENC_KEYRING;
const keyId = process.env.PRIMUS_ENC_KEY;
// Instantiates a client
const client = new KeyManagementServiceClient({
credentials: credentialConfig,
});
// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);
export const decryptSymmetric = async (ciphertext) => {
const ciphertextCrc32c = crc32c.calculate(ciphertext);
const [decryptResponse] = await client.decrypt({
name: keyName,
ciphertext,
ciphertextCrc32c: {
value: ciphertextCrc32c,
},
});
// Optional, but recommended: perform integrity verification on
// decryptResponse. For more details on ensuring E2E in-transit integrity to
// and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if (crc32c.calculate(decryptResponse.plaintext) !==
Number(decryptResponse.plaintextCrc32c.value)) {
throw new Error('Decrypt: response corrupted in-transit');
}
const plaintext = decryptResponse.plaintext.toString();
return plaintext;
};
credential-config.js: Bu dosya, iş yükü kimliği havuzu yollarını ve hizmet hesabı kimliğine bürünme ayrıntılarını depolar. Bu codelab için kullanacağımız credential-config.js dosyasını buradan indirebilirsiniz.
Dockerfile: Son olarak, iş yükü Docker görüntüsünü oluşturmak için kullanılacak Dockerfile'imizi oluştururuz. Dockerfile, burada belirtildiği şekilde tanımlanır.
FROM node:16.18.0
ENV NODE_ENV=production
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install --production
COPY . .
LABEL "tee.launch_policy.allow_cmd_override"="true"
LABEL "tee.launch_policy.allow_env_override"="NODE_URL,RESULTS_BUCKET,KEY_BUCKET,PRIMUS_PROJECT_NUMBER,PRIMUS_PROJECT_ID,PRIMUS_WORKLOAD_IDENTITY_POOL,PRIMUS_WIP_PROVIDER,PRIMUS_SERVICEACCOUNT,PRIMUS_ENC_KEYRING,PRIMUS_ENC_KEY"
CMD [ "node", "index.js" ]
Not: Dockerfile'deki LABEL "tee.launch_policy.allow_cmd_override"="true", görüntünün yazarı tarafından ayarlanan bir başlatma politikasıdır. Operatörün, iş yükünü yürütürken CMD'yi geçersiz kılmasına olanak tanır. allow_cmd_override varsayılan olarak false olarak ayarlanır. "tee.launch_policy.allow_env_override" etiketi, Confidential Space'e, resim kullanıcılarının hangi ortam değişkenlerini kullanabileceğini söyler .
Aşağıdaki adımların uygulandığı bir iş yükü oluşturmak için aşağıdaki komut dosyasını çalıştırın:
- İş yükü Docker görüntüsünü depolamak için Artifact Registry(
$PRIMUS_ARTIFACT_REPOSITORY
) oluşturun. - İş yükü kodunu gerekli kaynak adlarıyla güncelleyin. Bu codelab için kullanılan iş yükü kodu burada verilmiştir.
- İş yükü kodunun Docker görüntüsünü oluşturmak için Dockerfile oluşturun. Dockerfile'i burada bulabilirsiniz.
- Docker görüntüsünü oluşturun ve önceki adımda oluşturulan Artifact Registry'de (
$PRIMUS_ARTIFACT_REPOSITORY
) yayınlayın. $WORKLOAD_SERVICEACCOUNT
kullanıcısına$PRIMUS_ARTIFACT_REPOSITORY
için okuma izni verin. Bu, iş yükü kapsayıcısının iş yükü Docker görüntüsünü Artifact Registry'den alabilmesi için gereklidir.
./create_workload.sh
Blockchain düğümünü oluşturma
Ganache Ethereum Düğümü
İş yükünü yetkilendirmeden önce Ethereum Ganache örneğini oluşturmamız gerekir. İmzalı işlem bu Ganache örneğine gönderilir. Lütfen bu örneğin IP adresini not edin. Aşağıdaki komutu çalıştırdıktan sonra API'yi etkinleştirmek için y
girmeniz gerekebilir.
gcloud compute instances create-with-container ${ETHEREUM_NODE} \
--zone=${PRIMUS_PROJECT_ZONE} \
--tags=http-server \
--project=${PRIMUS_PROJECT_ID} \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring \
--container-image=docker.io/trufflesuite/ganache:v7.7.3 \
--container-arg=--wallet.accounts=\"0x0000000000000000000000000000000000000000000000000000000000000001,0x21E19E0C9BAB2400000\" \
--container-arg=--port=80
4. İş yükünü yetkilendirme ve çalıştırma
İş yükünü yetkilendirme
Bu adımda, iş yükü kimliği havuzu ($PRIMUS_WORKLOAD_IDENTITY_POOL
) altında iş yükü kimliği havuzu sağlayıcısını oluşturacağız. Aşağıda gösterildiği gibi, iş yükü kimliği için yapılandırılmış özellik koşulları vardır. Koşullardan biri, iş yükü görüntüsünün beklenen yapı deposundan çekildiğini doğrulamaktır.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
--location="${PRIMUS_PROJECT_LOCATION}" \
--workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 'STABLE' in assertion.submods.confidential_space.support_attributes && assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && '$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
İş yükünü çalıştırma
Bu bölümde, iş yükünün Gizli Sanal Makine'de nasıl çalıştırılacağı açıklanmaktadır. Bunun için meta veri işaretçisini kullanarak gerekli TEE bağımsız değişkenlerini iletiriz. Ayrıca, "tee-env-*" işaretini kullanarak iş yükü kapsayıcısı için ortam değişkenleri ayarlayacağız. Resimde aşağıdaki değişkenler bulunur:
NODE_URL
: İmzalı işlemi işleyecek Ethereum düğümünün URL'si.RESULTS_BUCKET
: mpc işlem sonucunu depolayan paket.KEY_BUCKET
: mpc şifrelenmiş anahtarları depolayan paket.PRIMUS_PROJECT_NUMBER
: Kimlik bilgisi yapılandırma dosyası için kullanılan proje numarası.PRIMUS_PROJECT_ID
: Kimlik bilgisi yapılandırma dosyası için kullanılan proje kimliği. İş yükünün yürütülmesinin sonucu$PRIMUS_RESULT_STORAGE_BUCKET
'te yayınlanır.PRIMUS_WORKLOAD_IDENTITY_POOL
: Hak taleplerini doğrulamak için kullanılan Workload Identity havuzu.PRIMUS_WIP_POROVIDER
: Workload tarafından sunulan jetonları doğrulamak için kullanılacak özellik koşullarını içeren Workload Identity Pool sağlayıcısı.WORKLOAD_SERVICEACCOUNT
: İş yükünün hizmet hesabı.
gcloud compute instances create $WORKLOAD_VM \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=TERMINATE \
--scopes=cloud-platform \
--zone=${PRIMUS_PROJECT_ZONE} \
--project=${PRIMUS_PROJECT_ID} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG~tee-restart-policy=Never~tee-env-NODE_URL=$(gcloud compute instances describe ${ETHEREUM_NODE} --format='get(networkInterfaces[0].networkIP)' --zone=${PRIMUS_PROJECT_ZONE})~tee-env-RESULTS_BUCKET=$PRIMUS_RESULT_STORAGE_BUCKET~tee-env-KEY_BUCKET=$PRIMUS_INPUT_STORAGE_BUCKET~tee-env-PRIMUS_PROJECT_ID=$PRIMUS_PROJECT_ID~tee-env-PRIMUS_PROJECT_NUMBER=$(gcloud projects describe $PRIMUS_PROJECT_ID --format="value(projectNumber)")~tee-env-PRIMUS_WORKLOAD_IDENTITY_POOL=$PRIMUS_WORKLOAD_IDENTITY_POOL~tee-env-PRIMUS_PROJECT_LOCATION=${PRIMUS_PROJECT_LOCATION}~tee-env-PRIMUS_WIP_PROVIDER=$PRIMUS_WIP_PROVIDER~tee-env-PRIMUS_SERVICEACCOUNT=$PRIMUS_SERVICEACCOUNT~tee-env-PRIMUS_KEY=${PRIMUS_KEY}~tee-env-PRIMUS_KEYRING=${PRIMUS_KEYRING}"
Cloud Storage sonuçlarını kontrol etme
İşlem makbuzunu Cloud Storage'da görüntüleyebilirsiniz. Gizli Alan'ın başlatılması ve sonuçların görünmesi birkaç dakika sürebilir. Sanal makine durdurulmuş durumdayken kapsayıcı işleminin tamamlandığını anlayabilirsiniz.
- Cloud Storage Tarayıcısı sayfasına gidin.
$PRIMUS_RESULT_STORAGE_BUCKET
simgesini tıklayın.transaction_receipt
dosyasını tıklayın.- İşlem yanıtını indirip görüntülemek için İndir'i tıklayın.
Alternatif olarak, sonucu görüntülemek için aşağıdaki komutları da çalıştırabilirsiniz.
gcloud config set project $PRIMUS_PROJECT_ID
gsutil cat gs://$PRIMUS_RESULT_STORAGE_BUCKET/transaction_receipt
Not: Sonuçlar görünmüyorsa Compute Engine Cloud Console sayfasında $WORKLOAD_VM'ye gidip günlükleri görüntülemek için "Seri bağlantı noktası 1 (konsol)"u tıklayabilirsiniz.
Ganache Blockchain İşlemini Kontrol Etme
İşlemi blok zinciri günlüğünde de görüntüleyebilirsiniz.
- Cloud Compute Engine sayfasına gidin.
${ETHEREUM_NODE}
VM
simgesini tıklayın.- Tarayıcıda SSH penceresini açmak için
SSH
simgesini tıklayın. - SSH penceresinde, çalışan Ganache kapsayıcısını görmek için
sudo docker ps
yazın. trufflesuite/ganache:v7.7.3
için kapsayıcı kimliğini bulma- CONTAINER_ID yerine
trufflesuite/ganache:v7.7.3
kimliğini yazaraksudo docker logs CONTAINER_ID
değerini girin. - Ganache günlüklerini görüntüleyin ve günlüklerde bir işlem listelendiğinden emin olun.
5. Temizleme
Bu codelab kapsamında oluşturduğumuz kaynakları temizlemek için kullanılabilecek komut dosyası burada verilmiştir. Bu temizleme kapsamında aşağıdaki kaynaklar silinecek:
- Şifrelenmiş anahtar paylaşımlarını depolamak için kullanılan giriş depolama alanı paketi (
$PRIMUS_INPUT_STORAGE_BUCKET)
. - Şifreleme anahtarı (
$PRIMUS_KEY
). - Korunan kaynaklara (
$PRIMUS_SERVICEACCOUNT
) erişmek için kullanılan hizmet hesabı. - Workload Identity havuzu (
$PRIMUS_WORKLOAD_IDENTITY_POOL
). - İş yükü hizmet hesabı (
$WORKLOAD_SERVICEACCOUNT
). - İş yükü bilgi işlem örnekleri (
$WORKLOAD_VM
ve$ETHEREUM_NODE
). - İşlem sonucunu depolamak için kullanılan sonuç depolama paketi.(
$PRIMUS_RESULT_STORAGE_BUCKET
). - İş yükü resmini (
$PRIMUS_ARTIFACT_REPOSITORY
) depolamak için kullanılan Artifact Registry.
./cleanup.sh
Keşif yapmayı tamamladıysanız lütfen projenizi silin.
- Cloud Platform Console'a gidin.
- Kapatmak istediğiniz projeyi seçin, ardından üstteki "Sil"i tıklayın. Bu işlem, projenin silinmesini planlar.
Sırada ne var?
Benzer codelab'lerden bazılarına göz atın...
- Gizli Alan ile kullanılan güvenli paylaşılan veriler
- İmzalanmış kapsayıcı resmi codelab'i
- Gizli alanlarla gizli verileri analiz etme