Güvenli Alan codelab'i

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

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>
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')
  1. 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_PROJECT_REGION

Primus şirketi için bölgesel kaynakların oluşturulacağı bölge.

$PRIMUS_SERVICE_LOCATION

Primus şirketi için kaynakların oluşturulacağı konum.

$PRIMUS_PROJECT_ZONE

Primus şirketi için bölgesel kaynakların oluşturulacağı bölge.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Bulut kaynaklarını korumak için Primus şirketinin Workload Identity Pool'u.

$PRIMUS_WIP_PROVIDER

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.

$PRIMUS_SERVICEACCOUNT

$PRIMUS_WORKLOAD_IDENTITY_POOL adlı şirketin, korunan kaynaklara erişmek için kullandığı Primus hizmet hesabı. Bu adımda, $PRIMUS_INPUT_STORAGE_BUCKET paketinde depolanan müşteri verilerini görüntüleme izni vardır.

$PRIMUS_ENC_KEY

KMS anahtarı, Primus şirketinin çalışanları tarafından sağlanan istemleri şifrelemek için kullanılır.

$PRIMUS_ENC_KEYRING

Primus şirketi için şifreleme anahtarı $PRIMUS_ENC_KEY oluşturmak üzere kullanılacak KMS anahtarlığı.

$PRIMUS_ENC_KEYVERSION

Şifreleme anahtarının KMS anahtar sürümü $PRIMUS_ENC_KEY. Varsayılan değer 1'dir. Geçmişte döndürülmüş ve sürümü güncellenmiş mevcut bir anahtar kullanıyorsanız bunu güncelleyin.

$PRIMUS_ARTIFACT_REPOSITORY

İş yükü Docker görüntüsünün gönderileceği yapay ürün deposu.

$PRIMUS_PROJECT_REPOSITORY_REGION

Yayınlanan iş yükü Docker görüntüsünü içeren yapay nesne deposunun bölgesi.

$WORKLOAD_VM

İş yükü sanal makinesinin adı.

$WORKLOAD_IMAGE_NAME

İş yükü Docker görüntüsünün adı.

$WORKLOAD_IMAGE_TAG

İş yükü kapsayıcı görüntüsünün etiketi.

$WORKLOAD_SERVICEACCOUNT

İş yükünü çalıştıran Gizli Sanal Makine'ye erişme izni olan hizmet hesabı.

$CLIENT_VM

Çıkarım sunucusunun istemci uygulamasını çalıştıracak istemci VM'sinin adı.

$CLIENT_SERVICEACCOUNT

$CLIENT_VM tarafından kullanılan hizmet hesabı

  • $PRIMUS_PROJECT_ID kimlikli 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_ID iç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.cryptoKeyDecrypter rolüyle) verilerin şifresini çözme, KMS anahtarını kullanarak (roles/cloudkms.cryptoKeyEncrypter rolüyle) verileri şifreleme, Cloud Storage paketinden (objectViewer rolüyle) verileri okuma ve hizmet hesabını iş yükü kimliği havuzuna (roles/iam.workloadIdentityUser rolü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.workloadUser onay jetonu almak için
  • logging.logWriter Cloud 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_SERVICEACCOUNT için $PRIMUS_ARTIFACT_REGISTRY okuma 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_REPOSITORY deposuna 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_ACCOUNT hizmet 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.