Kafka-ui Contributing
Kafka를 도입하면서 Kafka UI(kafbat/kafka-ui) 툴도 같이 적용
RBAC(Role Based Access Control) 기능도 탑재되어서 관리자 권한과 개발자 권한 등 권한 관리도 가능하다.
원하는 목표는 관리자 권한과 읽기 전용 권한으로 나누는 것.
 대부분 카프카를 외부 접근 가능한 용도로 사용하지는 않을 거 같고, 그렇다면 누구나 인증만 되었다면 읽기는 가능하도록 하고 싶었다.
Kafka 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
 굉장히 꼼꼼히 봐주고 빠르게 반영해줘서 릴리즈 될 수 있었다.
