1. Обзор
Готовы повысить безопасность и конфиденциальность ваших рабочих нагрузок с ускорением на графическом процессоре? В этой лаборатории кода вы познакомитесь с возможностями Trusted Space — предложения, обеспечивающего надежную изоляцию операторов и поддержку ускорителей для ваших конфиденциальных рабочих нагрузок искусственного интеллекта и машинного обучения.
Защита ценных данных, моделей и ключей сейчас важнее, чем когда-либо. Trusted Space предлагает решение, гарантируя, что ваши рабочие нагрузки работают в безопасной, надежной среде, к которой даже оператор рабочей нагрузки не имеет доступа.
Вот что предлагает Trusted Space:
- Повышенная конфиденциальность и безопасность: Trusted Space обеспечивает надежную среду выполнения, в которой ваши конфиденциальные активы (например, модели, ценные данные и ключи) остаются защищенными, подкрепленными криптографическими доказательствами.
- Изоляция оператора: Устраните опасения по поводу вмешательства оператора. Благодаря Trusted Space даже операторы вашей рабочей нагрузки не имеют доступа, что не позволяет им использовать SSH, получать доступ к данным, устанавливать программное обеспечение или вмешиваться в ваш код.
- Поддержка ускорителей: Trusted Space разработан для бесперебойной работы с широким спектром аппаратных ускорителей, включая графические процессоры, такие как H100, A100, T4 и L4. Это гарантирует бесперебойную работу ваших критически важных для производительности приложений AI/ML.
Что вы узнаете
- Получите представление о ключевых предложениях Trusted Space.
- Узнайте, как развернуть и настроить среду доверенного пространства для защиты ценных активов вашей рабочей нагрузки AI/ML.
Что вам понадобится
- Проект облачной платформы Google
- Базовые знания Google Compute Engine и ускорителей .
- Базовые знания об учетных записях служб , управлении ключами , федерации идентификации рабочей нагрузки и условиях атрибутов .
- Базовые знания контейнеров и реестра артефактов.
Защита конфиденциальных запросов на генерацию кода с помощью компании Primus
В этой лаборатории кода мы покажем себя в роли Primus, компании, которая уделяет приоритетное внимание конфиденциальности и безопасности данных своих сотрудников. Primus хочет внедрить модель генерации кода, чтобы помочь своим разработчикам решать задачи кодирования. Однако они обеспокоены защитой конфиденциальности запросов, отправляемых их сотрудниками, поскольку эти запросы часто содержат конфиденциальные фрагменты кода, внутренние детали проекта или собственные алгоритмы.
Почему компания Примус не доверяет Оператору?
Primus Corp работает на высококонкурентном рынке. Их кодовая база содержит ценную интеллектуальную собственность, включая запатентованные алгоритмы и конфиденциальные фрагменты кода, которые обеспечивают конкурентное преимущество. Они обеспокоены возможностью корпоративного шпионажа со стороны операторов рабочих нагрузок. Кроме того, подсказки для сотрудников могут включать конфиденциальные части кода, которые Primus Corp хочет защитить.
Чтобы решить эту проблему, Primus Corp будет использовать Trusted Space для изоляции сервера вывода, на котором работает модель для генерации кода. Вот как это работает:
- Быстрое шифрование: перед отправкой запроса на сервер вывода каждый сотрудник зашифрует его с помощью ключа KMS, которым управляет Primus Corp в Google Cloud. Это гарантирует, что только среда доверенного пространства, где доступен соответствующий ключ дешифрования, сможет расшифровать его и получить доступ к подсказке в виде открытого текста. В реальном сценарии шифрование на стороне клиента может выполняться с помощью доступных библиотек (например, Tink ). В рамках этой лаборатории мы будем использовать этот пример клиентского приложения с шифрованием конверта.
- Изоляция оператора: только сервер вывода, работающий в среде доверенного пространства, будет иметь доступ к ключу, используемому для шифрования, и сможет расшифровать приглашение в доверенной среде. Доступ к ключу шифрования будет защищен пулом удостоверений рабочей нагрузки. Благодаря гарантиям изоляции 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>
- Включите биллинг для своих проектов.
- Включите API конфиденциальных вычислений и следующие API для обоих проектов.
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'
)
- Вы можете установить следующие переменные с существующими именами облачных ресурсов в проекте Primus. Если переменная установлена, то будет использоваться соответствующий существующий облачный ресурс из проекта Primus. Если переменная не установлена, имя облачного ресурса будет сгенерировано из имени проекта, и с этим именем будет создан новый облачный ресурс. Ниже приведены поддерживаемые переменные для имен ресурсов:
| Регион, в рамках которого будут созданы региональные ресурсы для компании Примус. |
| Местоположение, в котором будут созданы ресурсы для компании Primus. |
| Зона, в рамках которой будут созданы зональные ресурсы для компании Primus. |
| Пул Workload Identity Pool компании Primus для защиты облачных ресурсов. |
| Поставщик пула удостоверений рабочей нагрузки компании Primus, который включает условие авторизации для использования токенов, подписанных службой проверки аттестации. |
| Сервисная учетная запись компании Primus, которую |
| Ключ KMS используется для шифрования подсказок, предоставляемых сотрудниками компании Primus. |
| Связка ключей KMS, которая будет использоваться для создания ключа шифрования |
| Версия ключа KMS ключа шифрования |
| Репозиторий артефактов, куда будет отправлен образ Docker рабочей нагрузки. |
| Регион репозитория артефактов, в котором будет опубликован опубликованный образ Docker рабочей нагрузки. |
| Имя виртуальной машины рабочей нагрузки. |
| Имя образа Docker рабочей нагрузки. |
| Тег образа контейнера рабочей нагрузки. |
| Учетная запись службы, имеющая разрешение на доступ к конфиденциальной виртуальной машине, на которой выполняется рабочая нагрузка. |
| Имя клиентской виртуальной машины, на которой будет запускаться клиентское приложение сервера вывода. |
| Учетная запись службы, используемая |
- Для проекта
$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 (сада моделей вершин). Рабочая нагрузка загрузит модель codegemma и запустит сервер вывода, который будет обслуживать запросы на генерацию кода от разработчиков Primus.
По запросу на создание кода Workload получит завернутый 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
Для справки, вот метод генерирования() рабочей нагрузки, которая создается и используется в этой кодовой лаборатории (весь код рабочей нагрузки можно найти здесь ).
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) . Вы можете добавить службу проверки аттестации в НЗП в качестве поставщика пула удостоверений рабочей нагрузки для представления измерений и обеспечения соблюдения политики.
Пул идентификаторов рабочей нагрузки уже был создан ранее на этапе настройки облачных ресурсов. Теперь 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
Если вы закончили изучение, рассмотрите возможность удаления проекта.
- Перейдите в консоль облачной платформы.
- Выберите проект, который хотите закрыть, затем нажмите «Удалить» вверху: это запланирует удаление проекта.