Google Cloud Java SDK con Workload Identity?
Cercando di capire come autenticarsi con l'API di archiviazione da un cluster GKE.
Codice:
Storage storage = StorageOptions.newBuilder()
.setCredentials(ServiceAccountCredentials.getApplicationDefault())
.setProjectId(gcpProjectId)
.build().getService();
getApplicationDefault() è documentato per utilizzare questi mezzi per autenticarsi con l'API:
- File delle credenziali a cui fa riferimento la variabile d'ambiente {@code GOOGLE_APPLICATION_CREDENTIALS}
- Credenziali fornite dal comando {@code gcloud auth application-default login} di Google Cloud SDK
- Credenziali integrate di Google App Engine
- Credenziali integrate di Google Cloud Shell
- Credenziali integrate di Google Compute Engine
L'applicazione utilizza la funzione di identità del carico di lavoro GCP, quindi l'account di servizio dell'applicazione (nel cluster) è annotato con:
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
Ora la chiamata all'account di archiviazione non riesce con il seguente errore:
{
"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."
}
Questo mi fa pensare che l'identità del carico di lavoro non funzioni correttamente. Mi aspetto di ricevere un messaggio di errore per il mio account di servizio annotato e non per quello predefinito.
C'è qualcos'altro che avrei dovuto fare?
Risposte
L'annotazione è sbagliata. Invece di:
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
deve essere
iam.gke.io/gcp-service-account: [email protected]
Ora il messaggio di errore mostra anche che l'app utilizza un'identità del carico di lavoro:
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