---
title: "Safety or usability: Why not both? Towards referential auth in k8s"
weight: 9
tags:
  - platform
  - security
---

A talk by Google and Microsoft with the premise of bether auth in k8s.

## Baselines

* Most access controllers have read access to all secrets -> They are not really designed for keeping these secrets
* Result: CVEs
* Example: Just use ingress, nginx, put in some lua code in the config and voila: Service account token
* Fix: No more fun

## Basic solutions

* Seperate Control (the controller) from data (the ingress)
* Namespace limited ingress

## Current state of cross namespace stuff

* Why: Reference tls cert for gateway api in the cert team'snamespace
* Why: Move all ingress configs to one namespace
* Classic Solution: Annotations in contour that references a namespace that contains all certs (rewrites secret to certs/secret)
* Gateway Solution:
  * Gateway TLS secret ref includes a namespace
  * ReferenceGrant pretty mutch allows referencing from X (Gatway) to Y (Secret)
* Limits: 
  * Has to be implemented via controllers
  * The controllers still have readall - they just check if they are supposed to do this

## Goals

### Global

* Grant access to controller to only ressources relevant for them (using references and maybe class segmentation)
* Allow for safe cross namespace references
* Make it easy for api devs to adopt it

### Personas

* Alex API author
* Kai controller author
* Rohan Resource owner

### What our stakeholders want

* Alex: Define relationships via ReferencePatterns
* Kai: Specify controller identity (Serviceaccount), define relationship API
* Rohan: Define cross namespace references (aka ressource grants that allow access to their ressources)

## Result of the paper

### Architecture

* ReferencePattern: Where do i find the references -> example: GatewayClass in the gateway API
* ReferenceConsumer: Who (IOdentity) has access under which conditions?
* ReferenceGrant: Allow specific references

### POC

* Minimum access: You only get access if the grant is there AND the reference actually exists
* Their basic implementation works with the kube api

### Open questions

* Naming
* Make people adopt this
* What about namespace-scoped ReferenceConsumer
* Is there a need of RBAC verb support (not only read access)

## Alternative

* Idea: Just extend RBAC Roles with a selector (match labels, etc)
* Problems:
  * Requires changes to kubernetes core auth
  * Everything bus list and watch is a pain
  * How do you handle AND vs OR selection
  * Field selectors: They exist
* Benefits: Simple controller implementation

## Meanwhile

* Prefer tools that support isolatiobn between controller and dataplane
* Disable all non-needed features -> Especially scripting