Rollenbasierte Zugriffe in Kubernetes leicht gemacht

Zugriffsberechtigungen in Kubernetes zu administrieren, kann schnell zu einer komplexen Aufgabe werden, umso größer die Zahl der Nutzer wird. In Kubernetes ist für die Authorisierung das sogenannte "Role-based access control" (RBAC) am weitesten verbreitet. Dabei werden Berechtigungen in "Roles" und "ClusterRoles" definiert. Erstere gelten nur in einem entsprechenden Namespace, also einem logischen Bereich im Cluster. Die Zuweisung dieser Rollen an konkrete Nutzer, Nutzergruppen oder Dienstbenutzer passiert in sogenannten "RoleBindings" und "ClusterRoleBindings". Hier liegt oft die Komplexität, da die Zahl dieser Zuweisungsobjekte deutlich steigt, umso feingranularer die Konfiguration sein soll.

Am besten lässt sich das an einem Beispiel zeigen. Es gibt die Namespaces "product-a", "product-b" und folgende Benutzer oder Gruppen welche Zugriff benötigen: "John" und "Support" (eine Benutzergruppe). "John" benötigt Schreibrechte für die beiden Produkt-Namespaces, die Supportgruppe entsprechende Leserechte. Für dieses Setup wären vier "RoleBindings" nötig. Sollte es später einen Namespace "product-c" geben, erhöht sich diese Zahl.

Um der steigenden Komplexität der Zuweisungen an dieser Stelle zu begegnen, setzen wir in unserem Cluster bei der Samhammer AG ein Tool namens "Access-Manager" ein. Dies ist ein öffentlich verfügbarer Kubernetes-Operator der die Rollenzuweisungen automatisiert anhand einer zentralen Definition verwalten kann. Diese würde, für das genannte Beispiel, wie folgt aussehen:

...
spec:
 namespaced:
  - namespaceSelector:
     matchLabels:
      management: 'true'
    bindings:
     - roleName: product-write-permission
       kind: ClusterRole
       subjects:
        - name: john
          kind: User
  - namespaceSelector:
     matchLabels:
      support: 'true'
     bindings:
      - roleName: support-permission
        kind: ClusterRole
        subjects:
         - name: support
           kind: Group

Eingeführt wurden dazu die Labels "management" und "support" mit denen die beiden Namespaces markiert werden. Der "Access-Manager" erstellt daraufhin die genannten Zuweisungen. Wird ein "product-c" Namespace eingeführt, reicht es aus diesen ebenfalls mit den gewünschten Labels zu markieren. Der Verwaltungsaufwand durch den Administrator und die Fehleranfälligkeit konnte so deutlich reduziert werden.