Google Cloud: разрешения учетной записи службы

Задача: я хочу сохранить все журналы с моего локального компьютера в журналах Google.

Проблема, с которой я столкнулся, заключается в том, что я не могу создать учетную запись службы с правильными разрешениями. Даже если я дам разрешение владельцу, я все равно получаю ошибку «Я отказано в разрешении» (ACCESS_TOKEN - его токен из json-ключа учетной записи):

cat data.json | http POST 
"https://logging.googleapis.com/v2/entries:write"
Authorization:"Bearer $ACCESS_TOKEN"

Response:
    {
"error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

В настоящее время я установил:  введите описание изображения здесь , но он по-прежнему не работает.

Во время отладки я решил использовать личную учетную запись с таким типом доступа:  введите описание изображения здесь

И запрос с токеном из моей учетной записи работает отлично:

$ cat data.json | http POST 
"https://logging.googleapis.com/v2/entries:write"
Authorization:"Bearer `gcloud auth application-default print-access-token`"


HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
Cache-Control: private
Content-Encoding: gzip
Content-Type: application/json; charset=UTF-8
Date: Sun, 23 Dec 2018 21:38:05 GMT
Server: ESF
Transfer-Encoding: chunked
Vary: Origin
Vary: X-Origin
Vary: Referer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block

{}

Но если я использую экспортированный файл учетных данных stackdriver-station-1.json с приложением golang / nodejs, я получаю ошибку отказа в разрешении:

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

тот же пример с использованием консоли и ACCESS_TOKEN, созданного из экспортированного файла json:

$ cat data.json | http POST
"https://logging.googleapis.com/v2/entries:write"
Authorization:"Bearer $ACCESS_TOKEN"

HTTP/1.1 403 Forbidden
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
Cache-Control: private
Content-Encoding: gzip
Content-Type: application/json; charset=UTF-8
Date: Sun, 23 Dec 2018 22:39:51 GMT
Server: ESF
Transfer-Encoding: chunked
Vary: Origin
Vary: X-Origin
Vary: Referer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block

{
"error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

Любые предложения приветствуются! Мне кажется, что мне не хватает какой-то фундаментальной части разрешений в облаке Google. Например, мне нужно поставить галочку в облачном интерфейсе или что-то в этом роде.


person Vlad    schedule 23.12.2018    source источник
comment
Вы включаете много информации, которая не помогает. Однако вам необходимо отредактировать свой вопрос, чтобы исправить: 1) Не включать ссылки на внешние источники. Не включайте изображения. Включите всю информацию в текст вашего вопроса. 2) Включите программный код и покажите, как вы загружаете и используете учетные данные учетной записи службы. 3) Удалите те разделы вашего вопроса, которые работают. Это просто загромождает вопрос.   -  person John Hanley    schedule 24.12.2018
comment
Спасибо за предложение. cat data.json | http POST logging.googleapis.com/v2/entries:write Авторизация: $ ACCESS_TOKEN на предъявителя не работает, даже если у учетной записи есть разрешение владельца   -  person Vlad    schedule 24.12.2018
comment
Отредактировал мой вопрос, чтобы поставить проблему на первое место   -  person Vlad    schedule 24.12.2018
comment
У вас все еще есть изображения, нет исходного кода, откуда берется $ ACCESS_TOKEN и т. Д. Слишком много недостающих частей для вашей проблемы. Пожалуйста, перечитайте мой комментарий, если вам нужна помощь.   -  person John Hanley    schedule 24.12.2018
comment
Что ж, это проблема - чтобы объяснить, что такое ACCESS TOKEN и как я его получил, мне нужно записать всю эту дополнительную информацию.Поскольку некоторую часть конфигурации я сделал из веб-администратора, я включил это в виде изображений любая информация с машины, над которой я работаю, поэтому я сделал снимок экрана с тем, что получаю   -  person Vlad    schedule 24.12.2018
comment
Не забудьте показать код, который вы используете - вы не объясняете «как».   -  person Dan Cornilescu    schedule 24.12.2018


Ответы (2)


Я столкнулся с той же проблемой, и я пришел к выводу, что API стекового драйвера не поддерживает доступ только с помощью ключа API, хотя вы можете создать ключ API для нескольких ролей стекового драйвера.

Вам необходимо настроить учетную запись службы и использовать процесс OAuth. Это может быть сложно, когда токен доступа необходимо регулярно обновлять.

https://developers.google.com/identity/protocols/OAuth2ServiceAccount

person user2523216    schedule 07.02.2020

Если вы изучите документацию, вы сможете получить полезную информацию о требуемых ролях.

role / logging.viewer (средство просмотра журналов) предоставляет участникам доступ только для чтения ко всем функциям ведения журнала, за исключением разрешения на чтение личных журналов.

role / logging.privateLogViewer (средство просмотра личных журналов) предоставляет участникам разрешения, указанные в файле role / logging.viewer, а также разрешение на чтение личных журналов.

role / logging.logWriter (средство записи журналов) может быть предоставлен участникам, которые являются служебными учетными записями, и дает участникам достаточно разрешений для записи журналов. Эта роль не предоставляет доступ к средству просмотра журналов.

role / logging.configWriter (средство записи конфигурации журналов) предоставляет участникам разрешения на создание показателей на основе журналов и приемников экспорта. Чтобы использовать средство просмотра журналов, добавьте роль role / logging.viewer.

role / logging.admin (администратор ведения журнала) предоставляет участникам все разрешения, связанные с ведением журнала. Полный список этих разрешений см. В разделе Разрешения API. role / viewer (Project Viewer) предоставляет участникам те же разрешения, что и role / logging.viewer на уровне проекта. Обратите внимание, что предоставление этой роли применяет разрешения к большинству сервисов GCP на уровне проекта и не ограничивается использованием ведения журнала.

role / editor (Project Editor) предоставляет участникам те же разрешения, что и role / logging.viewer, плюс разрешения на запись записей в журналы, удаление журналов и создание показателей на основе журналов на уровне проекта. Роль не позволяет создавать приемники экспорта или читать частные журналы. Обратите внимание, что предоставление этой роли применяет разрешения к большинству сервисов GCP на уровне проекта и не ограничивается использованием ведения журнала.

Источник https://cloud.google.com/logging/docs/access-control

Исходя из этого, вы должны предоставить правильные разрешения для своей учетной записи службы.

Второй шаг, чтобы определить, как вы хотите авторизоваться. Например, вы можете использовать сервисный аккаунт JSON для создания и обновления токена с помощью специального инструмента Python.

Но в любом случае, если вам нужно писать журналы в Stackdriver, я предлагаю использовать Agent. Это лучший вариант, как правильно сбрасывать журналы.

https://cloud.google.com/logging/docs/agent/authorization

Если вам нужно вести журналы из вашего приложения, вы можете легко использовать библиотеку и авторизовать ее, используя ключ JSON, сгенерированный для конкретной учетной записи службы.

person Dmitriy Shamenko    schedule 24.12.2018
comment
Спасибо, Дмитрий. Да, спасибо, прочтите эту статью пару раз. Первая проблема - я не могу найти все эти разрешения в веб-интерфейсе, но я обнаружил, что пользовательский интерфейс и остальные интерфейсы для разрешений отличаются. Похоже, меня не хватало. Спасибо И все же я не понимаю - если я добавлю разрешение владельца, почему это не сработает? - person Vlad; 24.12.2018
comment
Об агенте - он жрет слишком много памяти (почти 300) но я нашел решение по ржавчине, которое обещает съесть в 5 раз меньше - person Vlad; 24.12.2018
comment
Агент довольно большой по своим целям. Я могу поделиться клиентом Python просто для записи. В противном случае у них есть примеры кода на веб-сайте документации. Более того, я только что проверил наименование ролей ibb.co/sJYGbS8 - person Dmitriy Shamenko; 24.12.2018
comment
Вы уверены, что у вас есть учетная запись службы? у меня он работает с учетной записью пользователя, но не со служебной. Будем рады взглянуть на ваше решение на Python, отправить мне письмо по электронной почте или поговорить здесь golang-ua.slack.com? - person Vlad; 25.12.2018
comment
Как-то странно - решил создать учетную запись службы, используя gcloud вместо веб-интерфейса, и тот отлично работает - person Vlad; 25.12.2018
comment
Как сказал Дмитрий, необходимо предоставить правильные права вашей учетной записи службы, чтобы разрешить ведение журнала, но, поскольку вы добавили разрешение владельца в свою учетную запись службы, она должна работать нормально. Из вашего последнего комментария я вижу, что вы, наконец, можете войти в учетную запись службы, создав ее из оболочки Google. - person Tzigan; 03.01.2019
comment
Поскольку я не уверен, что делает ваш код, я не могу воспроизвести его эффективно. Но я думаю, было бы интересно, если бы вы поделились какой-либо важной информацией, которая могла бы помочь сообществу в любом подобном случае. Если вы думаете, что это может быть проблема с консолью Google, я также предлагаю вам открыть общедоступную ошибку Google, чтобы они могли ее решить: issueetracker.google.com/issues/bugID - person Tzigan; 03.01.2019