Google Cloud Java SDK con Workload Identity?

Oct 08 2020

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:

  1. File delle credenziali a cui fa riferimento la variabile d'ambiente {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Credenziali fornite dal comando {@code gcloud auth application-default login} di Google Cloud SDK
  3. Credenziali integrate di Google App Engine
  4. Credenziali integrate di Google Cloud Shell
  5. 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

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

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