SDK Google Cloud Java avec Workload Identity?

Oct 08 2020

Essayer de savoir comment s'authentifier avec l'API de stockage à partir d'un cluster GKE.

Code:

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

getApplicationDefault() est documenté pour utiliser ces moyens pour s'authentifier avec l'API:

  1. Fichier d'informations d'identification indiqué par la variable d'environnement {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Identifiants fournis par la commande {@code gcloud auth application-default login} du SDK Google Cloud
  3. Identifiants intégrés à Google App Engine
  4. Identifiants intégrés à Google Cloud Shell
  5. Identifiants intégrés à Google Compute Engine

L'application utilise la fonctionnalité d'identité de la charge de travail GCP, de sorte que le compte de service d'application (dans le cluster) est annoté avec:

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

Maintenant, l'appel au compte de stockage échoue avec l'erreur suivante:

{
  "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."
}

Cela me fait penser que l'identité de la charge de travail ne fonctionne pas correctement. Je m'attends à recevoir un message d'erreur pour mon compte de service annoté et non celui par défaut.

Y a-t-il autre chose que j'aurais dû faire?

Réponses

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

L'annotation est fausse. Au lieu de:

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

ce doit être

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

Maintenant, le message d'erreur montre également que l'application utilise une identité de charge de travail:

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