Kerberos 인증

Kerberos 인증 (Authentication using Kerberos)

Kerberos는 비밀 키 암호화를 사용해 클라이언트 애플리케이션과 서버 애플리케이션에 대한 강력한 인증을 제공하도록 설계된 네트워크 인증 프로토콜이에요. Pulsar에서는 SASL과 함께 Kerberos를 인증 선택지로 사용할 수 있어요. 이번에는 Pulsar에서 Kerberos 인증을 구성하는 방법을 단계별로 살펴볼게요.

출처: 문서

본문

Pulsar는 SASL 구성을 위해 Java 인증 및 권한 부여 서비스(JAAS)를 사용하므로, Kerberos 인증을 위해 JAAS 구성을 제공해야 해요.

note Kerberos 인증은 인증된 주체(principal)를 Pulsar 권한 부여의 역할 토큰으로 사용해요. authorizationEnabled를 활성화했다면 broker.conf에서 KDC에 등록된 이름에 대응하는 superUserRoles를 설정해야 해요. 예:

superUserRoles=client/{clientIp}@EXAMPLE.COM

사전 준비 (Prerequisites)

  • 키 배포 센터(KDC)를 설정하고 실행해요.
  • 조직에 없다면 Kerberos 서버를 설치해요. Linux 공급업체에 Kerberos 패키지가 있을 수 있어요. Kerberos 설치·구성 방법은 UbuntuRedhat을 참고해요.
  • Oracle Java를 사용한다면 Java 버전에 맞는 JCE 정책 파일을 다운로드해 $JAVA_HOME/jre/lib/security 디렉터리에 복사해야 해요.

브로커에서 Kerberos 인증 활성화 (Enable Kerberos authentication on brokers)

브로커에서 Kerberos 인증을 활성화하려면 다음 단계를 완료해요.

1단계: Kerberos 주체 만들기 (Step 1: Create Kerberos principals)

기존 Kerberos 시스템을 사용한다면 Kerberos 관리자에게 클러스터의 각 브로커와, Kerberos 인증으로 Pulsar에 접근하는(클라이언트와 CLI 도구를 통해) 각 운영 체제 사용자에 대한 주체를 요청해요.

자체 Kerberos 시스템을 설치했다면 다음 명령으로 주체를 만들어야 해요.

### add Principals for broker
sudo /usr/sbin/kadmin.local -q 'addprinc -randkey broker/{hostname}@{REALM}'
sudo /usr/sbin/kadmin.local -q "ktadd -k /etc/security/keytabs/{broker-keytabname}.keytab broker/{hostname}@{REALM}"
### add Principals for client
sudo /usr/sbin/kadmin.local -q 'addprinc -randkey client/{hostname}@{REALM}'
sudo /usr/sbin/kadmin.local -q "ktadd -k /etc/security/keytabs/{client-keytabname}.keytab client/{hostname}@{REALM}"

브로커 주체의 첫 부분(예: broker/{hostname}@{REALM}broker)은 각 호스트의 serverType이에요. serverType의 권장 값은 broker(호스트 머신이 Pulsar 브로커 서비스를 실행)와 proxy(호스트 머신이 Pulsar 프록시 서비스를 실행)예요.

Kerberos는 모든 호스트가 FQDN으로 해석될 수 있어야 한다는 점에 주의해요.

2단계: 브로커 구성 (Step 2: Configure brokers)

broker.conf 파일에서 Kerberos 관련 구성을 설정해요. 예시는 다음과 같아요.

authenticationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderSasl
saslJaasClientAllowedIds=.*client.* ## regex for principals that are allowed to connect to brokers
saslJaasServerSectionName=PulsarBroker ## corresponds to the section in the JAAS configuration file for brokers
# Authentication settings of the broker itself. Used when the broker connects to other brokers, or when the proxy connects to brokers, either in same or other clusters
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationSasl
brokerClientAuthenticationParameters={"saslJaasClientSectionName":"PulsarClient", "serverType":"broker"}

Pulsar 내부 admin 클라이언트가 제대로 동작하게 하려면 다음을 해야 해요.

  • brokerClientAuthenticationPlugin을 클라이언트 플러그인 AuthenticationSasl로 설정하고;
  • brokerClientAuthenticationParameters를 JSON 문자열 {"saslJaasClientSectionName":"PulsarClient", "serverType":"broker"} 값으로 설정해요. 여기서 PulsarClientpulsar_jaas.conf 파일의 섹션 이름이고, "serverType":"broker"는 내부 admin 클라이언트가 브로커에 연결함을 나타내요.

3단계: JAAS 구성 (Step 3: Configure JAAS)

JAAS 구성 파일은 KDC에 연결하는 정보를 제공해요. pulsar_jaas.conf라는 이름의 예시는 다음과 같아요.

 PulsarBroker {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarbroker.keytab"
   principal="broker/[email protected]";
};
 PulsarClient {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarclient.keytab"
   principal="client/[email protected]";
};

위 예시에서:

  • PulsarBroker는 각 브로커가 사용하는 JAAS 파일의 섹션 이름이에요. 이 섹션은 브로커에 Kerberos 내부의 어떤 주체를 사용할지, 주체가 저장된 keytab의 위치를 알려줘요.
  • PulsarClient는 각 클라이언트가 사용하는 JAAS 파일의 섹션 이름이에요. 이 섹션은 클라이언트에 Kerberos 내부의 어떤 주체를 사용할지, 주체가 저장된 keytab의 위치를 알려줘요.

pulsar_jaas.conf 파일 경로를 JVM 파라미터로 설정해야 해요. 예:

    -Djava.security.auth.login.config=/etc/pulsar/pulsar_jaas.conf

4단계: KDC에 연결 (Step 4: Connect to KDC)

note Kerberos로 구성된 머신에 시스템 전역 구성이 이미 있다면 이 구성을 건너뛸 수 있어요.

krb5.conf 파일의 내용은 기본 Realm과 KDC 정보를 나타내요. 자세한 내용은 JDK의 Kerberos 요구 사항을 참고해요.

브로커의 krb5.conf 파일 경로를 지정하려면 다음 명령을 입력해요.

-Djava.security.krb5.conf=/etc/pulsar/krb5.conf

krb5.conf 파일의 예시는 다음과 같아요.

[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM  = {
  kdc = localhost:62037
 }

위 예시에서:

  • EXAMPLE.COM은 기본 Realm이에요;
  • kdc = localhost:62037EXAMPLE.COM Realm의 KDC 서버 URL이에요.

프록시에서 Kerberos 인증 활성화 (Enable Kerberos authentication on proxies)

브로커와 클라이언트 사이에서 프록시를 사용하려면, Pulsar 프록시(Kerberos의 SASL 서버)가 클라이언트(Kerberos의 SASL 클라이언트)를 인증한 뒤 브로커가 프록시를 인증해요.

프록시에서 Kerberos 인증을 활성화하려면 다음 단계를 완료해요.

1단계: Kerberos 주체 만들기 (Step 1: Create Kerberos principals)

Pulsar 프록시용 새 주체를 추가해요.

### add Principals for Pulsar Proxy
sudo /usr/sbin/kadmin.local -q 'addprinc -randkey proxy/{hostname}@{REALM}'
sudo /usr/sbin/kadmin.local -q "ktadd -k /etc/security/keytabs/{proxy-keytabname}.keytab proxy/{hostname}@{REALM}"

브로커와 클라이언트에 설정된 주체는 여기를 참고해요.

2단계: 프록시 구성 (Step 2: Configure proxies)

proxy.conf 파일에서 Kerberos 관련 구성을 설정해요.

## related to authenticate client.
authenticationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderSasl
saslJaasClientAllowedIds=.*client.*
saslJaasServerSectionName=PulsarProxy
## related to be authenticated by broker
brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationSasl
brokerClientAuthenticationParameters={"saslJaasClientSectionName":"PulsarProxy", "serverType":"broker"}
forwardAuthorizationCredentials=true

위 예시에서:

  • 첫 번째 부분은 클라이언트와 프록시 사이의 인증과 관련돼요. 이 단계에서 클라이언트는 SASL 클라이언트로, 프록시는 SASL 서버로 동작해요.
  • 두 번째 부분은 프록시와 브로커 사이의 인증과 관련돼요. 이 단계에서 프록시는 SASL 클라이언트로, 브로커는 SASL 서버로 동작해요.

3단계: JAAS 구성 (Step 3: Configure JAAS)

pulsar_jaas.conf 파일에 프록시용 새 섹션을 추가해요. 예시:

 PulsarProxy {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarproxy.keytab"
   principal="proxy/[email protected]";
};

Java 클라이언트에서 Kerberos 인증 구성 (Configure Kerberos authentication in Java clients)

note Pulsar 클라이언트를 시작하는 운영 체제 사용자가 pulsar_jaas.conf 파일에 구성된 keytab과 krb5.conf 파일에 구성된 KDC 서버에 접근할 수 있는지 확인해요.

  1. 클라이언트 애플리케이션에서 프로젝트 의존성에 pulsar-client-auth-sasl을 포함해요.
    <dependency>
      <groupId>org.apache.pulsar</groupId>
      <artifactId>pulsar-client-auth-sasl</artifactId>
      <version>${pulsar.version}</version>
    </dependency>
  1. 인증 유형을 AuthenticationSasl로 구성하고 다음 파라미터를 제공해요.
  • saslJaasClientSectionNamePulsarClient로 설정하고;
  • serverTypebroker로 설정해요. serverType은 이 클라이언트가 브로커 또는 프록시 중 어디에 연결하는지를 나타내요. 클라이언트는 이 파라미터로 어떤 서버 측 주체를 사용해야 하는지를 알아요.

Java 클라이언트 구성 예시는 다음과 같아요.

System.setProperty("java.security.auth.login.config", "/etc/pulsar/pulsar_jaas.conf");
System.setProperty("java.security.krb5.conf", "/etc/pulsar/krb5.conf");
Map<String, String> authParams = Maps.newHashMap();
authParams.put("saslJaasClientSectionName", "PulsarClient");
authParams.put("serverType", "broker");
Authentication saslAuth = AuthenticationFactory
        .create(org.apache.pulsar.client.impl.auth.AuthenticationSasl.class.getName(), authParams);
PulsarClient client = PulsarClient.builder()
        .serviceUrl("pulsar://my-broker.com:6650")
        .authentication(saslAuth)
        .build();

note

  • 프록시용으로 클라이언트를 구성하려면 serverTypebroker 대신 proxy로 설정해야 해요.
  • 위 예시의 처음 두 줄은 하드코딩된 것이에요. 대안으로 애플리케이션을 실행할 때 pulsar_jaas.confkrb5.conf 파일용 추가 JVM 파라미터를 아래처럼 설정할 수 있어요.
java -cp -Djava.security.auth.login.config=/etc/pulsar/pulsar_jaas.conf -Djava.security.krb5.conf=/etc/pulsar/krb5.conf $APP-jar-with-dependencies.jar $CLASSNAME

CLI 도구에서 Kerberos 인증 구성 (Configure Kerberos authentication in CLI tools)

pulsar-admin, pulsar-perf, pulsar-client 같은 커맨드라인 도구는 Pulsar 설치의 conf/client.conf 파일을 사용해요.

커맨드라인 도구를 사용할 때는 다음 단계를 수행해야 해요.

  1. conf/client.conf 파일을 구성해요.
authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationSasl
authParams={"saslJaasClientSectionName":"PulsarClient", "serverType":"broker"}
  1. pulsar_jaas.conf 파일과 krb5.conf 파일에 대한 JVM 파라미터를 추가 옵션으로 설정해요.
-Djava.security.auth.login.config=/etc/pulsar/pulsar_jaas.conf -Djava.security.krb5.conf=/etc/pulsar/krb5.conf

이를 pulsar_tools_env.sh 파일의 PULSAR_EXTRA_OPTS 끝에 추가하거나, OPTS="$OPTS -Djava.security.auth.login.config=/etc/pulsar/pulsar_jaas.conf -Djava.security.krb5.conf=/etc/pulsar/krb5.conf" 줄을 CLI 도구 스크립트에 직접 추가할 수 있어요. 구성의 의미는 Java 클라이언트 섹션의 구성 의미와 같아요.

ZooKeeper와 브로커 사이 Kerberos 인증 구성 (Configure Kerberos authentication between ZooKeeper and broker)

Pulsar 브로커는 ZooKeeper와 인증할 때 Kerberos 클라이언트로 동작해요.

  1. conf/zookeeper.conf에 설정을 추가해요.
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
  1. Pulsar 브로커가 사용하는 pulsar_jaas.confClient 구성 섹션을 추가하려면 다음 명령을 입력해요.
 Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarbroker.keytab"
   principal="broker/[email protected]";
};

이 설정에서 Pulsar 브로커의 주체와 keytab 파일은 ZooKeeper와 인증할 때 브로커의 역할을 나타내요.

자세한 내용은 ZooKeeper 문서를 참고해요.

BookKeeper와 브로커 사이 Kerberos 인증 구성 (Configure Kerberos authentication for BookKeeper and broker)

Pulsar 브로커는 Bookie와 인증할 때 Kerberos 클라이언트로 동작해요.

  1. broker.confbookkeeperClientAuthenticationPlugin 파라미터를 추가해요.
bookkeeperClientAuthenticationPlugin=org.apache.bookkeeper.sasl.SASLClientProviderFactory

SASLClientProviderFactory는 브로커에 BookKeeper SASL 클라이언트를 만들고, 브로커는 만들어진 SASL 클라이언트를 사용해 Bookie 노드와 인증해요.

  1. 브로커/프록시가 사용하는 pulsar_jaas.confBookKeeper 구성 섹션을 추가해요.
 BookKeeper {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarbroker.keytab"
   principal="broker/[email protected]";
};

이 설정에서 Pulsar 브로커의 주체와 keytab 파일은 Bookie와 인증할 때 브로커의 역할을 나타내요.

자세한 내용은 BookKeeper 문서를 참고해요.

더 알아보기 (Learn more)