首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >签名URL密钥管理

签名URL密钥管理
EN

Security用户
提问于 2022-02-12 08:45:47
回答 1查看 106关注 0票数 -1

背景

我希望有一个云存储桶,不能公开访问图像。然后,我的计划是在网站上签署任何图片URL,在用户加载页面时授权它一段短时间(~30秒)。这将适用于运行在App (标准环境)上的图像主机样式站点。

看起来,这样做的方法是获取服务帐户的私钥,并使用它对每个URL进行签名。在应用程序中嵌入密钥时,我有一个最初的犹豫,因为我不理解它能做什么或围绕它的最佳实践的含义。

问题

  1. 如果服务帐户密钥泄漏,攻击者可以使用它做什么?
  2. 在应用程序中嵌入它的最佳方法是什么?我正在考虑app.yaml中的一个环境变量,这样它不是在源代码管理中,而是在应用程序中部署的。
  3. 有办法绕过嵌入密钥,因为这是在App上吗?我在Golang构建它,如果有什么API,我可以在那里访问。(看起来,V4API将使用应用程序实例化的凭据,所以这可能就是这里的答案。)
  4. 对于签名URL和云存储,有什么通用的最佳实践吗?例如,是否有一种方法可以使用只具有对存储桶的读取访问权限的密钥?
EN

回答 1

Security用户

发布于 2022-03-16 02:43:53

这里的最佳实践似乎是使用client.Bucket(bucket).SignedURL(object, opts) API。

代码语言:javascript
复制
func storageSignUrl(object string) (string, error) {
    ctx := context.Background()
    client, err := storage.NewClient(ctx)
    if err != nil {
        return "", err
    }
    defer client.Close()

    opts := &storage.SignedURLOptions{
        Scheme:  storage.SigningSchemeV4,
        Method:  "GET",
        Expires: time.Now().Add(15 * time.Second),
    }

    url, err := client.Bucket(bucket).SignedURL(object, opts)
    if err != nil {
        return "", err
    }

    return url, nil
}

如果没有提供密钥,这将默认为运行AppEngine的帐户。我相信您还必须给出Service Account Token Creator在IAM中的角色,并启用IAM,这将在您第一次访问这个网址时提示您。

这避免了在源变量或环境变量中嵌入服务帐户密钥。如果必须将机密(例如DB密码)传递给应用程序,则可以使用秘密管理器。我的DB密码目前在一个环境变量中,我有一张可以将其迁移到机密管理器的票据。

我认为这个解决方案将适用于标准或灵活的环境。

票数 -1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/259543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档