security - 你能限制谷歌云 API 凭证的访问吗
问题描述
可以为 Google API 凭据设置限制,以限制 API 密钥或令牌对特定电子表格或文件夹的访问,因此这些凭据无法访问帐户的所有信息,而只能访问指定的文件.
解决方案
当然!
Google Cloud Platform 拥有强大的工具来管理对各种事物的访问,包括 API 凭据访问。
GCP IAM - 云权限和访问
您可以创建云服务以使用您的密钥发送响应,仅授权某些服务接收/请求密钥。
这是GCP IAM 文档。通过前端云控制台或命令行工具按照他们的说明为您的 api 密钥服务设置策略。
以下是您将为 IAM 做的事情的要点:
- 为您的项目授权各种 google api
- 创建一个服务帐户,例如
my-api-key@see-the-docs-for-google-service-domain
- 对于需要服务密钥的每个应用程序,创建另一个服务帐户,即
my-app@see-the-docs-for...
- 为您为 api 密钥服务创建的服务帐户提供您选择的访问级别/权限的任何应用服务帐户
- 您正在授权每个应用程序访问 api-key-service
- 部署一个简单的 Flask 服务以使用您的 api-key-service 帐户发送您的 api-key
- 访问您的应用程序中已获得自己的 IAM 权限的 api 凭证
- 请记住,您在第4步中授权了您的应用
在磁盘上
对于存储在磁盘上的凭据,最好在应用程序中按需对其进行加密/解密。
看到这个答案。如果您加密您的密钥,请继续并添加到版本控制。否则,避免。
Secrets Manager 或 Berglas
但是,我建议您使用开源Berglas工具或 Google 的托管Secrets产品。本质上,您将向秘密管理器提供您的 api 密钥,存储它,然后在必要时在应用程序内或加载时获取它。
改编自 Google Cloud 文档,几乎是逐字记录:
# Import the Secret Manager client library.
from google.cloud import secretmanager_v1beta1 as sm
# GCP project in which to store secrets in Secret Manager.
project_id = 'YOUR_PROJECT_ID'
# ID of the secret to create.
secret_id = 'YOUR_SECRET_ID'
# Create the Secret Manager client.
client = sm.SecretManagerServiceClient()
# Build the parent name from the project.
parent = client.project_path(project_id)
# Create the parent secret
secret = client.create_secret(parent, secret_id, {
'replication': {
'automatic': {},
},
})
# Add the api key
version = client.add_secret_version(secret.name, {'data': b'my-google-api-credentials'})
# Access the api key
response = client.access_secret_version(version.name)
# Now you have your decoded api credentials you can use for authentication
payload = response.payload.data.decode('UTF-8')
我更改了上面的一些评论,但请务必查看 Google 的文档和他们的github 示例。
如果您更喜欢冒险,Berglas 库非常棒,我通过其本地 Go 客户端和部署服务中的 docker 映像直接在多个项目中使用它。
推荐阅读
- python - 如何在 yield 调用函数中防止或捕获 StopIteration 异常?
- arrays - 在 Selenium 中使用 TestNG DataProviders 读取包含“用户名”和“密码”的 JSON 文件时出现错误
- typescript - 如何使用 graphql schema.json 为 graphql 类型生成 typescript 接口而不进行操作?
- typeorm - 我们如何将 TypeORM ViewEntity 的 ViewColumn 配置为 JSON 类型?
- python - 用 Python 编写一个程序来检查一个数字是否是回文
- python - 在 django 中注册新用户后自动创建配置文件时出现问题,错误显示此“管理器”对象没有“已创建”属性
- terraform - Terraform比较键两个不同的地图并复制值
- javascript - 如何解决“断言要求调用目标中的每个名称都使用显式类型 annotation.ts(2775) 声明”?
- java - 返回字符串中的字符,返回辅音问题
- python - 尽管有合适的版本可用,但“找不到满足要求的版本”使用 Pip 安装组件