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

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

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

Я создал секрет в веб-консоли, и имя, используемое в коде, совпадает с именем существующего секрета. На странице сведений об облачной функции указано, что учетная запись службы [email protected],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).

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


person Alex Meuer    schedule 18.06.2020    source источник
comment
Должно работать, дважды проверьте секретное имя и имя учетной записи службы, затем попробуйте удалить роль secretAccessor и добавить ее обратно. Если это не помогает, попробуйте повторно развернуть функцию.   -  person Emil Gi    schedule 18.06.2020
comment
На всякий случай: что вы используете в качестве PROJECT_NUMBER? Код мне нравится, и я думаю, что единственным дополнительным разрешением, которое я добавил в свой тестовый контейнер, был Secret Manager Secret Accessor. Для справки вот мой код, который определенно работает в моем тестовом контейнере: const dbURI = secret.readSecret (projects / tasklist-XXXXXX / secrets / dev-db-connectionstring / versions / latest) .then ((connectionString) = ›{ mongoose.connect (connectionString);});   -  person Ville Rinne    schedule 18.06.2020
comment
@VilleRinne Откуда ты tasklist-XXXXXX? У меня просто цифры, без букв; может я ошибся значением? (за исключением того, что это тот же путь, что указан на веб-странице секретов)   -  person Alex Meuer    schedule 18.06.2020
comment
Tasklist-XXXXXX - это просто полный идентификатор моего проекта. Поэтому, когда я создал проект, я ввел список задач в качестве имени, а Google добавил числа в конце, чтобы сделать его уникальным. Вы можете увидеть идентификаторы для каждого проекта в консоли, щелкнув для изменения проекта и используя gcloud.   -  person Ville Rinne    schedule 18.06.2020
comment
Это просто идентификатор проекта, в то время как в вашем случае вы используете номер проекта, это не имеет значения и должно нормально работать с обоими. @VilleRinne, пожалуйста, не размещайте идентификаторы проектов на общедоступных ресурсах, используйте заполнители.   -  person Emil Gi    schedule 18.06.2020
comment
Да, это тестовый проект, который будет удален в ближайшие дни, но вы правы.   -  person Ville Rinne    schedule 18.06.2020
comment
Хорошо, я вижу, что учетная запись службы действительно имеет роль секретного доступа, и код правильный. У меня самого нет полномочий IAM, поэтому мне придется обратиться к администратору, чтобы узнать, могут ли они обнаружить что-то неладное. Я дополню этот пост ответом, если решу.   -  person Alex Meuer    schedule 18.06.2020
comment
Вы пробовали удалить и добавить роль в сервисный аккаунт? Просто чтобы исключить эту возможность.   -  person Emil Gi    schedule 18.06.2020
comment
Учетная запись службы используется по умолчанию и никогда не удалялась (черт возьми, мы, вероятно, могли бы удалить некоторые из наших неиспользуемых учетных записей служб!). У него не было разрешений секретного менеджера до добавления роли, и они были после. Я поговорю с админом и попробую все равно.   -  person Alex Meuer    schedule 18.06.2020
comment
Я понял, что использую учетную запись службы поддержки клиентов в своем тестовом проекте, и дал ей права владельца. Так что, может быть, вы могли бы провести еще один тест с очень слабыми разрешениями, чтобы исключить, что вы чего-то не упускаете?   -  person Ville Rinne    schedule 18.06.2020
comment
И под учетной записью службы поддержки я, конечно, имел в виду обычай :-)   -  person Ville Rinne    schedule 18.06.2020
comment
Учетная запись службы только с этой ролью должна работать нормально. Можно попробовать создать новую учетную запись службы, назначить ей только эту роль, повторно развернуть свою функцию с этой учетной записью службы и повторить попытку. Может что-то не так с дефолтным.   -  person Emil Gi    schedule 18.06.2020
comment
Как вы развертываете функцию? В качестве секретного имени можно использовать как project_id, так и project_number.   -  person sethvargo    schedule 18.06.2020


Ответы (5)


Код облачной функции 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: [email protected]
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: [email protected] в деталях развертывания облачной функции.

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

введите описание изображения здесь

Протестируйте еще раз:

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

executionId: 1tsatxl6fndw
result: OK

Прочтите журналы testSecretManager облачной функции:

gcloud functions logs read testSecretManager

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

person slideshowp2    schedule 04.08.2020
comment
Тем, кто ищет сегодня, вам нужно перейти в раздел IAM & Admin ›IAM, а не в раздел« Учетные записи служб ». Потратил огромное количество времени, пытаясь добавить разрешения из раздела «Учетные записи служб» ... они действительно должны прояснить это. - person arao6; 12.10.2020
comment
@ arao6, вы должны ответить на этот вопрос своим комментарием. Ваш комментарий - правильный ответ. Спасибо! - person Abner Escócio; 18.03.2021
comment
Спасибо за совет. Я только что добавил роль Secret Manager Secret Accessor в Editor под своей учетной записью службы App Engine по умолчанию, и она отлично сработала. - person Steve Klock; 11.05.2021

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

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

    Выглядело как <project-name>@appspot.gserviceaccount.com

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

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

person binarytrails    schedule 08.08.2020
comment
‹Project-name› здесь было ключевым. Поскольку у меня там было много сервисных аккаунтов - person M-sAnNan; 07.09.2020

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

person niks    schedule 28.07.2020

У меня были аналогичные проблемы при работе с secretmanager и библиотекой python google-cloud-secretmanager (2.4). В частности, после создания секрета и присвоения моей служебной учетной записи роли secretmanager.secretAccessor для этого секрета (и ничего другого, следуя принципу наименьших привилегий), я получал следующую ошибку при попытке получить к нему доступ:

details = "Permission 'secretmanager.versions.access' denied for resource 'projects/projectid/secrets/keyname/versions/latest' (or it may not exist)."

Я мог заставить его работать, только добавив роль secretmanager.viewer на уровне проекта, которая, насколько я могу судить, не описана в документация.

person Pascal Delange    schedule 30.04.2021

У меня была аналогичная проблема с использованием terraform под gitlab. Я должен добавить две авторизации к учетной записи службы, которая запускает конвейер:

resource "google_project_iam_policy" "gitlab" {
  project     = "secret_owner_project_id"
  policy_data = data.google_iam_policy.iam.policy_data
}

data "google_iam_policy" "iam" {
  binding {
    role = "roles/secretmanager.secretAccessor"
    members = [
      "serviceAccount:[email protected]",
    ]
  }
  binding {
    role = "roles/viewer"
    members = [
      "serviceAccount:[email protected]",
    ]
  }
}
person Samuel    schedule 17.06.2021