Лаборатория кода Trusted Space

1. Обзор

Готовы повысить безопасность и конфиденциальность ваших задач, ускоряемых с помощью графических процессоров? Этот практический семинар познакомит вас с возможностями Trusted Space — решения, обеспечивающего надежную изоляцию оператора и поддержку ускорителей для ваших конфиденциальных задач в области ИИ/машинного обучения.

Защита ценных данных, моделей и ключей сегодня важна как никогда. Trusted Space предлагает решение, гарантируя, что ваши рабочие нагрузки будут работать в безопасной, доверенной среде, к которой даже оператор рабочей нагрузки не имеет доступа.

Вот что предлагает Trusted Space:

  • Повышенная конфиденциальность и безопасность: Trusted Space обеспечивает доверенную среду выполнения, в которой ваши конфиденциальные активы (например, модели, ценные данные и ключи) остаются защищенными благодаря криптографическому доказательству.
  • Изоляция операторов: Исключите опасения по поводу вмешательства операторов. С Trusted Space даже операторы ваших рабочих нагрузок не имеют доступа, что предотвращает их подключение по SSH, доступ к данным, установку программного обеспечения или изменение вашего кода.
  • Поддержка ускорителей: Trusted Space разработан для бесперебойной работы с широким спектром аппаратных ускорителей, включая графические процессоры, такие как H100, A100, T4 и L4. Это гарантирует бесперебойную работу критически важных для производительности приложений искусственного интеллекта/машинного обучения.

Что вы узнаете

  • Ознакомьтесь с основными предложениями компании Trusted Space.
  • Узнайте, как развернуть и настроить среду Trusted Space для защиты ценных ресурсов вашей рабочей нагрузки в области ИИ/машинного обучения.

Что вам понадобится

Защита конфиденциальных запросов на генерацию кода с помощью компании Primus

В этом практическом занятии мы рассмотрим ситуацию в компании Primus, которая уделяет первостепенное внимание конфиденциальности и безопасности данных своих сотрудников. Primus хочет внедрить модель генерации кода, чтобы помочь своим разработчикам в решении задач по программированию. Однако компания обеспокоена защитой конфиденциальности запросов, отправляемых сотрудниками, поскольку эти запросы часто содержат конфиденциальные фрагменты кода, внутренние сведения о проектах или запатентованные алгоритмы.

Почему компания «Примус» не доверяет Оператору?

Компания Primus Corp работает на высококонкурентном рынке. Ее кодовая база содержит ценную интеллектуальную собственность, включая собственные алгоритмы и конфиденциальные фрагменты кода, обеспечивающие конкурентное преимущество. Компания обеспокоена возможностью корпоративного шпионажа со стороны операторов рабочих нагрузок. Кроме того, в подсказках для сотрудников могут содержаться конфиденциальные фрагменты кода, требующие обязательной информации, которые Primus Corp хочет защитить.

Для решения этой проблемы компания Primus Corp будет использовать Trusted Space для изоляции сервера вывода, на котором запускается модель для генерации кода. Вот как это работает:

  • Шифрование запроса: Перед отправкой запроса на сервер обработки данных каждый сотрудник должен зашифровать его с помощью ключа KMS, управляемого компанией Primus Corp в Google Cloud. Это гарантирует, что расшифровать запрос и получить доступ к его исходному тексту сможет только среда Trusted Space, где доступен соответствующий ключ расшифровки. В реальных условиях шифрование на стороне клиента может обрабатываться доступными библиотеками (например, tink ). В рамках этой практической работы мы будем использовать это примерное клиентское приложение с шифрованием конверта.
  • Изоляция оператора: Только сервер вывода, работающий в среде Trusted Space, будет иметь доступ к ключу, используемому для шифрования, и сможет расшифровать приглашение в доверенной среде. Доступ к ключу шифрования будет защищен пулом идентификаторов рабочей нагрузки. Благодаря гарантиям изоляции Trusted Space, даже оператор рабочей нагрузки не сможет получить доступ к ключу, используемому для шифрования, и расшифрованному содержимому.
  • Безопасное выполнение инференции с использованием ускорителей: Сервер инференции запускается на защищенной виртуальной машине (в рамках настройки доверенного пространства), что гарантирует, что экземпляр рабочей нагрузки не был скомпрометирован вредоносным ПО или руткитами на уровне загрузки или ядра. Этот сервер расшифровывает приглашение в среде доверенного пространства, выполняет инференцию с использованием модели генерации кода и возвращает сгенерированный код сотруднику.

2. Настройка облачных ресурсов

Прежде чем начать

  • Клонируйте этот репозиторий, используя приведенную ниже команду, чтобы получить необходимые скрипты, используемые в рамках этого практического занятия.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Измените каталог для этого практического занятия.
cd confidential-space/codelabs/trusted_space_codelab/scripts
  • Убедитесь, что вы установили необходимые переменные среды проекта, как показано ниже. Для получения дополнительной информации о настройке проекта GCP обратитесь к этому руководству . Вы можете обратиться к нему , чтобы узнать подробности о том, как получить идентификатор проекта и чем он отличается от имени проекта и номера проекта.
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
  • Присвойте значения переменным для указанных выше имен ресурсов, используя следующую команду. Эти переменные позволяют настраивать имена ресурсов по мере необходимости, а также использовать существующие ресурсы, если они уже созданы. (например, export PRIMUS_SERVICE_ACCOUNT='my-service-account' )
  1. В проекте Primus можно задать следующие переменные, используя существующие имена облачных ресурсов. Если переменная задана, будет использоваться соответствующий существующий облачный ресурс из проекта Primus. Если переменная не задана, имя облачного ресурса будет сгенерировано на основе имени проекта, и будет создан новый облачный ресурс с этим именем. Ниже перечислены поддерживаемые переменные для имен ресурсов:

$PRIMUS_PROJECT_REGION

Регион, в рамках которого будут создаваться региональные ресурсы для компании «Примус».

$PRIMUS_SERVICE_LOCATION

Место, где будут создаваться ресурсы для компании «Примус».

$PRIMUS_PROJECT_ZONE

Зона, в рамках которой будут создаваться зональные ресурсы для компании «Примус».

$PRIMUS_WORKLOAD_IDENTITY_POOL

Пул учетных данных рабочих нагрузок компании Primus для защиты облачных ресурсов.

$PRIMUS_WIP_PROVIDER

Поставщик пула идентификационных данных для рабочих нагрузок компании Primus, который включает условие авторизации для использования токенов, подписанных службой проверки подлинности (Attestation Verifier Service).

$PRIMUS_SERVICEACCOUNT

Сервисный аккаунт компании Primus, который используется в $PRIMUS_WORKLOAD_IDENTITY_POOL для доступа к защищенным ресурсам. На этом этапе он имеет разрешение на просмотр данных клиентов, хранящихся в сегменте $PRIMUS_INPUT_STORAGE_BUCKET .

$PRIMUS_ENC_KEY

Ключ KMS используется для шифрования запросов, предоставляемых сотрудниками компании Primus.

$PRIMUS_ENC_KEYRING

Связка ключей KMS, которая будет использоваться для создания ключа шифрования $PRIMUS_ENC_KEY для компании Primus.

$PRIMUS_ENC_KEYVERSION

Версия ключа KMS для ключа шифрования $PRIMUS_ENC_KEY . Значение по умолчанию — 1. Обновите это значение, если вы используете существующий ключ, который был сменён ранее и его версия обновлена.

$PRIMUS_ARTIFACT_REPOSITORY

Репозиторий артефактов, куда будет загружен образ Docker для рабочей нагрузки.

$PRIMUS_PROJECT_REPOSITORY_REGION

Область для репозитория артефактов, в котором будет размещен опубликованный образ Docker для рабочей нагрузки.

$WORKLOAD_VM

Название виртуальной машины рабочей нагрузки.

$WORKLOAD_IMAGE_NAME

Название образа Docker для рабочей нагрузки.

$WORKLOAD_IMAGE_TAG

Метка образа контейнера рабочей нагрузки.

$WORKLOAD_SERVICEACCOUNT

Учетная запись службы, имеющая разрешение на доступ к конфиденциальной виртуальной машине, на которой выполняется рабочая нагрузка.

$CLIENT_VM

Имя клиентской виртуальной машины, на которой будет запускаться клиентское приложение сервера вывода.

$CLIENT_SERVICEACCOUNT

Учетная запись службы, используемая виртуальной машиной $CLIENT_VM

  • Для проекта $PRIMUS_PROJECT_ID вам потребуются роли администратора хранилища, администратора реестра артефактов, администратора Cloud KMS, администратора учетных записей служб и администратора пула удостоверений рабочей нагрузки IAM. Инструкции по предоставлению ролей IAM с помощью консоли GCP можно найти в этом руководстве .
  • Для переменной $PRIMUS_PROJECT_ID выполните следующий скрипт , чтобы присвоить остальным переменным имена, основанные на идентификаторе вашего проекта для имен ресурсов.
source config_env.sh

Настройка ресурсов компании Primus

На этом этапе вы настроите необходимые облачные ресурсы для Primus. Запустите следующий скрипт , чтобы настроить ресурсы для Primus. В процессе выполнения скрипта будут созданы следующие ресурсы:

  • Ключ шифрования ( $PRIMUS_ENC_KEY ) и связка ключей ( $PRIMUS_ENC_KEYRING ) в KMS для шифрования файла с данными клиентов компании Primus.
  • Пул идентификаторов рабочей нагрузки ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) используется для проверки утверждений на основе условий атрибутов, настроенных в его поставщике.
  • Учетная запись службы ( $PRIMUS_SERVICE_ACCOUNT ), привязанная к вышеупомянутому пулу идентификаторов рабочей нагрузки ( $PRIMUS_WORKLOAD_IDENTITY_POOL ), имеет доступ к расшифровке данных с использованием ключа KMS (с использованием роли roles/cloudkms.cryptoKeyDecrypter ), шифрованию данных с использованием ключа KMS (с использованием роли roles/cloudkms.cryptoKeyEncrypter ), чтению данных из облачного хранилища (с использованием роли objectViewer ) и подключению учетной записи службы к пулу идентификаторов рабочей нагрузки (с использованием roles/iam.workloadIdentityUser ).
./setup_primus_resources.sh

3. Создать рабочую нагрузку

Создать учетную запись службы рабочей нагрузки

Теперь вам нужно создать учетную запись службы для рабочей нагрузки с необходимыми ролями и разрешениями. Запустите следующий скрипт , чтобы создать учетную запись службы рабочей нагрузки в проекте Primus. Эта учетная запись службы будет использоваться виртуальной машиной, на которой работает сервер вывода.

Эта учетная запись службы рабочей нагрузки ( $WORKLOAD_SERVICEACCOUNT ) будет обладать следующими ролями:

  • confidentialcomputing.workloadUser для получения токена подтверждения
  • logging.logWriter для записи логов в Cloud Logging.
./create_workload_service_account.sh

Создать рабочую нагрузку

На этом этапе вы создадите образ Docker для рабочей нагрузки. Рабочая нагрузка будет разработана компанией Primus. Рабочая нагрузка, используемая в этом практическом занятии, представляет собой код на Python, использующий модель Codegemma из общедоступного хранилища GCS (Vertex Model Garden). Рабочая нагрузка загрузит модель Codegemma и запустит сервер вывода, который будет обрабатывать запросы на генерацию кода от разработчиков Primus.

При запросе на генерацию кода рабочая нагрузка получит зашифрованный DEK вместе с зашифрованным приглашением. Затем рабочая нагрузка выполнит вызов API KMS для расшифровки DEK, после чего расшифрует приглашение, используя этот DEK. Ключи шифрования (для DEK) будут защищены пулом идентификаторов рабочих нагрузок, а доступ будет предоставлен рабочим нагрузкам, отвечающим условиям атрибутов. Эти условия атрибутов более подробно описаны в следующем разделе, посвященном авторизации рабочей нагрузки. После того, как сервер вывода получит расшифрованное приглашение, он сгенерирует код, используя загруженную модель, и вернет ответ.

Запустите следующий скрипт , чтобы создать рабочую нагрузку, в которой выполняются следующие шаги:

  • Создать реестр артефактов ( $PRIMUS_ARTIFACT_REGISTRY ), принадлежащий Primus.
  • Обновите код рабочей нагрузки, указав необходимые имена ресурсов.
  • Создайте рабочую нагрузку для сервера вывода и Dockerfile для сборки образа Docker с кодом рабочей нагрузки. Вот Dockerfile, использованный в этом практическом задании.
  • Создайте и опубликуйте образ Docker в реестре артефактов ( $PRIMUS_ARTIFACT_REGISTRY ), принадлежащем Primus.
  • Предоставьте учетной записи $WORKLOAD_SERVICEACCOUNT права на чтение для $PRIMUS_ARTIFACT_REGISTRY . Это необходимо для того, чтобы контейнер рабочей нагрузки мог загрузить образ Docker рабочей нагрузки из реестра артефактов.
./create_workload.sh

Для вашего удобства, вот метод generate() рабочей нагрузки, которая создается и используется в этом практическом задании (полный код рабочей нагрузки можно найти здесь ).

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. Авторизация и запуск рабочей нагрузки

Авторизация рабочей нагрузки

Компания Primus хочет разрешить рабочим нагрузкам доступ к ключу KMS, используемому для оперативного шифрования, на основе атрибутов следующих ресурсов:

  • Что : Проверяемый код
  • Где : В безопасной среде
  • Кто : Оператор, которому можно доверять.

Primus использует федерацию идентификации рабочей нагрузки для обеспечения соблюдения политики доступа на основе этих требований. Федерация идентификации рабочей нагрузки позволяет задавать условия атрибутов . Эти условия ограничивают, какие учетные записи могут проходить аутентификацию в пуле учетных записей рабочей нагрузки (WIP) . Вы можете добавить службу проверки аттестации (Attestation Verifier Service) в WIP в качестве поставщика пула учетных записей рабочей нагрузки для представления результатов измерений и обеспечения соблюдения политики.

Пул идентификаторов рабочей нагрузки был создан ранее в рамках этапа настройки облачных ресурсов. Теперь Primus создаст нового поставщика пула идентификаторов рабочей нагрузки OIDC. Указанный --attribute-condition разрешает доступ к контейнеру рабочей нагрузки. Для этого требуется:

  • Что : Последняя загрузка $WORKLOAD_IMAGE_NAME в репозиторий $PRIMUS_ARTIFACT_REPOSITORY .
  • Где : Доверенная среда выполнения Confidential Space работает на полностью поддерживаемом образе виртуальной машины Confidential Space.
  • Кто : Сервисный аккаунт Primus $WORKLOAD_SERVICE_ACCOUNT .
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"

Приведенная выше команда проверяет, выполняется ли рабочая нагрузка в доверенной среде, проверяя, что hwmodel установлен в значение "GCP_SHIELDED_VM", а swname — в значение "HARDENED_SHIELDED". Кроме того, она включает в себя специфические для рабочей нагрузки утверждения, такие как image_digest и image_reference , для повышения безопасности и обеспечения целостности выполняемой рабочей нагрузки.

Запуск рабочей нагрузки

На этом этапе мы запустим рабочую нагрузку в виртуальной машине Trusted Space, к которой будет подключен ускоритель. Необходимые аргументы TEE передаются с помощью флага метаданных . Аргументы для контейнера рабочей нагрузки передаются с помощью части флага " tee-cmd ". Чтобы оснастить виртуальную машину рабочей нагрузки графическим процессором Nvidia Tesla T4, мы будем использовать флаг --accelerator=type=nvidia-tesla-t4,count=1 . Это подключит один графический процессор к виртуальной машине. Нам также необходимо добавить tee-install-gpu-driver=true в флаги метаданных, чтобы запустить установку соответствующего драйвера графического процессора.

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"

Выполнить запрос на вывод

После успешного запуска сервера вывода рабочей нагрузки сотрудники компании Primus теперь могут отправлять запросы на генерацию кода на этот сервер.

В рамках этой практической работы мы будем использовать следующий скрипт для настройки клиентского приложения, которое будет взаимодействовать с сервером вывода. Запустите этот скрипт , чтобы настроить клиентскую виртуальную машину.

./setup_client.sh

Следующие шаги демонстрируют, как подключиться по SSH к виртуальной машине клиента и запустить пример клиентского приложения в виртуальной среде Python. В этом примере приложения используется шифрование с помощью библиотеки Fernet, но имейте в виду, что конкретные библиотеки шифрования могут быть адаптированы для различных сценариев использования.

gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}

Выполните следующие команды, чтобы активировать виртуальную среду Python на клиентской виртуальной машине и запустить клиентское приложение.

source venv/bin/activate
python3 inference_client.py

В результате выполнения этого примера клиентского приложения будут показаны запросы на шифрование и отправку в открытом виде, а также соответствующие им зашифрованные и расшифрованные ответы.

5. Уборка

Вот скрипт, который можно использовать для очистки ресурсов, созданных нами в рамках этого практического задания. В ходе этой очистки будут удалены следующие ресурсы:

  • Учетная запись службы Primus ( $PRIMUS_SERVICEACCOUNT ).
  • Ключ шифрования Primus ( $PRIMUS_ENC_KEY ).
  • Репозиторий артефактов Primus ( $PRIMUS_ARTIFACT_REPOSITORY ).
  • Пул идентификаторов рабочих нагрузок Primus ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) со своим поставщиком.
  • Учетная запись службы рабочей нагрузки Primus ( $WORKLOAD_SERVICEACCOUNT ).
  • Виртуальная машина рабочей нагрузки ( $WORKLOAD_VM ) и виртуальная машина клиента ( $CLIENT_VM ).
./cleanup.sh

Если вы закончили изучение вопроса, пожалуйста, рассмотрите возможность удаления вашего проекта.

  • Перейдите в консоль облачной платформы.
  • Выберите проект, который хотите закрыть, затем нажмите кнопку «Удалить» вверху: это запланирует удаление проекта.