【问题标题】:How to create resource level permissions for GCP service accounts如何为 GCP 服务帐号创建资源级权限
【发布时间】:2021-10-25 12:28:55
【问题描述】:

我想在 Google Cloud 上拥有一个只能将对象写入特定存储 Cloud Storage 存储分区的服务帐号。我已经使用部署管理器创建了服务帐户,现在尝试使用必要的绑定创建一个存储桶

def GenerateConfig(context):
    """Generate configuration for a cloud storage bucket for experiment data."""
    resources = []
    resources.append({
        'type': 'storage.v1.bucket',
        'name': 'mybucket',
        'properties': {
            'predefinedAcl': 'projectPrivate',
            'projection': 'full',
            'location': 'europe-west2',
            'storageClass': 'STANDARD',
            'bindings': {
                'role': 'roles/storage.objectCreator',
                'member': 'serviceAccount:my-service@my-project.iam.gserviceaccount.com',
                }
            }
        })
    return {'resources': resources}

如果我使用部署管理器创建此部署,我可以看到新存储桶,并且我可以看到与部署关联的存储桶具有绑定

member: serviceAccount:my-service@my-project.iam.gserviceaccount.com
role: roles/storage.objectCreator

但是,如果我使用此服务帐户将文件写入此云存储桶,则会失败并显示 403:

    "errors": [
      {
        "message": "my-service@my-project.iam.gserviceaccount.com does not have storage.objects.create access to the Google Cloud Storage object.",
        "domain": "global",
        "reason": "forbidden"
      }
    ]

如果我随后使用策略分析器查看此服务帐户具有哪些权限,则不会返回任何内容。 我误解了什么?是否无法创建只能访问某些存储桶的服务帐户,或者它必须有权访问项目中的所有存储桶?

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage service-accounts google-iam google-deployment-manager


    【解决方案1】:

    为了向服务帐户授予对特定存储桶的写入权限,您可以从 GCP shell 运行 following command:

    gsutil iam ch MEMBER_TYPE:MEMBER_NAME:IAM_ROLE gs://BUCKET_NAME
    

    在你的情况下,它会是这样的:

    MEMBER_TYPE="serviceAccount"
    MEMBER_NAME="service-account-name@project-id.iam.gserviceaccount.com"
    IAM_ROLE="roles/storage.objectCreator"
    BUCKET_NAME="your-bucket-name"
    
    gsutil iam ch $MEMBER_TYPE:$MEMBER_NAME:$IAM_ROLE gs://$BUCKET_NAME
    

    如果您想创建一个存储桶并同时分配上述角色,您可以执行以下步骤,考虑到this 和this:

    vm.yaml

    imports:
      - path: service-accounts.py
    resources:
    - type: storage.v1.bucket
      name: test-bucket
      properties:
        project: your-project
    

    服务帐户.py

    ​​>
    def GenerateConfig(context):
        project_id = context.env['project']
        service_account = context.properties['service-account']
    
        resources = [
            {
                'name': service_account,
                'type': 'iam.v1.serviceAccount',
                'properties': {
                    'accountId': service_account,
                    'displayName': service_account,
                    'projectId': project_id
                }
            },
            {
                'name': 'bind-iam-policy',
                'type': 'gcp-types/cloudresourcemanager-v1:virtual.projects.iamMemberBinding',
                'properties': {
                    'resource': storage.v1.bucket,
                    'role': 'roles/storage.objectCreator',
                    'member': 'serviceAccount:$(ref.' + service_account + '.email)'
                },
                'metadata': {
                    'dependsOn': [service_account]
                }
            }
        ]
    
        return {'resources': resources}
    

    然后运行 ​​gcloud deployment-manager 命令。

    【讨论】:

    • 我只想授予服务帐户对特定存储桶的写入权限。我真的很想避免给它读取权限。我想通过部署管理器而不是 UI 来执行此操作,因为我想为我的生产环境创建自动部署,而不是临时创建服务帐户。
    • 编辑了评论,基于“想要授予服务帐户对特定存储桶的写入权限。我真的想避免授予它读取权限”。告诉我这是否对你有用,如果没有,让我继续帮助你。
    • 这确实有效,但我想使用部署管理器解决问题。如果根本不可能这样做,那么您的答案可能是最好的解决方案。
    • 好的!正在努力。
    • 已编辑!请看一下,告诉我它是否对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 2022-01-23
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多