Получите секреты развертывания GCP от KMS
Я хочу развернуть облачный VPN-туннель в GCP с помощью Deployment Manager
Я настроил для этого сценарий развертывания, используя Python, и я не хочу, чтобы в моей конфигурации был общий секретный сигнал для VPN-туннеля в виде простого текста.
Поэтому я попытался включить секрет, зашифрованный с помощью KMS, а затем выполнить вызов KMS в сценарии Python, чтобы получить секрет в виде простого текста.
Код Python для расшифровки секрета выглядит следующим образом:
import base64
import googleapiclient.discovery
def decryptSecret(enc_secret,context):
""" decrypts the given Secret via KMS"""
# KMS Configuration
KEY_RING = <Key Ring>
KEY_ID = <Key>
KEY_LOCATION = REGION
KEY_PROJECT = context.env['project'],
# Creates an API client for the KMS API.
kms_client = googleapiclient.discovery.build('cloudkms', 'v1')
key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
KEY_PROJECT, KEY_LOCATION, KEY_RING, KEY_ID)
crypto_keys = kms_client.projects().locations().keyRings().cryptoKeys()
request = crypto_keys.decrypt(
name=key_name,
body={'ciphertext': enc_secret})
response = request.execute()
plaintext = base64.b64decode(response['plaintext'].encode('ascii'))
return plaintext
Но если я разверну этот код, я просто получу следующее сообщение об ошибке от администратора развертывания:
Waiting for update [operation-<...>]...failed.
ERROR: (gcloud.deployment-manager.deployments.update) Error in Operation [operation-1517326129267-5640004f18139-450d8883-8d57c3ff]: errors:
- code: MANIFEST_EXPANSION_USER_ERROR
message: |
Manifest expansion encountered the following errors: Error compiling Python code: No module named googleapiclient.discovery Resource: cloudvpn-testenv.py Resource: config
Я также попытался включить полную библиотеку google-api-python-client в свой конфигурационный yaml, но все равно получаю эту ошибку.
Есть идеи у кого-нибудь?
0 ответов
Чтобы напрямую ответить на ваш вопрос:
# requirements.txt
google-api-python-client
# main.py
import base64
import os
import googleapiclient.discovery
crypto_key_id = os.environ['KMS_CRYPTO_KEY_ID']
def decrypt(client, s):
response = client \
.projects() \
.locations() \
.keyRings() \
.cryptoKeys() \
.decrypt(name=crypto_key_id, body={"ciphertext":s}) \
.execute()
return base64.b64decode(response['plaintext']).decode('utf-8').strip()
kms_client = googleapiclient.discovery.build('cloudkms', 'v1')
auth = decrypt(kms_client, '...ciphertext...'])
Вы можете найти больше примеров и образцов на GitHub.
Чтобы косвенно ответить на ваш вопрос, вместо этого вас может заинтересовать Secret Manager.