Google KMS на AppEngine/Python и сервере разработки приложений

Из документации неясно, как можно использовать Google Key Management System (KMS) в Google App Engine Standard, особенно при локальной разработке с использованием сервера разработки.

Это будет выглядеть так же просто, как:

  1. Установка google-api-python-client в виртуальном окружении Python (и добавление пути virtualenv с помощью google.appengine.ext.vendor в appengine_config.py)
  2. импорта googleapiclient.discovery
  3. получить идентификацию приложения с google.appengine.api.app_identity
  4. С использованием kms клиент в ожидаемом / задокументированном виде

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

Такое ощущение, что я открываю новый путь, который, я уверен, уже должен был быть у других.

Кто-нибудь документировал использование Google KMS на App Engine Standard и его локальном сервере разработки?

РЕДАКТИРОВАТЬ - Обновить с примером кода

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

mykms.py

import googleapiclient.discovery
from google.appengine.api import app_identity

from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()

PROJECT = 'my-crypto-project'
IS_LOCAL = True
LOCATION = 'global'
TESTING_KR = 'testing-keyring'
KEY_RING = TESTING_KR if IS_LOCAL else app_identity.get_application_id()

kms = googleapiclient.discovery.build('cloudkms', 'v1', credentials=credentials)

def encrypt(plaintext, cryptokey, keyring=KEY_RING, location=LOCATION):
    name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
        PROJECT, location, keyring, cryptokey
    )
    cryptokeys = kms.projects().locations().keyRings().cryptoKeys()
    request = cryptokeys.encrypt(name=name, body={'plaintext': plaintext})
    return request.execute()


def decrypt(ciphertext, cryptokey, keyring=KEY_RING, location=LOCATION):
    name = 'projects/{}/locations/{}/keyRings/{}/cryptokey'.format(
        PROJECT, location, keyring
    )
    cryptokeys = kms.projects().locations().keyRings().cryptoKeys()
    request = cryptokeys.decrypt(name=name, body={'ciphertext': ciphertext})
    return request.execute()

Сейчас звоню, через dev_appserver.py:

import mykms
mykms.encrypt("my text", cryptokey="my-key-ring")

выдает ошибку:

HttpError: https://cloudkms.googleapis.com/v1/projects/np-crypto/locations/global/keyRings/localhost-testing/cryptoKeys/machine-identifiers:encrypt?alt=json возвращено "Запрос имеет недействительные учетные данные аутентификации. Ожидается Токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации. См. https://developers.google.com/identity/sign-in/web/devconsole-project. ">

Это не особенно полезно, поскольку в основном касается входа в Google на веб-сайте; однако, когда я импортирую mykms из командной строки я получаю ошибку:

Учетные данные приложения по умолчанию недоступны. Они доступны, если работают в Google Compute Engine. В противном случае должна быть определена переменная среды GOOGLE_APPLICATION_CREDENTIALS, указывающая на файл, определяющий учетные данные. См. https://developers.google.com/accounts/docs/application-default-credentials для получения дополнительной информации.

Это похоже на правильное руководство на данный момент. Смойте это и доложите.

РЕДАКТИРОВАТЬ № 2

Приложение, похоже, теперь подключается к KMS. Я удалил и повторно вошел в gcloud auth application-default login,

Тем не менее, есть странный побочный эффект - кажется, что что-то сканирует диск, и сотни сообщений (по-видимому, одно для каждого доступного каталога от root), например, загромождают журнал:

ИНФОРМАЦИЯ 30 Июн 2017 20:06:57 Песочница заблокировала доступ к файлу "/Users"

ИНФОРМАЦИЯ 30 Июн 2017 20:06:57 Если это статический файл, проверьте, что application_readable: true установлен в вашем app.yaml

1 ответ

Решение

Если вы разрабатываете с использованием Cloud KMS в GAE, нет локальной службы разработки, вы можете общаться только с основной производственной службой, когда собрались. Вы можете использовать библиотеки, как вы подробно описали, для локальной разработки, но все равно попадете в производство.

Обратите внимание, что вам нужно будет предоставить учетные данные по умолчанию для приложения GAE с областью использования, см. https://cloud.google.com/kms/docs/accessing-the-api.

Вы также можете делать запросы в качестве учетной записи службы GAE, если вы используетеgcloud iam service-accounts keys а также gcloud auth activate-service-account,

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

Другие вопросы по тегам