How to impersonate a Google cloud service account from another user account
Let’s say we’ve a cloud run function.
The service account joe-runner in a big corp project called big-corp should be allowed to invoke the cloud run function.
Our cloud run function is in a different project (mwco).
How can we test this from our user account?
First, we need to make sure that the service account
has the roles/run.invoker role on the cloud run function.
Via terraform, we can do this:
resource "google_cloud_run_v2_service_iam_member" "big_corp_invoker" {
location = google_cloudfunctions2_function.default.location
name = google_cloudfunctions2_function.default.name
role = "roles/run.invoker"
member = "serviceAccount:joe-runner@big-corp.iam.gserviceaccount.com"
depends_on = [google_cloudfunctions2_function.default]
}Or via gcloud cli:
gcloud run services add-iam-policy-binding my-cloud-run-function \
--member="serviceAccount:serviceAccount:joe-runner@big-corp.iam.gserviceaccount.com" \
--role="roles/run.invoker" \
--region=eu-west3 \
--project=mwcoMake sure that the user account that wants to impersonate the service account
has the roles/iam.serviceAccountTokenCreator role on the service account.
gcloud projects add-iam-policy-binding big-corp \
--member=user:gorilla.moe@mistweaverco.com \
--role='roles/iam.serviceAccountTokenCreator'And now, you want to grant a specific service account access to invoke the cloud run.
gcloud iam service-accounts \
add-iam-policy-binding \
joe-runner@big-corp.iam.gserviceaccount.com \
--member=user:gorilla.moe@mistweaverco.com \
--role='roles/iam.serviceAccountTokenCreator' \
--project=big-corpFinally, to get a token that impersonates the service account, and can be used to invoke the cloud run function:
gcloud auth print-access-token \
--impersonate-service-account=joe-runner@big-corp.iam.gserviceaccount.comThis will return an access token that you can use to invoke the cloud run function
export GCP_BEARER_TOKEN=$(gcloud auth print-access-token \
--impersonate-service-account=joe-runner@big-corp.iam.gserviceaccount.com)
if [ -z "$GCP_BEARER_TOKEN" ]; then
echo "Failed to get GCP bearer token"
exit 1
else
curl -H "Authorization: Bearer $GCP_BEARER_TOKEN" \\
https://my-cloud-run-function-eu-west3.a.run.app/
fi