Skip to content
This repository was archived by the owner on Jun 19, 2025. It is now read-only.

Commit 2e4e7be

Browse files
authored
Re-read JWT file for every authentication (#491)
* Re-read JWT file for every authentication * fix lint issues * fix unit test
1 parent 60e5ae2 commit 2e4e7be

File tree

7 files changed

+35
-24
lines changed

7 files changed

+35
-24
lines changed

cmd/kes/identity.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -500,15 +500,15 @@ func infoIdentityCmd(args []string) {
500500
cli.Fatal(err)
501501
}
502502
year, month, day := info.CreatedAt.Date()
503-
hour, min, sec := info.CreatedAt.Clock()
503+
hour, minute, sec := info.CreatedAt.Clock()
504504

505505
fmt.Println(
506506
faint.Render(fmt.Sprintf("%-11s", "Identity")),
507507
identityStyle.Render(info.Identity.String()),
508508
)
509509
fmt.Println(
510510
faint.Render(fmt.Sprintf("%-11s", "Created At")),
511-
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec),
511+
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, sec),
512512
)
513513
if info.IsAdmin {
514514
fmt.Println(faint.Render(fmt.Sprintf("%-11s", "Role")), "Admin")
@@ -520,13 +520,13 @@ func infoIdentityCmd(args []string) {
520520
}
521521
if info.Policy != "" {
522522
year, month, day := policy.CreatedAt.Date()
523-
hour, min, sec := policy.CreatedAt.Clock()
523+
hour, minute, sec := policy.CreatedAt.Clock()
524524

525525
fmt.Println()
526526
fmt.Println(faint.Render(fmt.Sprintf("%-11s", "Policy")), policyStyle.Render(info.Policy))
527527
fmt.Println(
528528
faint.Render(fmt.Sprintf("%-11s", "Created At")),
529-
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec),
529+
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, sec),
530530
)
531531
if len(policy.Allow) > 0 {
532532
fmt.Println(faint.Render(fmt.Sprintf("%-11s", "Allow")))
@@ -547,7 +547,7 @@ func infoIdentityCmd(args []string) {
547547
cli.Fatal(err)
548548
}
549549
year, month, day := info.CreatedAt.Date()
550-
hour, min, sec := info.CreatedAt.Clock()
550+
hour, minute, sec := info.CreatedAt.Clock()
551551

552552
fmt.Println(
553553
faint.Render(fmt.Sprintf("%-11s", "Identity")),
@@ -558,7 +558,7 @@ func infoIdentityCmd(args []string) {
558558
}
559559
fmt.Println(
560560
faint.Render(fmt.Sprintf("%-11s", "Created At")),
561-
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec),
561+
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, sec),
562562
)
563563
if info.IsAdmin {
564564
fmt.Println(faint.Render(fmt.Sprintf("%-11s", "Role")), "Admin")

cmd/kes/key.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,12 @@ func describeKeyCmd(args []string) {
251251
}
252252

253253
year, month, day := info.CreatedAt.Date()
254-
hour, min, sec := info.CreatedAt.Clock()
254+
hour, minute, sec := info.CreatedAt.Clock()
255255

256256
buf := &strings.Builder{}
257257
fmt.Fprintf(buf, "%-11s %s\n", "Name", info.Name)
258258
fmt.Fprintf(buf, "%-11s %s\n", "Algorithm", info.Algorithm)
259-
fmt.Fprintf(buf, "%-11s %04d-%02d-%02d %02d:%02d:%02d\n", "Date", year, month, day, hour, min, sec)
259+
fmt.Fprintf(buf, "%-11s %04d-%02d-%02d %02d:%02d:%02d\n", "Date", year, month, day, hour, minute, sec)
260260
fmt.Fprintf(buf, "%-11s %s", "Owner", info.CreatedBy)
261261
fmt.Print(buf)
262262
}

cmd/kes/log.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,11 @@ func printAuditLog(stream *kes.AuditStream) {
135135
for stream.Next() {
136136
event := stream.Event()
137137
var (
138-
hour, min, sec = event.Timestamp.Clock()
139-
status = strconv.Itoa(event.StatusCode)
140-
identity = identityStyle.Render(event.ClientIdentity.String())
141-
apiPath = apiStyle.Render(event.APIPath)
142-
latency = event.ResponseTime
138+
hour, minute, sec = event.Timestamp.Clock()
139+
status = strconv.Itoa(event.StatusCode)
140+
identity = identityStyle.Render(event.ClientIdentity.String())
141+
apiPath = apiStyle.Render(event.APIPath)
142+
latency = event.ResponseTime
143143
)
144144

145145
if event.StatusCode == http.StatusOK {
@@ -167,7 +167,7 @@ func printAuditLog(stream *kes.AuditStream) {
167167
}
168168
ipAddr = ipStyle.Render(ipAddr)
169169

170-
fmt.Printf(format, hour, min, sec, status, identity, ipAddr, apiPath, latency)
170+
fmt.Printf(format, hour, minute, sec, status, identity, ipAddr, apiPath, latency)
171171
}
172172
if err := stream.Close(); err != nil {
173173
if errors.Is(err, context.Canceled) {

cmd/kes/policy.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,10 @@ func infoPolicyCmd(args []string) {
224224
fmt.Println(faint.Render(fmt.Sprintf("%-11s", "Name")), policyStyle.Render(name))
225225
if !info.CreatedAt.IsZero() {
226226
year, month, day := info.CreatedAt.Local().Date()
227-
hour, min, sec := info.CreatedAt.Local().Clock()
227+
hour, minute, sec := info.CreatedAt.Local().Clock()
228228
fmt.Println(
229229
faint.Render(fmt.Sprintf("%-11s", "Date")),
230-
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec),
230+
fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, sec),
231231
)
232232
}
233233
if !info.CreatedBy.IsUnknown() {
@@ -335,8 +335,8 @@ func showPolicyCmd(args []string) {
335335
header := tui.NewStyle().Bold(true).Foreground(Cyan)
336336
if !policy.CreatedAt.IsZero() {
337337
year, month, day := policy.CreatedAt.Local().Date()
338-
hour, min, sec := policy.CreatedAt.Local().Clock()
339-
fmt.Printf("\n%s %04d-%02d-%02d %02d:%02d:%02d\n", header.Render("Created at:"), year, month, day, hour, min, sec)
338+
hour, minute, sec := policy.CreatedAt.Local().Clock()
339+
fmt.Printf("\n%s %04d-%02d-%02d %02d:%02d:%02d\n", header.Render("Created at:"), year, month, day, hour, minute, sec)
340340
}
341341
if !policy.CreatedBy.IsUnknown() {
342342
fmt.Println(header.Render("Created by:"), policy.CreatedBy)

internal/keystore/vault/client.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ package vault
77
import (
88
"context"
99
"errors"
10+
"os"
1011
"path"
12+
"strings"
1113
"sync/atomic"
1214
"time"
1315

@@ -104,9 +106,18 @@ func (c *client) AuthenticateWithK8S(login *Kubernetes) authFunc {
104106
client = client.WithNamespace(login.Namespace)
105107
}
106108

109+
jwt := login.JWT
110+
if strings.ContainsRune(jwt, '/') || strings.ContainsRune(jwt, os.PathSeparator) {
111+
jwtBytes, err := os.ReadFile(jwt)
112+
if err != nil {
113+
return nil, err
114+
}
115+
jwt = string(jwtBytes)
116+
}
117+
107118
secret, err := client.Logical().WriteWithContext(ctx, path.Join("auth", login.Engine, "login"), map[string]interface{}{
108119
"role": login.Role,
109-
"jwt": login.JWT,
120+
"jwt": jwt,
110121
})
111122
if secret == nil && err == nil {
112123
// The Vault SDK eventually returns no error but also no

kesconf/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,11 +447,11 @@ func ymlToKeyStore(y *ymlFile) (KeyStore, error) {
447447
// We always check for '/' and the OS-specific one make cover cases where
448448
// a path is specified using '/' but the underlying OS is e.g. windows.
449449
if jwt := y.KeyStore.Vault.Kubernetes.JWT.Value; strings.ContainsRune(jwt, '/') || strings.ContainsRune(jwt, os.PathSeparator) {
450-
b, err := os.ReadFile(y.KeyStore.Vault.Kubernetes.JWT.Value)
450+
_, err := os.ReadFile(y.KeyStore.Vault.Kubernetes.JWT.Value)
451451
if err != nil {
452452
return nil, fmt.Errorf("kesconf: failed to read vault kubernetes JWT from '%s': %v", y.KeyStore.Vault.Kubernetes.JWT.Value, err)
453453
}
454-
y.KeyStore.Vault.Kubernetes.JWT.Value = string(b)
454+
// postpone resolving the JWT until actually logging in
455455
}
456456
}
457457
if y.KeyStore.Vault.Transit != nil {

kesconf/config_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func TestReadServerConfigYAML_VaultWithK8S_JWTFile(t *testing.T) {
175175
Prefix = "tenant-2"
176176
K8SEngine = "kubernetes"
177177
K8SRole = "default"
178-
K8SJWT = "eyJhbGciOiJSUzI1NiIsImtpZCI6IkJQbGNNeTdBeXdLQmZMaGw2N1dFZkJvUmtsdnVvdkxXWGsteTc5TmJPeGMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteS1uYW1lc3BhY2UiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoibXktc2VydmljZS1hY2NvdW50LXRva2VuLXA5NWRyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15LXNlcnZpY2UtYWNjb3VudCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjdiYmViZGE2LTViMDUtNGFlNC05Yjg2LTBkODE0NWMwNzdhNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpteS1uYW1lc3BhY2U6bXktc2VydmljZS1hY2NvdW50In0.dnvJE3LU7L8XxsIOwea3lUZAULdwAjV9_crHFLKBGNxEu70lk3MQmUbGTEFvawryArmxMa1bWF9wbK1GHEsNipDgWAmc0rmBYByP_ahlf9bI2EEzpaGU5s194csB_eG7kvfi1AHED_nkVTfvCjIJM-9oGICCjDJcoNOP1NAXICFmqvWfXl6SY3UoZvtzUOcH9-0hbARY3p6V5pPecW4Dm-yGub9PKZLJNzv7GxChM-uvBvHAt6o0UBIL4iSy6Bx2l91ojB-RSkm_oy0W9gKi9ZFQPgyvcvQnEfjoGdvNGlOEdFEdXvl-dP6iLBPnZ5xwhAk8lK0oOONWvQg6VDNd9w"
178+
K8SJWTFile = "./testdata/vault-k8s-service-account"
179179
)
180180

181181
config, err := ReadFile(Filename)
@@ -203,8 +203,8 @@ func TestReadServerConfigYAML_VaultWithK8S_JWTFile(t *testing.T) {
203203
if vault.Kubernetes.Engine != K8SEngine {
204204
t.Fatalf("Invalid K8S engine: got '%s' - want '%s'", vault.Kubernetes.Engine, K8SEngine)
205205
}
206-
if vault.Kubernetes.JWT != K8SJWT {
207-
t.Fatalf("Invalid K8S JWT: got '%s' - want '%s'", vault.Kubernetes.JWT, K8SJWT)
206+
if vault.Kubernetes.JWT != K8SJWTFile {
207+
t.Fatalf("Invalid K8S JWT: got '%s' - want '%s'", vault.Kubernetes.JWT, K8SJWTFile)
208208
}
209209
if vault.Kubernetes.Role != K8SRole {
210210
t.Fatalf("Invalid K8S role: got '%s' - want'%s'", vault.Kubernetes.Role, K8SRole)

0 commit comments

Comments
 (0)