Why we should authenticate vault with Kubenetes
When wer ar running our application in Kubenetes pods then we can directly connect vault and pod which will create a token inside the pod at specific location.
So to access the data from vault we need to generate the token with Kubernetes token.
Benefit
: The main benefit of this method is that we don't need the static token for vault.
Example
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/go-resty/resty/v2"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/command/agent/auth"
vaultKube "github.com/hashicorp/vault/command/agent/auth/kubernetes"
)
// const can be created for these variables
var kubeTokenVaulPath = "{{your kubernetes vault token file path}}"
var KubeTokenRole = "{{your kube token role}}"
var vaultAddr = "{{your vault address}}"
var mountPath = "/v1/auth/{{path for Kv}}"
type VaultAuth struct {
ClientToken string `json:"client_token"`
Accessor string `json:"accessor"`
}
type CredOutput struct {
Auth VaultAuth `json:"auth"`
}
func main() {
appLogger := hclog.New(&hclog.LoggerOptions{
Name: "my-app",
Level: hclog.LevelFromString("DEBUG"),
})
auth, err := vaultKube.NewKubernetesAuthMethod(&auth.AuthConfig{
Logger: appLogger,
MountPath: vaultAddr + mountPath,
Config: map[string]interface{}{
"role": KubeTokenRole,
"token_path": kubeTokenVaulPath,
},
})
if err != nil {
panic(err)
}
// this functions returns
// path which is the url where we need to request
// header it will generate the headers required for the request
// body - it will generated the body token request
path, header, body, err := auth.Authenticate(context.Background(), nil)
if err != nil {
panic(err)
}
fmt.Println(path, header, body)
// I am using Resty because direct vault request client was not working
client := resty.New()
resp, err := client.R().
SetBody(body).
Post(path)
if err != nil {
panic(err)
}
fmt.Println("output", string(resp.Body()))
// creds will be the object where we will get
// the token generated for vault to access data
creds := CredOutput{}
json.Unmarshal(resp.Body(), &creds)
fmt.Println("final obj", creds)
}
We need to define these 4 params in order to generate the token for vault from Kubernetes pods token.
var kubeTokenVaulPath = "{{your kubernetes vault token file path}}"
var KubeTokenRole = "{{your kube token role}}"
var vaultAddr = "{{your vault address}}"
var mountPath = "/v1/auth/{{path for KV}}"
mountPath
: will be used to generate the token path.
Vault have default path with the name secrets for KV path
I am using Resty client because vault's NewRequest was not working.
Look at how we can use vault's inbuild rawRequest method but wasn't working for me.
Not Recommended As of Now
req := client.NewRequest("POST", path)
req.SetJSONBody(output)
resp, err := client.RawRequest(req)
Top comments (0)