Google KMS на AppEngine/Python и сервере разработки приложений
Из документации неясно, как можно использовать Google Key Management System (KMS) в Google App Engine Standard, особенно при локальной разработке с использованием сервера разработки.
Это будет выглядеть так же просто, как:
- Установка
google-api-python-client
в виртуальном окружении Python (и добавление пути virtualenv с помощьюgoogle.appengine.ext.vendor
вappengine_config.py
) - импорта
googleapiclient.discovery
- получить идентификацию приложения с
google.appengine.api.app_identity
- С использованием
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 (или даже отдельный проект) из ваших производственных ресурсов.