5
0
Fork 0
mirror of https://github.com/hashicorp/vault-action.git synced 2025-11-07 15:16:56 +00:00

Introduce jwt Issued At

If time drift occurs between the identity provider and the Hashi Vault, authentication will fail.  This is resolved by introducing a param to specify the number of seconds in the past for the jwt issued date
This commit is contained in:
Keith Murry 2024-02-12 13:10:18 -06:00
parent 9f522b8598
commit 2c6158aeef
3 changed files with 11 additions and 4 deletions

View file

@ -232,7 +232,7 @@ with:
You can configure trust between your own OIDC Provider and Vault
with the JWT auth method. Provide a `role` & `jwtPrivateKey` parameters,
additionally you can pass `jwtKeyPassword` & `jwtTtl` parameters
additionally you can pass `jwtKeyPassword`, `jwtTtl`, & `jwtIat` parameters.
```yaml
with:
@ -243,6 +243,7 @@ with:
jwtPrivateKey: ${{ secrets.JWT_PRIVATE_KEY }}
jwtKeyPassword: ${{ secrets.JWT_KEY_PASS }}
jwtTtl: 3600 # 1 hour, default value
jwtIat: 60 # 1 min, default value. Negative int postdates
```
### Kubernetes

View file

@ -86,6 +86,10 @@ inputs:
description: 'Time in seconds, after which token expires'
required: false
default: 3600
jwtIat:
description: 'Number of seconds (int) to predate the token issued at (iat).'
required: false
default: 60
secretEncodingType:
description: 'The encoding type of the secret to decode. If not specified, the secret will not be decoded. Supported values: base64, hex, utf8'
required: false

View file

@ -32,12 +32,13 @@ async function retrieveToken(method, client) {
const privateKey = Buffer.from(privateKeyRaw, 'base64').toString();
const keyPassword = core.getInput('jwtKeyPassword', { required: false });
const tokenTtl = core.getInput('jwtTtl', { required: false }) || '3600'; // 1 hour
const tokenIat = core.getInput('jwtIat', { required: false }) || '60';
const githubAudience = core.getInput('jwtGithubAudience', { required: false });
if (!privateKey) {
jwt = await core.getIDToken(githubAudience)
} else {
jwt = generateJwt(privateKey, keyPassword, Number(tokenTtl));
jwt = generateJwt(privateKey, keyPassword, Number(tokenTtl), Number(tokenIat));
}
return await getClientToken(client, method, path, { jwt: jwt, role: role });
@ -79,15 +80,16 @@ async function retrieveToken(method, client) {
* @param {string} privateKey
* @param {string} keyPassword
* @param {number} ttl
* @param {number} iat
*/
function generateJwt(privateKey, keyPassword, ttl) {
function generateJwt(privateKey, keyPassword, ttl, iat) {
const alg = 'RS256';
const header = { alg: alg, typ: 'JWT' };
const now = rsasign.KJUR.jws.IntDate.getNow();
const payload = {
iss: 'vault-action',
iat: now,
nbf: now,
nbf: now - iat,
exp: now + ttl,
event: process.env.GITHUB_EVENT_NAME,
workflow: process.env.GITHUB_WORKFLOW,