Pulsar 프록시

Pulsar 프록시 (Pulsar proxy)

Pulsar proxy는 선택적인 게이트웨이예요. 클라이언트와 Pulsar 브로커 간의 직접 연결이 불가능하거나 바람직하지 않을 때 사용돼요. 예를 들어 클라우드 환경이나 Kubernetes 또는 유사한 플랫폼에서 Pulsar를 실행할 때 Pulsar proxy를 실행할 수 있어요.

출처: 문서

본문

Pulsar proxy는 선택적인 게이트웨이예요. 클라이언트와 Pulsar 브로커 간의 직접 연결이 불가능하거나 바람직하지 않을 때 사용해요. 예를 들어 클라우드 환경이나 Kubernetes 또는 유사한 플랫폼에서 Pulsar를 실행할 때 Pulsar proxy를 실행할 수 있어요.

Pulsar proxy는 공용 인터넷에 노출하도록 의도되지 않았어요. 현재 설계의 보안 고려 사항은 네트워크 경계 보안(network perimeter security)을 기대해요. 네트워크 경계 보안 요구 사항은 사설 네트워크로 달성할 수 있어요.

프록시 배포를 네트워크 경계 보안으로 보호할 수 없다면, 제대로 보안·감사된 솔루션과 함께 Pulsar의 "Proxy SNI routing" 기능을 사용하는 것이 대안이에요. 그 경우 Pulsar proxy 컴포넌트는 전혀 사용되지 않아요.

Pulsar Proxy 외에도 "multiple advertised listeners" 기능으로 Pulsar 클러스터를 외부 클라이언트에 노출할 수 있어요. 이것도 적절한 네트워크 경계 보안이 필요해요.

프록시 구성 (Configure the proxy)

프록시를 사용하기 전에 클러스터의 브로커 주소로 구성해야 해요. 프록시 구성에서 브로커 URL을 구성하거나, 서비스 디스커버리를 사용해 직접 연결하도록 프록시를 구성할 수 있어요.

프로덕션 환경에서는 서비스 디스커버리를 권장하지 않아요.

브로커 URL 사용 (Use broker URLs)

브로커에 연결할 URL을 지정하는 것이 더 안전해요.

프록시 권한 부여는 ZooKeeper에 대한 접근이 필요하므로, 이 브로커 URL로 브로커에 연결한다면 프록시 수준에서 권한 부여를 비활성화해야 해요. 브로커는 프록시가 요청을 전달한 후에도 여전히 요청을 승인해요.

conf/proxy.conf에서 브로커 URL을 다음과 같이 구성할 수 있어요.

brokerServiceURL=pulsar://brokers.example.com:6650
brokerWebServiceURL=http://brokers.example.com:8080
functionWorkerWebServiceURL=http://function-workers.example.com:8080

TLS를 사용한다면 브로커 URL을 다음과 같이 구성해요.

brokerServiceURLTLS=pulsar+ssl://brokers.example.com:6651
brokerWebServiceURLTLS=https://brokers.example.com:8443
functionWorkerWebServiceURL=https://function-workers.example.com:8443

제공된 URL의 호스트 이름은 여러 브로커를 가리키는 DNS 엔트리 또는 여러 브로커 IP 주소로 뒷받침되는 가상 IP 주소여야 해요. 그래야 단일 브로커가 사용 불가능해져도 프록시가 Pulsar 클러스터에 대한 연결을 잃지 않아요.

브로커에 연결하는 포트(6650과 8080, 또는 TLS의 경우 6651과 8443)는 네트워크 ACL에서 열려 있어야 해요.

함수를 사용하지 않는다면 functionWorkerWebServiceURL은 구성할 필요가 없어요.

서비스 디스커버리 사용 (Use service discovery)

Pulsar는 서비스 디스커버리에 자체 메타데이터 스토어를 사용해요. 프록시를 메타데이터 스토어에 연결하려면 conf/proxy.conf에 지정해요.

새 클러스터에는 Oxia가 권장 메타데이터 스토어예요.

metadataStoreUrl=oxia://oxia-1.example.com:6648/broker
configurationMetadataStoreUrl=oxia://oxia-1.example.com:6648/broker

또는 프록시를 ZooKeeper 클러스터에 연결하려면:

metadataStoreUrl=my-zk-0:2181,my-zk-1:2181,my-zk-2:2181
configurationMetadataStoreUrl=my-zk-0:2184,my-zk-remote:2184

서비스 디스커버리를 사용하려면 네트워크 ACL을 열어야 해서, 프록시가 ZooKeeper 클라이언트 포트(포트 2181)와 구성 스토어 클라이언트 포트(포트 2184)를 통해 ZooKeeper 노드에 연결할 수 있어야 해요.

하지만 서비스 디스커버리를 사용하는 것은 안전하지 않아요. 네트워크 ACL이 열려 있으면 누군가가 프록시를 손상시켰을 때 ZooKeeper에 완전한 접근 권한을 갖기 때문이에요.

CVE-2022-24280 완화를 위한 대상 브로커 주소 제한

Pulsar Proxy는 클라이언트가 연결할 유효한 대상 브로커 주소를 제공할 것이라고 신뢰해요. Pulsar Proxy가 접근을 명시적으로 제한하도록 구성되지 않는 한, Pulsar Proxy는 보안 권고 Apache Pulsar Proxy target broker address isn't validated (CVE-2022-24280)에 설명된 대로 취약해요.

brokerProxyAllowedHostNamesbrokerProxyAllowedIPAddresses 설정을 지정해 프록시된 브로커 연결을 알려진 브로커 주소로 제한해야 해요.

brokerProxyAllowedHostNames를 지정할 때 와일드카드를 사용할 수 있어요. *는 호스트 이름의 어떤 문자와도 일치하는 와일드카드이며 점(.) 문자도 일치시켜요.

원하는 브로커와 로컬 네트워크의 다른 호스트에만 일치하는 패턴을 사용하는 것을 권장해요. Pulsar lookup은 기본적으로 브로커의 기본 호스트 이름을 사용해요. 이것은 broker.confadvertisedAddress 설정으로 재정의할 수 있어요.

보안을 높이려면 brokerProxyAllowedIPAddresses 설정으로 접근을 제한할 수도 있어요. brokerProxyAllowedHostNames가 패턴이 대상 브로커와만 일치하도록 제대로 구성되어 있다면 brokerProxyAllowedIPAddresses를 구성하는 것은 필수가 아니에요.

brokerProxyAllowedIPAddresses 설정은 IP 주소, IP 주소 범위, IP 주소 네트워크의 쉼표로 구분된 목록을 지원해요(지원 형식 참고).

예제: Kubernetes 배포에서 호스트 이름으로 제한:

  # example of limiting to Kubernetes statefulset hostnames that contain "broker-"
  PULSAR_PREFIX_brokerProxyAllowedHostNames: '*broker-*.*.*.svc.cluster.local'

예제: 호스트 배포의 proxy.conf 파일에서 호스트 이름과 IP 주소 모두로 제한:

# require "broker" in host name
brokerProxyAllowedHostNames=*broker*.localdomain
# limit target ip addresses to a specific network
brokerProxyAllowedIPAddresses=10.0.0.0/8

예제: 호스트 배포의 proxy.conf 파일에서 여러 호스트 이름 패턴과 여러 IP 주소 범위로 제한:

# require "broker" in host name
brokerProxyAllowedHostNames=*broker*.localdomain,*broker*.otherdomain
# limit target ip addresses to a specific network or range demonstrating multiple supported formats
brokerProxyAllowedIPAddresses=10.10.0.0/16,192.168.1.100-120,172.16.2.*,10.1.2.3

프록시 시작 (Start the proxy)

프록시를 시작하려면 다음 명령을 실행해요.

새 클러스터에는 Oxia가 권장 메타데이터 스토어예요.

cd /path/to/pulsar/directory
bin/pulsar proxy \
    --metadata-store oxia://oxia-1.example.com:6648/broker \
    --configuration-metadata-store oxia://oxia-1.example.com:6648/broker

또는 ZooKeeper를 메타데이터 스토어로 사용:

cd /path/to/pulsar/directory
bin/pulsar proxy \
    --metadata-store zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181 \
    --configuration-metadata-store zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181

클러스터에서 Pulsar proxy 인스턴스를 여러 개 실행할 수 있어요.

프록시 중지 (Stop the proxy)

Pulsar proxy는 기본적으로 포그라운드에서 실행돼요. 프록시를 중지하려면 프록시가 실행되는 프로세스를 중지하면 돼요.

프록시 프론트엔드 (Proxy frontends)

Pulsar proxy를 HAProxy 로드 밸런서 같은 일종의 로드 분산 프론트엔드 뒤에서 실행할 수 있어요.

Pulsar 클라이언트를 프록시와 함께 사용 (Use Pulsar clients with the proxy)

Pulsar proxy가 실행되고 나면, 가급적 로드 분산 프론트엔드 뒤에서, 클라이언트는 프론트엔드가 사용하는 어떤 주소로든 프록시에 연결할 수 있어요. 주소가 예를 들어 DNS 주소 pulsar.cluster.default라면 클라이언트의 연결 URL은 pulsar://pulsar.cluster.default:6650이에요.

Proxy 구성에 대한 자세한 내용은 Pulsar proxy를 참고해요.

더 알아보기 (Learn more)

  • Pulsar proxy의 상세 구성은 Pulsar proxy 참고 문서를 참고해요.
  • 보안 연결과 SNI 라우팅은 보안 문서를 참고해요.
  • 메타데이터 스토어 구성은 Configure metadata store 문서를 참고해요.