谷歌云:服务帐户权限

时间:2018-12-23 22:46:25

标签: google-cloud-platform cloud devops gcloud google-cloud-iam

任务:我想将所有日志从本地计算机存储到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"
  }
}

当前,我已设置:enter image description here,但仍无法正常工作。

在调试时,我决定使用具有这种访问权限的个人帐户: enter image description here

从我的帐户中请求带有令牌的请求非常正常:

$ 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

{}

但是,如果我在golang / nodejs应用中使用导出的stackdriver-station-1.json凭证文件,则会收到权限被拒绝的错误:

enter image description here

使用控制台和从导出的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"
  }
}

欢迎提出任何建议!对我来说,似乎我缺少了Google云权限的某些基本部分。就像我需要在云界面中放置一些复选标记或类似的标记。

2 个答案:

答案 0 :(得分:0)

如果要阅读文档,则可以获得有关所需角色的有用信息。

  

roles / logging.viewer(日志查看器)为成员提供对日志记录所有功能的只读访问权限,但读取私有日志的权限除外。

     

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

     可以将

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

     

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

     

roles / logging.admin(日志记录管理员)授予成员与日志记录相关的所有权限。有关这些权限的完整列表,请参见API权限。   角色/查看器(Project Viewer)在项目级别授予成员与role / logging.viewer相同的权限。请注意,授予此角色会将权限应用于项目级别的大多数GCP服务,而不仅限于使用日志记录。

     

角色/编辑器(项目编辑器)为成员提供与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密钥对其进行授权。

答案 1 :(得分:0)

我面临着同样的问题,我的结论是,即使您可以为多个stackdriver角色创建一个API Key,stackdriver API也并不仅支持通过API Key进行访问。

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

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