¿SDK de Google Cloud Java con Workload Identity?

Oct 08 2020

Intentando averiguar cómo autenticarse con la API de almacenamiento desde un clúster de GKE.

Código:

Storage storage = StorageOptions.newBuilder()
  .setCredentials(ServiceAccountCredentials.getApplicationDefault())
  .setProjectId(gcpProjectId)
  .build().getService();

getApplicationDefault() está documentado para utilizar estos medios para autenticarse con la API:

  1. Archivo de credenciales al que apunta la variable de entorno {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Credenciales proporcionadas por el comando {@code gcloud auth application-default login} del SDK de Google Cloud
  3. Credenciales integradas de Google App Engine
  4. Credenciales integradas de Google Cloud Shell
  5. Credenciales integradas de Google Compute Engine

La aplicación usa la función de identidad de carga de trabajo de GCP, por lo que la cuenta de servicio de la aplicación (en el clúster) está anotada con:

serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]

Ahora la llamada a la cuenta de almacenamiento falla con el siguiente error:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object.",
    "reason" : "forbidden"
  } ],
  "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object."
}

Esto me hace pensar que la identidad de la carga de trabajo no funciona correctamente. Espero recibir un mensaje de error para mi cuenta de servicio anotada y no para la predeterminada.

¿Hay algo más que debería haber estado haciendo?

Respuestas

MoritzSchmitzv.Hülst Oct 09 2020 at 15:47

La anotación es incorrecta. En vez de:

serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]

debe ser

iam.gke.io/gcp-service-account: [email protected]

Ahora, el mensaje de error también muestra que la aplicación está usando una identidad de carga de trabajo:

java.io.IOException: Unexpected Error code 403 trying to get security access token from Compute Engine metadata for the default service account: Unable to generate access token; IAM returned 403 Forbidden: The caller does not have permission
This error could be caused by a missing IAM policy binding on the target IAM service account.
For more information, refer to the Workload Identity documentation:
    https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#creating_a_relationship_between_ksas_and_gsas