Skip to main content

RBAC & Service Accounts

Role-Based Access Control (RBAC) ensures that each application and operator has exactly the permissions it needs — nothing more.

Principle of Least Privilege

Every pod runs with a dedicated ServiceAccount. No application shares a service account with another, and no application uses the default service account.

Application Tiers

Tier 1: Standard Applications

Most applications need no special cluster access. Their service account exists purely for identity — it has no bound roles:

apiVersion: v1
kind: ServiceAccount
metadata:
name: bookmarked-sa
namespace: default

Apps in this tier: Bookmarked, educationELLy, educationELLy GraphQL, IntervalAI, Code Talk, TenantFlow

Tier 2: Cluster-Aware Applications

PodRick and the GraphQL Gateway need read access to cluster resources for their dashboards:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-reader
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "namespaces", "services"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["autoscaling"]
resources: ["horizontalpodautoscalers"]
verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: podrick-cluster-reader
subjects:
- kind: ServiceAccount
name: podrick-sa
namespace: default
roleRef:
kind: ClusterRole
name: cluster-reader
apiGroup: rbac.authorization.k8s.io

Tier 3: Platform Operators

ArgoCD, External Secrets Operator, and cert-manager run with elevated permissions in their own namespaces. These are installed via Helm with their default RBAC configurations.

Security Boundaries

BoundaryEnforcement
Namespace isolationApplications in default, operators in dedicated namespaces
Service account per appNo shared identity between applications
Read-only cluster accessDashboard apps can read, never modify
No host networkingPods use cluster networking only
No privileged containersAll containers run as non-root