1. Genel Bakış
GPU hızlandırmalı iş yüklerinizin güvenlik ve gizlilik düzeyini yükseltmeye hazır mısınız? Bu codelab, hassas yapay zeka/makine öğrenimi iş yükleriniz için güçlü operatör izolasyonu ve hızlandırıcı desteği sağlayan Trusted Space'in özelliklerini tanıtacaktır.
Değerli verileri, modelleri ve anahtarları korumak artık her zamankinden daha önemli. Trusted Space, iş yüklerinizin güvenli ve güvenilir bir ortamda çalışmasını sağlayarak bir çözüm sunar. Bu ortamda iş yükü operatörünün bile erişimi yoktur.
Güvenilir Alan'ın sunduğu özellikler:
- Gelişmiş Gizlilik ve Güvenlik: Trusted Space, hassas öğelerinizin (ör. modeller, değerli veriler ve anahtarlar) kriptografik kanıtlarla desteklenerek korunmaya devam ettiği güvenilir bir yürütme ortamı sağlar.
- Operatör İzolasyonu: Operatör müdahalesiyle ilgili endişeleri ortadan kaldırın. Güvenilen Alan ile iş yükü operatörleriniz bile erişemez. Böylece, SSH yapmaları, verilere erişmeleri, yazılım yüklemeleri veya kodunuzla oynamaları engellenir.
- Hızlandırıcı Desteği: Trusted Space, H100, A100, T4 ve L4 gibi GPU'lar da dahil olmak üzere çok çeşitli donanım hızlandırıcılarla sorunsuz bir şekilde çalışacak şekilde tasarlanmıştır. Bu sayede, performans açısından kritik öneme sahip yapay zeka/makine öğrenimi uygulamalarınız sorunsuz bir şekilde çalışır.
Neler öğreneceksiniz?
- Trusted Space'in temel teklifleri hakkında bilgi edinin.
- Değerli yapay zeka/makine öğrenimi iş yükü varlıklarınızı güvence altına almak için güvenilen alan ortamını nasıl dağıtacağınızı ve yapılandıracağınızı öğrenin.
Gerekenler
- Google Cloud Platform projesi
- Google Compute Engine ve hızlandırıcılar hakkında temel düzeyde bilgi sahibi olma
- Hizmet hesapları, anahtar yönetimi, Workload Identity Federation ve özellik koşulları hakkında temel bilgiler.
- Container'lar ve Artifact Registry hakkında temel bilgiler
Primus Company ile hassas kod oluşturma istemlerini koruma
Bu codelab'de, çalışanlarının verilerinin gizliliğine ve güvenliğine öncelik veren bir şirket olan Primus'un yerine geçeceğiz. Primus, geliştiricilerinin kodlama görevlerinde yardımcı olması için bir kod oluşturma modeli dağıtmak istiyor. Ancak bu istemler genellikle hassas kod snippet'leri, dahili proje ayrıntıları veya tescilli algoritmalar içerdiğinden çalışanları tarafından gönderilen istemlerin gizliliğini koruma konusunda endişelidirler.
Primus Şirketi neden Operatör'e güvenmiyor?
Primus Corp, rekabetin yoğun olduğu bir pazarda faaliyet gösteriyor. Kod tabanları, tescilli algoritmalar ve rekabet avantajı sağlayan hassas kod snippet'leri dahil olmak üzere değerli fikri mülkiyet içerir. İş yükü operatörleri tarafından kurumsal casusluk yapılma olasılığından endişe duyuyorlar. Ayrıca, çalışan istemleri, Primus Corp'un korumak istediği kodun gizli "bilinmesi gereken" kısımlarını içerebilir.
Bu endişeyi gidermek için Primus Corp, kod oluşturma modelini çalıştıran çıkarım sunucusunu yalıtmak üzere Trusted Space'ten yararlanacak. İşleyiş şekli:
- İstem Şifreleme: Her çalışan, çıkarım sunucusuna bir istem göndermeden önce Google Cloud'da Primus Corp tarafından yönetilen bir KMS anahtarı kullanarak istemi şifreler. Bu sayede, yalnızca ilgili şifre çözme anahtarının bulunduğu Güvenilir Alan ortamı şifreyi çözebilir ve düz metin istemine erişebilir. Gerçek dünya senaryosunda, istemci tarafı şifreleme mevcut kitaplıklar (ör. tink) tarafından işlenebilir. Bu codelab kapsamında, zarf şifrelemeli bu örnek istemci uygulamasını kullanacağız.
- Operatör İzolasyonu: Şifreleme için kullanılan anahtara yalnızca Güvenilir Alan ortamında çalışan çıkarım sunucusu erişebilir ve istemin şifresini güvenilir bir ortamda çözebilir. Şifreleme anahtarına erişim, Workload Identity havuzu tarafından korunur. Trusted Space'in izolasyon garantileri nedeniyle, iş yükü operatörü bile şifreleme için kullanılan anahtara ve şifresi çözülmüş içeriğe erişemez.
- Hızlandırıcılar kullanılarak güvenli çıkarım: Çıkarım sunucusu, güvenilir alan kurulumunun bir parçası olarak Korumalı Sanal Makine'de başlatılır. Bu sayede iş yükü örneğinin başlatma veya çekirdek düzeyinde kötü amaçlı yazılım ya da rootkit'ler tarafından güvenliğinin ihlal edilmediği sağlanır. Bu sunucu, istemi Güvenilir Alan ortamında şifre çözer, kod oluşturma modelini kullanarak çıkarım gerçekleştirir ve oluşturulan kodu çalışana döndürür.
2. Cloud kaynaklarını ayarlama
Başlamadan önce
- Bu codelab'de kullanılan gerekli komut dosyalarını almak için aşağıdaki komutu kullanarak bu depoyu klonlayın.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Bu codelab'in dizinini değiştirin.
cd confidential-space/codelabs/trusted_space_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 codelab'i inceleyin. Proje kimliğinin nasıl alınacağı ve proje adı ile 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 of Primus>
- Projeleriniz için Faturalandırmayı etkinleştirin.
- Her iki proje için de Confidential Computing API ve aşağıdaki API'leri etkinleştirin.
gcloud services enable \
cloudapis.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudkms.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- Aşağıdaki komutu kullanarak yukarıda belirtilen kaynak adları için değişkenlere değer atayın. Bu değişkenler, kaynak adlarını gerektiği gibi özelleştirmenize ve daha önce oluşturulmuşsa mevcut kaynakları kullanmanıza olanak tanır. (ör.
export PRIMUS_SERVICE_ACCOUNT='my-service-account')
- Primus projesindeki mevcut bulut kaynağı adlarıyla aşağıdaki değişkenleri ayarlayabilirsiniz. Değişken ayarlanırsa Primus projesindeki mevcut ilgili bulut kaynağı kullanılır. Değişken ayarlanmamışsa bulut kaynağı adı proje adından oluşturulur ve bu adla yeni bir bulut kaynağı oluşturulur. Kaynak adları için desteklenen değişkenler şunlardır:
| Primus şirketi için bölgesel kaynakların oluşturulacağı bölge. |
| Primus şirketi için kaynakların oluşturulacağı konum. |
| Primus şirketi için bölgesel kaynakların oluşturulacağı bölge. |
| Bulut kaynaklarını korumak için Primus şirketinin Workload Identity Pool'u. |
| Primus şirketinin Workload Identity Pool sağlayıcısı. Bu sağlayıcı, Onay Doğrulayıcı Hizmeti tarafından imzalanan jetonlar için kullanılacak yetkilendirme koşulunu içerir. |
|
|
| KMS anahtarı, Primus şirketinin çalışanları tarafından sağlanan istemleri şifrelemek için kullanılır. |
| Primus şirketi için şifreleme anahtarı |
| Şifreleme anahtarının KMS anahtar sürümü |
| İş yükü Docker görüntüsünün gönderileceği yapay ürün deposu. |
| Yayınlanan iş yükü Docker görüntüsünü içeren yapay nesne deposunun bölgesi. |
| İş yükü sanal makinesinin adı. |
| İş yükü Docker görüntüsünün adı. |
| İş yükü kapsayıcı görüntüsünün etiketi. |
| İş yükünü çalıştıran Gizli Sanal Makine'ye erişme izni olan hizmet hesabı. |
| Çıkarım sunucusunun istemci uygulamasını çalıştıracak istemci VM'sinin adı. |
|
|
$PRIMUS_PROJECT_IDkimlikli proje için Depolama Alanı Yöneticisi, Artifact Registry Yöneticisi, Cloud KMS Yöneticisi, Hizmet Hesabı Yöneticisi ve IAM Workload Identity Pool Yöneticisi rollerine sahip olmanız gerekir. GCP Console'u kullanarak IAM rolleri verme hakkında bilgi edinmek için bu kılavuza bakabilirsiniz.$PRIMUS_PROJECT_IDiçin, 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
Primus Company kaynaklarını ayarlama
Bu adımda, Primus için gerekli bulut kaynaklarını ayarlayacaksınız. Primus için kaynakları ayarlamak üzere aşağıdaki komut dosyasını çalıştırın. Komut dosyası yürütme kapsamında aşağıdaki kaynaklar oluşturulur:
- Primus şirketinin müşteri verileri dosyasını şifrelemek için KMS'de şifreleme anahtarı (
$PRIMUS_ENC_KEY) ve anahtarlık ($PRIMUS_ENC_KEYRING). - Sağlayıcısı altında yapılandırılan özellik koşullarına göre talepleri doğrulamak için Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL). - Yukarıda belirtilen iş yükü kimliği havuzuna (
$PRIMUS_WORKLOAD_IDENTITY_POOL) eklenen hizmet hesabı ($PRIMUS_SERVICE_ACCOUNT), KMS anahtarını kullanarak (roles/cloudkms.cryptoKeyDecrypterrolüyle) verilerin şifresini çözme, KMS anahtarını kullanarak (roles/cloudkms.cryptoKeyEncrypterrolüyle) verileri şifreleme, Cloud Storage paketinden (objectViewerrolüyle) verileri okuma ve hizmet hesabını iş yükü kimliği havuzuna (roles/iam.workloadIdentityUserrolüyle) bağlama erişimine sahiptir.
./setup_primus_resources.sh
3. İş Yükü Oluşturma
İş yükü hizmet hesabı oluşturma
Şimdi, iş yükü için gerekli roller ve izinlere sahip bir hizmet hesabı oluşturacaksınız. Primus projesinde iş yükü hizmet hesabı oluşturmak için aşağıdaki komut dosyasını çalıştırın. Bu hizmet hesabı, çıkarım sunucusunu çalıştıran sanal makine tarafından kullanılır.
Bu iş yükü hizmet hesabında ($WORKLOAD_SERVICEACCOUNT) aşağıdaki roller bulunur:
confidentialcomputing.workloadUseronay jetonu almak içinlogging.logWriterCloud Logging'e günlük yazmak için.
./create_workload_service_account.sh
İş yükü oluşturma
Bu adımda bir iş yükü Docker görüntüsü oluşturacaksınız. İş yükü Primus şirketi tarafından oluşturulur. Bu codelab'de kullanılan iş yükü, herkese açık GCS paketindeki (Vertex Model Garden) codegemma modelini kullanan Python kodudur. İş yükü, codegemma modelini yükler ve Primus geliştiricilerinden gelen kod oluşturma isteklerine hizmet edecek çıkarım sunucusunu başlatır.
İş yükü, kod oluşturma isteğinde şifrelenmiş istemle birlikte sarmalanmış DEK'yi alır. İş yükü daha sonra DEK'nin şifresini çözmek için KMS API çağrısı yapar ve ardından bu DEK'yi kullanarak istemin şifresini çözer. Şifreleme anahtarları (DEK için) Workload Identity havuzu aracılığıyla korunur ve özellik koşullarını karşılayan iş yüklerine erişim izni verilir. Bu özellik koşulları, iş yükünü yetkilendirme ile ilgili sonraki bölümde daha ayrıntılı olarak açıklanmıştır. Çıkarım sunucusu, şifresi çözülmüş istemi aldıktan sonra yüklenen bir modeli kullanarak kodu oluşturur ve yanıtı geri döndürür.
Aşağıdaki adımların gerçekleştirildiği bir iş yükü oluşturmak için aşağıdaki komut dosyasını çalıştırın:
- Primus'a ait Artifact Registry(
$PRIMUS_ARTIFACT_REGISTRY) oluşturun. - İş yükü kodunu gerekli kaynak adlarıyla güncelleyin.
- Çıkarım sunucusu iş yükünü oluşturun ve iş yükü kodunun Docker görüntüsünü oluşturmak için Dockerfile oluşturun. Bu codelab'de kullanılan Dockerfile'ı burada bulabilirsiniz.
- Docker görüntüsünü Primus'a ait Artifact Registry'de (
$PRIMUS_ARTIFACT_REGISTRY) oluşturun ve yayınlayın. $WORKLOAD_SERVICEACCOUNTiçin$PRIMUS_ARTIFACT_REGISTRYokuma izni verin. Bu, iş yükü container'ının iş yükü Docker görüntüsünü Artifact Registry'den çekmesi için gereklidir.
./create_workload.sh
Bu codelab'de oluşturulan ve kullanılan iş yükünün generate() yöntemini referans olarak aşağıda bulabilirsiniz (iş yükünün tamamı için buraya tıklayın).
def generate():
try:
data = request.get_json()
ciphertext = base64.b64decode(data["ciphertext"])
wrapped_dek = base64.b64decode(data["wrapped_dek"])
unwrapped_dek_response = kms_client.decrypt(
request={"name": key_name, "ciphertext": wrapped_dek}
)
unwrapped_dek = unwrapped_dek_response.plaintext
f = Fernet(unwrapped_dek)
plaintext = f.decrypt(ciphertext)
prompt = plaintext.decode("utf-8")
tokens = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**tokens, max_new_tokens=128)
generated_code = tokenizer.decode(outputs[0])
generated_code_bytes = generated_code.encode("utf-8")
response = f.encrypt(generated_code_bytes)
ciphertext_base64 = base64.b64encode(response).decode("utf-8")
response = {"generated_code_ciphertext": ciphertext_base64}
return jsonify(response)
except (ValueError, TypeError, KeyError) as e:
return jsonify({"error": str(e)}), 500
4. İş yükünü yetkilendirme ve çalıştırma
İş Yükünü Yetkilendirme
Primus, aşağıdaki kaynakların özelliklerine göre istem şifreleme için kullanılan KMS anahtarına iş yüklerinin erişmesine izin vermek istiyor:
- Ne: Doğrulanmış kod
- Nerede: Güvenli bir ortam
- Kim: Güvenilen bir operatör
Primus, bu şartlara dayalı bir erişim politikasını zorunlu kılmak için iş yükü kimliği federasyonunu kullanır. İş yükü kimliği federasyonu, özellik koşulları belirtmenize olanak tanır. Bu koşullar, hangi kimliklerin Workload Identity Pool (WIP) ile kimlik doğrulaması yapabileceğini kısıtlar. Ölçümleri sunmak ve politikayı zorunlu kılmak için Attestation Verifier Service'i WIP'ye Workload Identity Pool sağlayıcısı olarak ekleyebilirsiniz.
İş yükü kimliği havuzu, bulut kaynakları kurulum adımının bir parçası olarak daha önce oluşturulmuştu. Primus, artık yeni bir OIDC Workload Identity Pool sağlayıcısı oluşturacak. Belirtilen --attribute-condition, iş yükü kapsayıcısına erişimi yetkilendirir. Bu özellik için gerekenler:
- Ne: En son
$WORKLOAD_IMAGE_NAME,$PRIMUS_ARTIFACT_REPOSITORYdeposuna yüklendi. - Nerede: Confidential Space güvenilir yürütme ortamı, tam olarak desteklenen Confidential Space VM görüntüsünde çalışır.
- Kim: Primus
$WORKLOAD_SERVICE_ACCOUNThizmet hesabı.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
--location="global" \
--project="$PRIMUS_PROJECT_ID" \
--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 == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
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"
Yukarıdaki komut, hwmodel değerinin "GCP_SHIELDED_VM" ve swname değerinin "HARDENED_SHIELDED" olarak ayarlandığını kontrol ederek iş yükünün güvenilir bir alan ortamında çalıştığını doğrular. Ayrıca, güvenliği artırmak ve çalışan iş yükünün bütünlüğünü sağlamak için iş yüküne özel onaylar (ör. image_digest ve image_reference) içerir.
İş Yükü Çalıştırma
Bu adım kapsamında, iş yükünü hızlandırıcı eklenmiş olan Trusted Space VM'de çalıştıracağız. Zorunlu TEE bağımsız değişkenleri, meta veri işareti kullanılarak iletilir. İş yükü kapsayıcısı için bağımsız değişkenler, işaretin "tee-cmd" kısmı kullanılarak iletilir. İş yükü VM'sine Nvidia Tesla T4 GPU eklemek için --accelerator=type=nvidia-tesla-t4,count=1 işaretini kullanacağız. Bu işlem, sanal makineye bir GPU ekler. Ayrıca, uygun GPU sürücüsünün yüklenmesini tetiklemek için meta veri işaretlerine tee-install-gpu-driver=true eklememiz gerekir.
gcloud compute instances create ${WORKLOAD_VM} \
--accelerator=type=nvidia-tesla-t4,count=1 \
--machine-type=n1-standard-16 \
--shielded-secure-boot \
--image-project=conf-space-images-preview \
--image=confidential-space-0-gpupreview-796705b \
--zone=${PRIMUS_PROJECT_ZONE} \
--maintenance-policy=TERMINATE \
--boot-disk-size=40 \
--scopes=cloud-platform \
--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-install-gpu-driver=true~tee-restart-policy=Never"
Çıkarım Sorgusu Çalıştırma
İş yükü çıkarım sunucusu başarıyla başlatıldıktan sonra Primus şirketinin çalışanları artık çıkarım sunucusuna kod oluşturma istekleri gönderebilir.
Bu codelab kapsamında, çıkarım sunucusuyla etkileşim kuracak istemci uygulamasını ayarlamak için aşağıdaki komut dosyasını kullanacağız. İstemci sanal makinesini ayarlamak için bu komut dosyasını çalıştırın.
./setup_client.sh
Aşağıdaki adımlarda, istemci sanal makinesine nasıl SSH yapılacağı ve Python sanal ortamında örnek bir istemci uygulamasının nasıl yürütüleceği gösterilmektedir. Bu örnek uygulamada Fernet kitaplığıyla zarf şifreleme kullanılmaktadır. Ancak belirli şifreleme kitaplıklarının farklı kullanım alanlarına uyacak şekilde uyarlanabileceğini unutmayın.
gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}
İstemci sanal makinesinde Python sanal ortamını etkinleştirmek ve istemci uygulamasını yürütmek için aşağıdaki komutları çalıştırın.
source venv/bin/activate
python3 inference_client.py
Bu örnek istemci uygulamasının çıkışında, şifreleme ve düz metin istemi istekleri ile bunların karşılık gelen şifrelenmiş ve şifresi çözülmüş yanıtları gösterilir.
5. Temizleme
Bu codelab kapsamında oluşturduğumuz kaynakları temizlemek için kullanılabilecek komut dosyasına buradan ulaşabilirsiniz. Bu temizlik kapsamında aşağıdaki kaynaklar silinecek:
- Primus hizmet hesabı (
$PRIMUS_SERVICEACCOUNT). - Primus şifreleme anahtarı (
$PRIMUS_ENC_KEY). - Primus'un yapı deposu (
$PRIMUS_ARTIFACT_REPOSITORY). - Sağlayıcısıyla birlikte Primus Workload Identity Pool'u (
$PRIMUS_WORKLOAD_IDENTITY_POOL). - Primus'un iş yükü hizmet hesabı (
$WORKLOAD_SERVICEACCOUNT). - İş yükü VM'si (
$WORKLOAD_VM) ve istemci VM'si ($CLIENT_VM).
./cleanup.sh
Keşfetme işlemini tamamladıysanız lütfen projenizi silin.
- Cloud Platform Console'a gidin.
- Kapatmak istediğiniz projeyi seçin, ardından üst kısımdaki "Sil"i tıklayın. Bu işlem, projenin silinmesini planlar.