This document provides a comprehensive overview of the security features and mechanisms implemented in the Envoy XDS Controller. For a detailed explanation of the authentication flow and ACL implementation, see the Authentication and Authorization Implementation document.
The controller uses OpenID Connect (OIDC) for authentication:
name: User identifiergroups: User group membershipsThe controller implements a comprehensive RBAC system using Casbin:
type Authorizer struct {
name string // User identifier
groups []string // User groups
action string // Requested action
enforcer *casbin.Enforcer
}
_)*)The RBAC model is defined in the Helm chart configuration and supports:
r = sub, dom, obj, act
Where:
sub: Subject (user or group)dom: Domain (access group)obj: Object (resource)act: Action (operation)p = sub, dom, obj, act
g = _, _, _
Note: The role definition includes three parameters to support domain-specific role assignments.
e = some(where (p.eft == allow))
m = g(r.sub, p.sub, r.dom) && globMatch(r.dom, p.dom) && globMatch(r.obj, p.obj) && r.act == p.act || r.sub == "superuser"
The matcher supports:
The default policy configuration includes predefined roles:
role:reader):
p, role:reader, *, *, list-virtual-services
p, role:reader, *, *, list-virtual-service-templates
p, role:reader, *, *, list-listeners
p, role:reader, *, *, list-nodes
p, role:reader, *, *, list-access-log-configs
p, role:reader, *, *, list-http-filters
p, role:reader, *, *, list-routes
p, role:reader, *, *, get-virtual-service
p, role:reader, *, *, fill-template
role:editor):
p, role:editor, *, *, list-virtual-services
p, role:editor, *, *, list-virtual-service-templates
p, role:editor, *, *, list-listeners
p, role:editor, *, *, list-nodes
p, role:editor, *, *, list-access-log-configs
p, role:editor, *, *, list-http-filters
p, role:editor, *, *, list-routes
p, role:editor, *, *, get-virtual-service
p, role:editor, *, *, fill-template
p, role:editor, *, *, create-virtual-service
p, role:editor, *, *, update-virtual-service
Custom policies can be added through Helm values:
auth:
enabled: true
rbacPolicy: |
p, custom-role, domain1, resource1, action1
p, custom-role, domain2, *, action2
g, user1, custom-role, domain1
const (
ActionListVirtualServices = "list-virtual-services"
ActionGetVirtualService = "get-virtual-service"
ActionCreateVirtualService = "create-virtual-service"
ActionUpdateVirtualService = "update-virtual-service"
ActionDeleteVirtualService = "delete-virtual-service"
ActionListAccessLogConfigs = "list-access-log-configs"
ActionListVirtualServiceTemplates = "list-virtual-service-templates"
ActionListNodes = "list-nodes"
ActionListRoutes = "list-routes"
ActionListHTTPFilters = "list-http-filters"
ActionListPolicies = "list-policies"
ActionListAccessGroups = "list-access-groups"
ActionListListeners = "list-listeners"
ActionListPermissions = "list-permissions"
)
The system supports dynamic policy updates:
general)*)func (a *Authorizer) Authorize(domain string, object any) (bool, error) {
for _, sub := range a.getSubjects() {
result, err := a.enforcer.Enforce(sub, domain, object, a.action)
if err != nil {
return false, err
}
if result {
return true, nil
}
}
return false, nil
}
type AuthMiddleware struct {
verifier *oidc.IDTokenVerifier
wrappedMiddleware *authn.Middleware
enforcer *casbin.Enforcer
}
auth:
enabled: true
issuerURL: "https://your-oidc-provider"
clientID: "your-client-id"
auth:
enabled: true
rbacPolicy: |
p, role:custom, domain1, resource1, action1
g, user1, role:custom, domain1
OIDC_ENABLED=true
OIDC_ISSUER_URL=https://your-oidc-provider
OIDC_CLIENT_ID=your-client-id
ACL_CONFIG={"group1":["node1","node2"],"group2":["*"]}
[request_definition]
r = sub, dom, obj, act
[policy_definition]
p = sub, dom, obj, act
[role_definition]
g = _, _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub, r.dom) && globMatch(r.dom, p.dom) && globMatch(r.obj, p.obj) && r.act == p.act || r.sub == "superuser"
# Default reader role
p, role:reader, *, *, list-virtual-services
p, role:reader, *, *, get-virtual-service
# Default editor role
p, role:editor, *, *, create-virtual-service
p, role:editor, *, *, update-virtual-service
# Custom role
p, role:custom, domain1, resource1, action1
g, user1, role:custom, domain1
Enable debug mode for detailed security logs:
APP_DEV_MODE=true
For security-related issues or questions: