Функция Google Cloud: поддержка Google Cloud KMS

Я использую облачную функцию Google (GCF) с триггером Pubsub, который отправляет HTTP-запрос стороннему API.

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

Сторонний API требует аутентификации с использованием базовой HTTP-аутентификации.

Чтобы не вводить пароль жестко в исходном коде, я использую Google KMS для создания нового зашифрованного ключа каждый раз при развертывании своей функции. Я использую Google Cloud KMS для расшифровки секрета каждый раз, когда создается функция.

Для расшифровки с помощью KMS мне нужно предоставить закрытый ключ для служебной учетной записи в Google API NodeJS.

Моя главная проблема сегодня заключается в том, что мне нужно вставить свой закрытый ключ в GCloud Bucket, если я хочу, чтобы мой GCF работал правильно.

Возможно ли с помощью Конфигуратора времени выполнения или Диспетчера развертывания настроить секреты для функции Google Cloud?

Спасибо вам.

4 ответа

Другое решение этой проблемы, появившееся только в последние несколько месяцев, заключается в использовании конфигурации среды выполнения Google Cloud с Firebase для функций: https://firebase.google.com/docs/functions/config-env

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

Runtime Configurator не взимает плату за использование, но применяет следующие ограничения и квоты API:

  • 1200 запросов в минуту (QPM) для запросов на удаление, создание и обновление
  • 600 QPM для запросов часов.
  • 6000 QPM для получения и списка запросов.
  • 4 МБ данных на пользователя, который состоит из всех данных, записанных в службу Runtime Configurator, и сопутствующих метаданных.

https://cloud.google.com/deployment-manager/pricing-and-quotas


Кроме того, я нахожу этот конфликт в Firebase for Functions смешным:

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

Затем мгновение спустя:

После запуска functions:config:setнеобходимо повторно развернуть функции, чтобы сделать новую конфигурацию доступной.


Решение KMS является жизнеспособной альтернативой, однако оно кажется дорогостоящим для функций. Стоимость KMS составляет 0,06 долл. США в месяц за активный ключ, а также 0,03 долл. США за 10 000 операций.

Это затем изменит стоимость вашей облачной функции с 0,40 долл. США за миллион вызовов до 3,40 долл. США за вызовы. Это настоящий прыжок.

По состоянию на декабрь 2019 года предпочтительным способом хранения и управления секретами в Google Cloud является Secret Manager:

$ echo -n "user:pass" | gcloud beta secrets create "my-basic-auth" \
  --data-file=- \
  --replication-policy "automatic"

Вы также можете создавать и управлять секретами из API:

// Import the library
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');

// Create the client
const client = new SecretManagerServiceClient();

// Create the secret
const [secret] = await client.createSecret({
  parent: "projects/<YOUR-PROJECT-ID>",
  secretId:"my-basic-auth",
  secret: {
    replication: {
      automatic: {},
    },
  },
});

// Add the version with your data
const [version] = await client.addSecretVersion({
  parent: secret.name,
  payload: {
    data: Buffer.from("user:pass", "utf8"),
  },
});

Затем в вашей облачной функции:

const [version] = await client.accessSecretVersion({
  name:"projects/<YOUR-PROJECT-ID>/secrets/<MY-SECRET>/versions/1",
});

const auth = version.payload.data.toString('utf-8');

// auth is user:pass

Учетная запись службы, с которой вы развертываете свою облачную функцию, потребует roles/secretmanager.secretAccessor разрешения.

Возможно ли с помощью Конфигуратора времени выполнения или Диспетчера развертывания настроить секреты для функции Google Cloud?

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

Если вы хотите, вы можете отправить запрос на добавление в команду Cloud Function с помощью соответствующего средства отслеживания проблем.

Существует также служба управления ключами Google Cloud: клиент Node.js.

      cd functions
npm install @google-cloud/kms

Например:

      // Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');

// Instantiates a client
const client = new KeyManagementServiceClient();

// Build the location name
const locationName = client.locationPath(functions.config().firebase.projectId, functions.config().firebase.locationId);

async function listKeyRings() {
  const [keyRings] = await client.listKeyRings({
    parent: locationName,
  });
  for (const keyRing of keyRings) {
    console.log(keyRing.name);
  }
  return keyRings;
}

return listKeyRings();