0

任务:我想将本地计算机上的所有日志存储到谷歌日志中。

我面临的问题是我无法创建具有正确权限的服务帐户。即使我会给所有者权限,仍然会得到我的权限被拒绝错误(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 应用程序一起使用,我将收到权限被拒绝错误:

在此处输入图像描述

使用控制台和从导出的 json 文件生成的 ACCESS_TOKEN 的相同示例:

$ 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"
  }
}

欢迎任何建议!对我来说,似乎我缺少谷歌云权限的一些基本部分。就像我需要在云界面或类似的东西中打上一些复选标记。

4

2 回答 2

0

我面临同样的问题,我的结论是,即使您可以为多个堆栈驱动程序角色创建 API 密钥,堆栈驱动程序 API 也不支持仅使用 API 密钥进行访问。

您需要设置服务帐户并使用 OAuth 流程。当访问令牌需要定期更新时,这可能会很棘手。

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

于 2020-02-07T15:37:17.373 回答
-1

如果您浏览文档,您可以获得有关所需角色的有用信息。

roles/logging.viewer (Logs Viewer)授予成员对 Logging 的所有功能的只读访问权限,但读取私有日志的权限除外。

roles/logging.privateLogViewer (Private Logs Viewer)为成员提供在 roles/logging.viewer 中找到的权限,以及读取私有日志的权限。

roles/logging.logWriter (Logs Writer)可以授予服务帐户成员,并为成员提供足够的权限来写入日志。此角色不授予对日志查看器的访问权限。

roles/logging.configWriter(日志配置编写器)授予成员创建基于日志的指标和导出接收器的权限。要使用日志查看器,请添加角色/logging.viewer 角色。

roles/logging.admin (Logging Admin)为成员提供与 Logging 相关的所有权限。有关这些权限的完整列表,请参阅 API 权限。roles/viewer (Project Viewer) 赋予成员与项目级别的角色/logging.viewer 相同的权限。请注意,授予此角色会将权限应用于项目级别的大多数 GCP 服务,而不仅限于使用 Logging。

角色/编辑器(项目编辑器)为成员提供与角色/记录查看器相同的权限,以及在项目级别写入日志条目、删除日志和创建基于日志的指标的权限。该角色不允许您创建导出接收器或读取私有日志。请注意,授予此角色会将权限应用于项目级别的大多数 GCP 服务,而不仅限于使用 Logging。

来源https://cloud.google.com/logging/docs/access-control

基于此,您应该为您的服务帐户授予正确的权限。

第二步定义你想如何授权。例如,您可以使用服务帐户 JSON 使用自定义 python 工具创建和刷新令牌。

但无论如何,如果您需要将日志写入 Stackdriver,我的建议是使用 Agent。这是如何以正确方式删除日志的最佳选择。

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

如果您需要从应用程序编写日志,您可以轻松地使用库并使用为特定服务帐户生成的 JSON 密钥对其进行授权。

于 2018-12-24T05:31:14.347 回答