Add Vault-scoped agent kubernetes roles + agents AppRole #109

Merged
benvin merged 2 commits from benvin/agent-kube-contexts into master 2026-08-02 21:55:06 +10:00
17 changed files with 184 additions and 2 deletions
@@ -0,0 +1,6 @@
token_ttl: 3600
token_max_ttl: 14400
bind_secret_id: false
token_bound_cidrs:
- "10.10.12.200/32"
use_deterministic_role_id: true
@@ -0,0 +1,4 @@
allowed_kubernetes_namespaces:
- "cert-manager"
kubernetes_role_type: "Role"
extra_labels: {}
@@ -0,0 +1,4 @@
allowed_kubernetes_namespaces:
- "dhcp-system"
kubernetes_role_type: "Role"
extra_labels: {}
@@ -0,0 +1,4 @@
allowed_kubernetes_namespaces:
- "bind-system"
service_account_name: "agent-dns"
extra_labels: {}
@@ -0,0 +1,4 @@
allowed_kubernetes_namespaces:
- "cephrgw-system"
kubernetes_role_type: "Role"
extra_labels: {}
+1
View File
@@ -299,6 +299,7 @@ module "kubernetes_secret_backend_role" {
allowed_kubernetes_namespaces = each.value.allowed_kubernetes_namespaces
kubernetes_role_type = each.value.kubernetes_role_type
extra_labels = each.value.extra_labels
service_account_name = each.value.service_account_name
depends_on = [module.kubernetes_secret_backend]
}
@@ -2,6 +2,10 @@ locals {
# Auto-generate role rules path: resources/secret_backend/{backend_path}/roles/{role_name}.yaml
role_rules_file = "resources/secret_backend/${var.backend}/roles/${var.name}.yaml"
# service_account_name mode mints tokens for a pre-existing SA, so the
# generated_role_rules / kubernetes_role_type binding fields must be unset.
use_service_account = var.service_account_name != null
# Auto-generate extra labels based on country/region and role name
auto_labels = merge(var.extra_labels, {
vault-region = "${var.country}-${var.region}"
@@ -13,7 +17,8 @@ resource "vault_kubernetes_secret_backend_role" "role" {
backend = var.backend
name = var.name
allowed_kubernetes_namespaces = var.allowed_kubernetes_namespaces
kubernetes_role_type = var.kubernetes_role_type
generated_role_rules = file("${path.module}/../../../../../../../../${local.role_rules_file}")
kubernetes_role_type = local.use_service_account ? null : var.kubernetes_role_type
generated_role_rules = local.use_service_account ? null : file("${path.module}/../../../../../../../../${local.role_rules_file}")
service_account_name = var.service_account_name
extra_labels = local.auto_labels
}
@@ -34,4 +34,10 @@ variable "extra_labels" {
description = "Additional labels to apply to generated Kubernetes objects"
type = map(string)
default = {}
}
variable "service_account_name" {
description = "Pre-existing service account to mint tokens for. When set, RBAC comes from that SA's own bindings instead of generated_role_rules."
type = string
default = null
}
+1
View File
@@ -285,6 +285,7 @@ variable "kubernetes_secret_backend_role" {
allowed_kubernetes_namespaces = optional(list(string), ["*"])
kubernetes_role_type = optional(string, "Role")
extra_labels = optional(map(string), {})
service_account_name = optional(string)
}))
default = {}
}
@@ -0,0 +1,12 @@
# Allow access to agent-certs Kubernetes credentials
---
rules:
- path: "kubernetes/au/syd1/creds/agent-certs"
capabilities:
- update
auth:
ldap:
- kubernetes_au_syd1_cluster_operator
approle:
- agents
@@ -0,0 +1,12 @@
# Allow access to agent-dhcp Kubernetes credentials
---
rules:
- path: "kubernetes/au/syd1/creds/agent-dhcp"
capabilities:
- update
auth:
ldap:
- kubernetes_au_syd1_cluster_operator
approle:
- agents
@@ -0,0 +1,12 @@
# Allow access to agent-dns Kubernetes credentials
---
rules:
- path: "kubernetes/au/syd1/creds/agent-dns"
capabilities:
- update
auth:
ldap:
- kubernetes_au_syd1_cluster_operator
approle:
- agents
@@ -0,0 +1,12 @@
# Allow access to agent-storage Kubernetes credentials
---
rules:
- path: "kubernetes/au/syd1/creds/agent-storage"
capabilities:
- update
auth:
ldap:
- kubernetes_au_syd1_cluster_operator
approle:
- agents
+17
View File
@@ -0,0 +1,17 @@
# Allow the agents AppRole to manage the kubernetes KV subtree (no delete)
---
rules:
- path: "kv/data/kubernetes/*"
capabilities:
- create
- read
- update
- list
- path: "kv/metadata/kubernetes/*"
capabilities:
- read
- list
auth:
approle:
- agents
@@ -0,0 +1,33 @@
---
rules:
- apiGroups:
- "cert-manager.io"
- "acme.cert-manager.io"
resources:
- "*"
verbs:
- "*"
- apiGroups:
- ""
resources:
- "secrets"
verbs:
- "get"
- "list"
- "watch"
- "delete"
- apiGroups:
- ""
resources:
- "pods"
verbs:
- "get"
- "list"
- "watch"
- apiGroups:
- ""
resources:
- "pods/log"
verbs:
- "get"
- "list"
@@ -0,0 +1,26 @@
---
rules:
- apiGroups:
- "kea.unkin.net"
resources:
- "*"
verbs:
- "*"
- apiGroups:
- ""
resources:
- "pods"
- "services"
- "configmaps"
- "events"
verbs:
- "get"
- "list"
- "watch"
- apiGroups:
- ""
resources:
- "pods/log"
verbs:
- "get"
- "list"
@@ -0,0 +1,23 @@
---
rules:
- apiGroups:
- "ceph.unkin.net"
resources:
- "*"
verbs:
- "*"
- apiGroups:
- ""
resources:
- "pods"
verbs:
- "get"
- "list"
- "watch"
- apiGroups:
- ""
resources:
- "pods/log"
verbs:
- "get"
- "list"