Доступ к секретному менеджеру запрещен, несмотря на правильные роли для учетной записи службы - PullRequest
5 голосов
/ 18 июня 2020

Я пишу облачную функцию в Nodejs (10) и пытаюсь получить доступ к секрету следующим образом:

const [secret] = await new SecretManagerServiceClient().accessSecretVersion({
    name: `projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest`
})

Я создал секрет в веб-консоли и имя, используемое в коде совпадает с существующим секретом. На странице с подробностями об облачной функции указано, что учетная запись службы - PROJECT_ID@appspot.gserviceaccount,com, поэтому я добавил к ней роль secretmanager.secretAccessor. Однако каждый раз я получаю одну и ту же ошибку:

Error: 7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest' (or it may not exist).

Не имеет значения, укажу я конкретную версию или просто использую последнюю.

Ответы [ 3 ]

4 голосов
/ 04 августа 2020

Код облачной функции HTTP:

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

const secretManagerServiceClient = new SecretManagerServiceClient();
const name = 'projects/shadowsocks-218808/secrets/workflow/versions/latest';

exports.testSecretManager = async (req, res) => {
  const [version] = await secretManagerServiceClient.accessSecretVersion({ name });
  const payload = version.payload.data.toString();
  console.debug(`Payload: ${payload}`);
  res.sendStatus(200);
};

Развертывание:

gcloud functions deploy testSecretManager --runtime nodejs10 --trigger-http --allow-unauthenticated

Deploying function (may take a while - up to 2 minutes)...done.                                                                                                                                                                                                                        
availableMemoryMb: 256
entryPoint: testSecretManager
httpsTrigger:
  url: https://us-central1-shadowsocks-218808.cloudfunctions.net/testSecretManager
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/shadowsocks-218808/locations/us-central1/functions/testSecretManager
runtime: nodejs10
serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-43476143-b555-4cb2-8f6f-1b2d1952a2d7/42c4cda4-98a8-4994-a3be-d2203b9e646a.zip?GoogleAccessId=service-16536262744@gcf-admin-robot.iam.gserviceaccount.com&Expires=1596513795&Signature=kbLw5teN8EoYmj4fEweKKiIaakxcrhlUg2GGHV4jWJjvmeEfXePpRNOn9yz2zLn%2Fba0UqM9qdJMXujs5afBk%2BVBmywPEiptAZe2qgmldpr%2BsYejFu0woNgsPHVqtJ0NoWDo6W2dq4CuNNwO%2BaQ89mnhahUUQTInkJ55Y3wCIe9smk%2BqWtcvta3zICiToA7RQvPKY5MS6NViyj5mLxuJtDlTY9IKPL%2BqG6JAaQJSFYKYVgLyb6JfirXk8Q7%2FMvnHPpXPlhvsBLQksbF6jDPeefp2HyW4%2FSIQYprfpwKV3hlEIQyRQllz5J9yF83%2FxDPh%2BQPc5QmswKP5XAvYaszJPEw%3D%3D
status: ACTIVE
timeout: 60s
updateTime: '2020-08-04T03:34:32.665Z'
versionId: '2'

Тест:

gcloud functions call testSecretManager --data '{}'

Получена такая же ошибка, как и у вас:

error: |-
  Error: function terminated. Recommended action: inspect logs for termination reason. Details:
  7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/shadowsocks-218808/secrets/workflow/versions/latest' (or it may not exist).

решение:

Вы можете найти serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com в деталях развертывания облачной функции.

go в IAM & Admin веб-интерфейс, нажмите кнопку ADD ANOTHER ROLE, добавьте Secret Manager Secret Accessor роль для этой учетной записи службы.

enter image description here

Test again:

> gcloud functions call testSecretManager --data '{}'

executionId: 1tsatxl6fndw
result: OK

Чтение журналов для testSecretManager облачной функции:

gcloud functions logs read testSecretManager

Вы увидит журналы для секретной строки полезной нагрузки.

1 голос
/ 08 августа 2020

У меня была такая же проблема, и для ее решения мне просто пришлось:

  1. Найти учетную запись службы в разделе Общие моей облачной функции Google.

    Это выглядело например, <project-name>@appspot.gserviceaccount.com

  2. В IAM Admin добавьте Secret Manager Secret Accessor роль к этой учетной записи службы.

После этого все заработало!

0 голосов
/ 28 июля 2020

Немного поздно, но, возможно, этот ответ будет полезен будущим пользователям. Я столкнулся с таким же поведением только с Python. Я пробовал много вещей, но единственное, что сработало, - это создание новой учетной записи службы с нулевыми ролями (если я сразу предоставил ей роль secretmanager.secretAccessor, я получил ту же ошибку). Затем, когда создается пустая учетная запись службы, на вкладке IAM я нажимаю +Add, копирую свой пустой адрес учетной записи службы и ТОЛЬКО затем добавляю к ней роль secretmanager.secretAccessor. Затем я использую эту учетную запись как учетную запись, которая будет выполнять определенную функцию. Конечно, вам может потребоваться добавить другие роли в зависимости от того, для чего предназначена ваша функция sh.

...