问题描述
正在制作一些机器,其中有一个部分是将相机捕获的图像上传到Google Cloud Storage。为了实现这个目的,用户已经完成了以下步骤:
1. 为每台机器创建了一个服务账号。
2. 创建了一个自定义角色,并赋予以下权限:
storage.objects.create
storage.buckets.get
storage.objects.get
- 将该角色应用到相应的服务账号上。
- 下载了JSON凭据密钥文件,并在Python脚本中使用该文件(在其中指定了存储桶名称)来上传图像到GCP存储。
用户想知道这种做法是否高效和安全,考虑到每个月只发货2-3台机器。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据您的描述,您的方法是有效和安全的。为每台机器使用一个服务账号是一个好主意,因为如果机器被入侵,您可以删除服务账号密钥。
您可以使用Google APIs或gcloud cli来完全自动化生成凭据密钥文件的过程。
最佳实践是定期更换(重新发行)凭据密钥文件。这是为了防止它们在您没有注意到的情况下被意外泄露。如果您每个月都撤销密钥并发行新的密钥,那么它会在一定程度上限制总体损害。
如果您更换密钥,则会面临密钥分发问题。如何安全地将新的凭据密钥文件分发到过去发货的机器上?您可以在每个主机上使用GnuPG创建一个公钥-私钥对。每个月,您可以运行一个脚本,为每台机器生成一个新的凭据密钥文件,使用该机器的公共GPG密钥进行加密,然后删除旧的服务账号密钥。
将图像推送到存储桶的脚本必须定期“回家”,以收集新的GPG加密的凭据密钥文件。然后,它可以使用自己的私钥进行解密。一种方法是将加密的密钥放入一个不同的存储桶中。创建一个只能读取该存储桶的单个服务账号。为该服务账号创建一个单独的凭据密钥文件,将其安装到每台机器上。该密钥只能用于收集只能在正确的主机上解密的加密密钥。
方案2
使用脚本或工具来管理密钥的生成和分发可能会增加复杂性。请确保密钥的安全存储和传输。
另一种方法是使用脚本或工具来控制凭据密钥文件的生成和分发。您可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。