Эй, ребята, я наткнулся на блокпост, пытаясь выяснить, как искать все наши service/policy_names
, чтобы убедиться, что у них есть определенные возможности.
Допустим, у меня есть политика хранилища, подобная следующей
bash-4.4$ vault policy read service/admin
# Token policies
path "/auth/token/create" {
capabilities = ["create", "update", "sudo"]
}
path "/auth/token/lookup" {
capabilities = ["create", "update"]
}
path "/auth/token/renew" {
capabilities = ["create", "update"]
}
path "/auth/token/revoke" {
capabilities = ["create", "update"]
}
# View system policies
path "/sys/policy" {
capabilities = ["read"]
}
# Allow full access to interact with all secrets
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
Я пытаюсь просканировать каждую политику и, если путь не имеет правильных возможностей, создайте новый файл с правильными возможностями и сохраните его. Я застрял при попытке просмотреть каждый путь, и я немного расстроен. Надеюсь, кто-то может помочь или порекомендовать более разумный метод. Выше будет сохранено в новый файл service_admin.hcl
и будет выглядеть следующим образом
bash-4.4$ less service_admin.hcl
# Token policies
path "/auth/token/create" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "/auth/token/lookup" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "/auth/token/renew" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "/auth/token/revoke" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# View system policies
path "/sys/policy" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# Allow full access to interact with all secrets
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
Код, который у меня есть, приведен ниже, я выбрал go, потому что я думал, что библиотека HCL поможет мне, но я изо всех сил пытаюсь ее использовать.
package main
import (
"github.com/hashicorp/vault/api"
"log"
"regexp"
)
func main() {
cfg := api.DefaultConfig()
cfg.Address = "http://localhost:8200"
client, err := api.NewClient(cfg)
if err != nil {
log.Fatal(err)
}
client.SetToken("xxx")
policies, err := client.Sys().ListPolicies()
if err != nil {
log.Fatal(err)
}
var listPolicies []string
for _, policy := range policies {
matched, _ := regexp.MatchString("^service", policy)
if matched {
listPolicies = append(listPolicies, policy)
}
}
for _, policy := range listPolicies {
policyContents, _ := client.Sys().GetPolicy(policy)
// parse := hcl.Parse(policyContents) // ????
// Does each `path` have `capabilities = ["create", "read", "update", "delete", "list"]`
log.Println(policyContents)
break
}
}