我希望有一个云存储桶,不能公开访问图像。然后,我的计划是在网站上签署任何图片URL,在用户加载页面时授权它一段短时间(~30秒)。这将适用于运行在App (标准环境)上的图像主机样式站点。
看起来,这样做的方法是获取服务帐户的私钥,并使用它对每个URL进行签名。在应用程序中嵌入密钥时,我有一个最初的犹豫,因为我不理解它能做什么或围绕它的最佳实践的含义。
app.yaml中的一个环境变量,这样它不是在源代码管理中,而是在应用程序中部署的。发布于 2022-03-16 02:43:53
这里的最佳实践似乎是使用client.Bucket(bucket).SignedURL(object, opts) API。
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密码目前在一个环境变量中,我有一张可以将其迁移到机密管理器的票据。
我认为这个解决方案将适用于标准或灵活的环境。
https://security.stackexchange.com/questions/259543
复制相似问题