SDK Google Cloud Java avec Workload Identity?
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:
- Fichier d'informations d'identification indiqué par la variable d'environnement {@code GOOGLE_APPLICATION_CREDENTIALS}
- Identifiants fournis par la commande {@code gcloud auth application-default login} du SDK Google Cloud
- Identifiants intégrés à Google App Engine
- Identifiants intégrés à Google Cloud Shell
- 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
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