Pulsar 인증과 권한 부여

Pulsar 인증과 권한 부여 (Authentication and authorization)

Pulsar에서 인증 제공자(authentication provider)는 클라이언트를 올바르게 식별하고 클라이언트를 역할 토큰과 연결하는 역할을 해요. 인증만 활성화하면 인증된 역할 토큰은 클러스터의 모든 리소스에 접근할 수 있어요. 권한 부여(Authorization) 는 클라이언트가 무엇을 할 수 있는지 결정하는 과정이에요.

출처: 문서

본문

가장 많은 권한을 가진 역할 토큰은 수퍼유저(superuser) 예요. 수퍼유저는 테넌트를 생성·삭제할 수 있고 모든 테넌트 리소스에 완전히 접근할 수 있어요.

수퍼유저가 테넌트(tenant)를 만들면 그 테넌트에 admin 역할이 할당돼요. admin 역할 토큰을 가진 클라이언트는 네임스페이스를 생성·수정·삭제하고, 그 네임스페이스에서 다른 역할 토큰에 권한을 부여·회수할 수 있어요.

브로커와 프록시 설정 (Broker and Proxy Setup)

권한 부여 활성화와 수퍼유저 지정 (Enable authorization and assign superusers)

브로커 구성 파일(conf/broker.conf 또는 conf/standalone.conf)에서 권한 부여를 활성화하고 수퍼유저를 지정할 수 있어요.

authorizationEnabled=true
superUserRoles=broker_client,admin,proxy,<custom-super-user-1>,<custom-super-user-2>

전체 파라미터 목록은 conf/broker.conf 또는 conf/standalone.conf 파일에서 확인할 수 있어요. 해당 파라미터의 기본값은 Broker Configuration에서 확인할 수도 있어요.

일반적으로 수퍼유저 역할은 관리자, 클라이언트, 그리고 브로커 간 인증에 사용해요. 지역 복제(geo-replication)를 사용할 때는 모든 브로커가 클러스터의 다른 모든 토픽에 게시할 수 있어야 해요.

프록시 구성 파일(conf/proxy.conf)에서도 프록시에 대한 권한 부여를 활성화할 수 있어요. 프록시에서 권한 부여를 활성화하면 프록시는 요청을 브로커로 전달하기 전에 추가 권한 부여 검사를 해요. 브로커에서 권한 부여를 활성화하면 브로커는 전달된 요청을 받을 때 요청의 권한을 검사해요.

프록시 역할 (Proxy Roles)

기본적으로 브로커는 프록시와 브로커 사이의 연결을 일반 사용자 연결로 취급해요. 브로커는 proxy.conf에 구성된 역할로 사용자를 인증해요(프록시에서 mTLS 인증 활성화 참고). 하지만 사용자가 프록시를 통해 클러스터에 연결할 때, 인증이 거의 필요하지 않을 수 있어요. 사용자는 프록시에 인증했던 역할 그대로 클러스터와 상호작용하기를 기대해요.

Pulsar는 프록시 역할(Proxy roles) 을 사용해 이 인증을 활성화해요. 프록시 역할은 브로커 구성 파일 conf/broker.conf에 지정돼요. 브로커에 인증된 클라이언트가 그 브로커의 proxyRoles 중 하나라면, 그 클라이언트의 모든 요청은 프록시에 인증된 클라이언트의 역할에 대한 정보도 함께 담아야 해요. 이 정보를 원본 주체(original principal) 라고 해요. 원본 주체가 없으면 클라이언트는 아무것도 접근할 수 없어요.

프록시가 proxyRoles에 있는 역할을 사용하도록 올바르게 구성되지 않으면 연결이 거부된다는 점에 주의해요.

리소스가 프록시를 통해 접근 가능하도록 보장하려면 프록시 역할원본 주체 모두에게 리소스 접근을 허가해야 해요. 관리자는 프록시 역할원본 주체를 허가하는 두 가지 접근 방식을 택할 수 있어요.

더 안전한 접근 방식은 리소스에 접근 권한을 부여할 때마다 프록시 역할에도 접근 권한을 부여하는 것이에요. 예를 들어 proxy1이라는 프록시 역할이 있다면, 수퍼유저가 테넌트를 만들 때 proxy1을 admin 역할 중 하나로 지정해야 해요. 어떤 역할이 네임스페이스에서 생성·소비 권한을 부여받을 때, 그 클라이언트가 프록시를 통해 생성·소비하려면 proxy1에도 같은 권한을 부여해야 해요.

또 다른 접근 방식은 프록시 역할을 수퍼유저로 만드는 것이에요. 이렇게 하면 프록시가 모든 리소스에 접근할 수 있어요. 클라이언트는 여전히 프록시에 인증해야 하고, 프록시를 통해 만들어진 모든 요청의 역할은 인증된 클라이언트의 원본 주체로 강등돼요. 하지만 프록시가 침해되면 악의적인 행위자가 클러스터에 완전히 접근할 수 있게 돼요.

conf/broker.conf에서 역할을 프록시 역할로 지정할 수 있어요.

proxyRoles=proxy,<my-proxy-role>

테넌트 관리 (Administer tenants)

Pulsar 인스턴스(instance) 관리자나 일종의 셀프서비스 포털이 일반적으로 Pulsar 테넌트(tenant)를 프로비저닝해요.

pulsar-admin 도구로 테넌트를 관리할 수 있어요.

새 테넌트 생성 (Create a new tenant)

다음 명령으로 새 테넌트를 만들 수 있어요.

bin/pulsar-admin tenants create my-tenant \
    --admin-roles my-admin-role \
    --allowed-clusters us-west,us-east

이 명령은 us-westus-east 클러스터를 사용할 수 있는 새 테넌트 my-tenant를 만들어요.

my-admin-role 역할을 가진 것으로 성공적으로 식별되는 클라이언트는 이 테넌트에서 모든 관리 작업을 수행할 수 있어요.

Pulsar의 토픽 이름 구조는 테넌트, 클러스터, 네임스페이스 간의 계층을 반영해요.

persistent://tenant/namespace/topic

권한 관리 (Manage permissions)

Pulsar에서 권한을 관리하려면 Pulsar Admin Tools을 사용할 수 있어요.

Pulsar admin 인증 (Pulsar admin authentication)

PulsarAdmin admin = PulsarAdmin.builder()
                    .serviceHttpUrl("http://broker:8080")
                    .authentication("com.org.MyAuthPluginClass", "param1:value1")
                    .build();

TLS를 사용하려면:

PulsarAdmin admin = PulsarAdmin.builder()
                    .serviceHttpUrl("https://broker:8080")
                    .authentication("com.org.MyAuthPluginClass", "param1:value1")
                    .tlsTrustCertsFilePath("/path/to/trust/cert")
                    .build();

여러 역할을 가진 인증된 클라이언트 허가 (Authorize an authenticated client with multiple roles)

인증 과정에서 클라이언트가 토큰 안에 여러 역할로 식별될 때(토큰의 역할 클레임 타입이 배열인 경우), Pulsar는 모든 역할의 권한을 검사하고 그 역할 중 하나라도 필요한 권한을 가지면 클라이언트를 추가로 허가하는 것을 지원해요.

note 이 허가 방식은 JWT 인증과만 호환돼요.

이 허가 방식을 활성화하려면 conf/broker.conf 파일에서 권한 부여 제공자를 MultiRolesTokenAuthorizationProvider로 구성해요.

# Authorization provider fully qualified class-name
authorizationProvider=org.apache.pulsar.broker.authorization.MultiRolesTokenAuthorizationProvider

더 알아보기 (Learn more)