SDK do Google Cloud Java com identidade de carga de trabalho?

Oct 08 2020

Tentando descobrir como se autenticar com a API de armazenamento de dentro de um cluster GKE.

Código:

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

getApplicationDefault() está documentado para usar estes meios para autenticar com a API:

  1. Arquivo de credenciais apontado pela variável de ambiente {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Credenciais fornecidas pelo comando {@code gcloud auth application-default login} do Google Cloud SDK
  3. Credenciais integradas do Google App Engine
  4. Credenciais integradas do Google Cloud Shell
  5. Credenciais integradas do Google Compute Engine

O aplicativo está usando o recurso de identidade de carga de trabalho do GCP, portanto, a conta de serviço do aplicativo (dentro do cluster) é anotada com:

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

Agora, a chamada para a conta de armazenamento falha com o seguinte erro:

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

Isso me faz pensar que a identidade da carga de trabalho não está funcionando corretamente. Estou esperando receber uma mensagem de erro para minha conta de serviço anotada, e não a padrão.

Há mais alguma coisa que eu deveria estar fazendo?

Respostas

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

A anotação está errada. Ao invés de:

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

deve ser

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

Agora, a mensagem de erro também mostra que o aplicativo está usando uma identidade de carga de trabalho:

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