外部ワーカーにプロジェクト内のすべてのリソースではなくインスタンスへのアクセスを提供するソリューションを探しています。
調査した結果、これを行う方法が 2 つ見つかりました。
まず、選択したインスタンスに SSH 接続するための秘密鍵を請負業者に提供します。
しかし、請負業者にサービス アカウント ユーザー ロールを割り当てるという別の方法を試してみたいと思います。
サービス アカウントについて私が理解していることは、リソースと ID の両方として宣言されているということです。定義された権限が制限された、新しく作成されたサービス アカウントの下に新しいインスタンスを作成する必要があります。
[サービス アカウント] >>> 権限 >>> [インスタンス]
[ユーザー] >>> サービス アカウント ユーザー ロール >>> [サービス アカウント]
したがって、サービス アカウント ユーザー ロールは、サービス アカウントのプロキシのようなものだと考えています。サービス アカウントに権限を割り当て、サービス アカウント ユーザー ロールを持つユーザーを割り当てようとしました。これを実行すると、ユーザーにサービス アカウントに割り当てられた権限が付与されると思います。しかし、残念ながらそうではありません。支援をお願いします。
答え1
あなたが提案したように秘密鍵を使用することが、ここでは理想的な解決策です。それが、請負業者が他のインスタンスやプロジェクトのステータスに関する情報にアクセスできないようにする唯一の方法だからです。とはいえ、あなたが説明したこと(サービスアカウントを使用してマシンにSSH接続する)できる、 本当に、サービスアカウントはアイデンティティとリソースの両方である。
マシンに SSH 接続するために必要な権限を持つサービス アカウントのロールをユーザーに付与するとService Account User
、ユーザーはまさにその操作を実行できるようになります。ただし、このサービス アカウントがこれを機能させるために必要な最小限の権限セットでは、サービス アカウント (および結果的にユーザーも) が任意の Compute インスタンスに SSH 接続できるようになることに注意してください。これだけでも、これを行うと必要な粒度が得られないことがわかります。
あなたが思い描いたシナリオを実現するには、次のことを行う必要があります。
- サービスアカウントを作成し、
Service Account User
ロールと4つの詳細な権限(、、、compute.instances.get
)を付与します(これらの権限にはカスタムロールを作成する必要があります)。これは、IAMと管理セクションで行うことができます。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
。
手順 3 を実行する必要を完全に回避するために、ユーザーに Cloud Shell 経由でターゲット マシンに SSH 接続してもらうことをお勧めします。Cloud Shell に割り当てられたパブリック IP は一般的な Google パブリック IP 範囲に該当しないと思われるため、ファイアウォール ルールも忘れないでください。
次のようなメッセージが表示されても驚かないでくださいUpdating project ssh metadata...failed
。サービス アカウントにはインスタンスのメタデータに SSH キーを追加する権限しかないため、これは予想される結果です。