Kafka-ui Contributing

Kafka를 도입하면서 Kafka UI(kafbat/kafka-ui) 툴도 같이 적용

RBAC(Role Based Access Control) 기능도 탑재되어서 관리자 권한과 개발자 권한 등 권한 관리도 가능하다.

원하는 목표는 관리자 권한과 읽기 전용 권한으로 나누는 것.

대부분 카프카를 외부 접근 가능한 용도로 사용하지는 않을 거 같고, 그렇다면 누구나 인증만 되었다면 읽기는 가능하도록 하고 싶었다.

Kafka UI에서의 권한 관리

RBAC (Role based access control) | kafbat UI

Kafka UI는 어떻게 RBAC을 구현했을까

우선 권한은 yaml 파일을 통해 정의한다. 아래 예시를 보면 크게 clusters, subject, permissions 3개로 정의하고 있다.

rbac:
  roles:
    - name: "read-only"
      clusters:
        - dev
        - test
        
      subjects:
        - provider: oauth_google
          type: domain
          value: "memelord.lol"
        - provider: oauth_github
          type: user
          value: "Haarolean"
        - provider: oauth
          type: role
          value: "admin"

      permissions:
        - resource: topic
          value: "public.*"
          actions: # can be a multiline list
            - VIEW 
            - MESSAGES_READ
            - ANALYSIS_VIEW

        - resource: consumer
          value: ".*"
          actions: [ VIEW ]

        - resource: schema
          value: ".*"
          actions: [ VIEW ]

어디(cluster)에 누가(subject) 어떤 권한(permission)을 가졌는지 정의하는 거라고 보면 된다.

Kafka ui RBAC 적용

우선 자체적으로 정의한 요구사항은 재배포가 필요 없어야 하는 점. 누구나 인증만 되면 읽기는 가능할 것.
이를 위해 oauth_github를 인증 수단으로 사용하였다.
해당 subject는 인증 후 user, organization, team 에 대해서 권한 처리 가능한데 특정 organization, team에 대해서 특정 권한을 주고 해당 그룹에 초대하여 재배포 없이 권한 관리할 수 있도록 하였다.

rbac:
  roles:
    - name: "read-only"
      clusters:
        ...
      subjects:
        - provider: oauth_github
          type: team
          value: "kafka-readonly"

      permissions:

        - resource: topic
          value: "public.*"
          actions: # can be a multiline list
            - VIEW 
            - MESSAGES_READ
            - ANALYSIS_VIEW

        - resource: consumer
          value: ".*"
          actions: [ VIEW ]

        - resource: schema
          value: ".*"
          actions: [ VIEW ]

해당 방법으로 진행하려 했으나 문제가 있었다.
https://docs.github.com/en/rest/orgs/orgs?apiVersion=2022-11-28#list-organizations-for-the-authenticated-user

해당 api를 사용하는데 유저가 속한 organization 목록을 가져와서 RBAC에 정의된 리소스와 일치하는 지 대조하는 로직이다.
우선 query params 옵션 없이 사용하였기에 30개씩 반환되는데, 한 유저가 30개 이상 organization에 속해있으면 권한이 있어도 인가될 수 없다.
따라서 일단 per_page를 100개로 늘렸다.
https://github.com/provectus/kafka-ui/pull/3864

그래도 한계점이 존재하는데, 언젠가는 100개가 넘는 상황이 발생할 수 있지 않나? (여기 메인테이너도 그런 경우는 보지도 못했다 하지만... 현재 그러고 있다.)

어찌되었든, 한계점이 존재하는 로직이라
default 권한이 있으면 좋을거 같다는 생각에 이슈 생성 및 PR 생성.
https://github.com/kafbat/kafka-ui/issues/344
https://github.com/kafbat/kafka-ui/pull/1056
굉장히 꼼꼼히 봐주고 빠르게 반영해줘서 릴리즈 될 수 있었다.