我正在尝试寻找一种解决方案,让外部工作人员可以访问我们项目中的实例,但不是所有资源。
我做了一些研究并发现了两种方法。
首先要向承包商提供一个私钥,以便通过 ssh 进入选定的实例。
但我想尝试使用另一种方法,即为承包商分配服务帐户用户角色。
据我了解,服务帐户既是资源又是身份。我必须在新建的服务帐户下创建一个具有有限定义权限的新实例。
[服务帐号] >>> 权限 >>> [实例]
[用户] >>> 服务帐户用户角色 >>> [服务帐户]
所以我认为服务帐户用户角色就像服务帐户的代理。我尝试为服务帐户分配权限,并为用户分配服务帐户用户角色。我认为完成此操作后,用户将拥有分配给服务帐户的权限。但不幸的是事实并非如此,我需要一些帮助。
答案1
使用您建议的私钥将是理想的解决方案,因为这是确保您的承包商无法访问其他实例或有关项目状态的信息的唯一方法。尽管如此,您所描述的(使用服务帐户通过 SSH 进入机器)可以做到确实如此,服务账户既是一种身份,又是一种资源。
如果您为用户授予Service Account User
服务帐户角色,并赋予其通过 SSH 连接计算机所需的权限,那么该用户就可以执行此操作。但请记住,此服务帐户所需的最低权限集将允许服务帐户(以及用户)通过 SSH 连接任何计算实例。仅凭这一点就表明,这样做不会给您带来您想要的粒度。
为了使您想象的场景成为可能,您需要执行以下操作:
- 创建服务帐户并为其赋予
Service Account User
角色和 4 个细粒度权限,compute.instances.get
、compute.instances.setMetadata
、compute.projects.get
和compute.zoneOperations.get
(您可能应该为这些权限创建自定义角色)。这可以在安慰; - 通过以下方式授予用户对项目的某种权限控制台或 gcloud。我建议赋予这个
Compute Viewer
角色; - 指导用户安装 Google Cloud SDK并使用他们的凭证对其进行初始化;
- 让用户使用 SSH 进入适当的实例
gcloud compute ssh SERVICE_ACCOUNT_USERNAME@INSTANCE_IP_OR_HOSTNAME --zone ZONE_OF_INSTANCE
。
我建议让用户通过 Cloud Shell 通过 SSH 连接到目标机器,因为这样可以完全避免执行第 3 步。不要忘记防火墙规则,因为分配给 Cloud Shell 的公共 IP 似乎不属于常见的 Google 公共 IP 范围。
如果您看到类似这样的消息,请不要感到惊讶Updating project ssh metadata...failed
。这是可以预料到的,因为服务帐户仅具有将 SSH 密钥添加到实例元数据中的权限。