Как предоставить пользователям доступ только к одному экземпляру в Google Compute Engine?

Как предоставить пользователям доступ только к одному экземпляру в Google Compute Engine?

Я пытаюсь найти решение, чтобы предоставить внешнему исполнителю доступ к экземпляру в нашем проекте, но не ко всем ресурсам.

Я провел небольшое исследование и нашел два способа, как это сделать.

Во-первых, необходимо предоставить подрядчику закрытый ключ для доступа по SSH к выбранному экземпляру.

Но я хотел бы попробовать использовать другой метод, который заключается в назначении роли пользователя учетной записи службы для подрядчика.

Насколько я понимаю, с учетными записями служб. Они объявлены и как ресурс, и как идентификатор. Мне пришлось бы создать новый экземпляр под вновь созданной учетной записью службы с ограниченными определенными разрешениями.

[учетная запись службы] >>> разрешения >>> [экземпляры]

[пользователь] >>> роль пользователя учетной записи службы >>> [учетная запись службы]

поэтому я думаю, что роль пользователя учетной записи службы является своего рода прокси для учетной записи службы. Я попытался назначить разрешения учетной записи службы и назначил пользователя с ролью пользователя учетной записи службы. Я бы подумал, что после того, как это будет сделано, у пользователя будут разрешения, назначенные учетной записи службы. Но, к сожалению, это не так, и мне нужна помощь.

решение1

Использование закрытого ключа, как вы предложили, было бы идеальным решением, поскольку это единственный способ гарантировать, что ваш подрядчик не получит доступ к другим экземплярам или информации о статусе вашего проекта. Тем не менее, то, что вы описали (SSH в машину с использованием учетной записи службы)может быть сделано, и действительно,учетные записи служб являются одновременно и идентификатором, и ресурсом.

Если вы дадите пользователю Service Account Userроль для учетной записи службы с необходимыми разрешениями для SSH-подключения к машине, это позволит пользователю сделать именно это. Однако имейте в виду, что минимальный набор разрешений, который потребуется этой учетной записи службы для того, чтобы это работало, позволит учетной записи службы (и, следовательно, пользователю) подключаться по SSH к любому экземпляру Compute. Это само по себе является показателем того, что выполнение этого не даст вам той детализации, которая вам, кажется, нужна.

Для того чтобы задуманный вами сценарий стал возможным, вам необходимо сделать следующее:

  1. Создайте учетную запись службы и дайте ей Service Account Userроль и 4 детальных разрешения, compute.instances.get, compute.instances.setMetadata, compute.projects.get, и compute.zoneOperations.get(вероятно, вам следует создать пользовательскую роль для этих разрешений). Это можно сделать в разделе IAM и администрированиеКонсоль;
  2. Предоставьте пользователю какие-либо разрешения на проект черезКонсоль или gcloud. Я бы предложил отдать Compute Viewerроль;
  3. Попросите пользователяустановить Google Cloud SDKи инициализируют его с использованием своих учетных данных;
  4. Подключите пользователя по SSH к соответствующему экземпляру с помощью gcloud compute ssh SERVICE_ACCOUNT_USERNAME@INSTANCE_IP_OR_HOSTNAME --zone ZONE_OF_INSTANCE.

Я бы предложил пользователю подключаться по SSH к целевой машине через Cloud Shell, так как это позволит избежать необходимости выполнять шаг 3. Не забывайте также о правилах брандмауэра, поскольку публичные IP-адреса, назначенные Cloud Shell, похоже, не попадают в общие диапазоны публичных IP-адресов Google.

Не удивляйтесь, если увидите сообщение вроде Updating project ssh metadata...failed. Этого следовало ожидать, так как учетная запись службы имеет разрешения только на добавление ключей SSH в метаданные экземпляров.

Связанный контент