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 설치·구성 방법은 Ubuntu와 Redhat을 참고해요. - 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"}값으로 설정해요. 여기서PulsarClient는pulsar_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:62037은EXAMPLE.COMRealm의 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 서버에 접근할 수 있는지 확인해요.
- 클라이언트 애플리케이션에서 프로젝트 의존성에
pulsar-client-auth-sasl을 포함해요.
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client-auth-sasl</artifactId>
<version>${pulsar.version}</version>
</dependency>
- 인증 유형을
AuthenticationSasl로 구성하고 다음 파라미터를 제공해요.
saslJaasClientSectionName을PulsarClient로 설정하고;serverType을broker로 설정해요.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
- 프록시용으로 클라이언트를 구성하려면
serverType을broker대신proxy로 설정해야 해요.- 위 예시의 처음 두 줄은 하드코딩된 것이에요. 대안으로 애플리케이션을 실행할 때
pulsar_jaas.conf와krb5.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 파일을 사용해요.
커맨드라인 도구를 사용할 때는 다음 단계를 수행해야 해요.
conf/client.conf파일을 구성해요.
authPlugin=org.apache.pulsar.client.impl.auth.AuthenticationSasl
authParams={"saslJaasClientSectionName":"PulsarClient", "serverType":"broker"}
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 클라이언트로 동작해요.
conf/zookeeper.conf에 설정을 추가해요.
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
- Pulsar 브로커가 사용하는
pulsar_jaas.conf에Client구성 섹션을 추가하려면 다음 명령을 입력해요.
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 클라이언트로 동작해요.
broker.conf에bookkeeperClientAuthenticationPlugin파라미터를 추가해요.
bookkeeperClientAuthenticationPlugin=org.apache.bookkeeper.sasl.SASLClientProviderFactory
SASLClientProviderFactory는 브로커에 BookKeeper SASL 클라이언트를 만들고, 브로커는 만들어진 SASL 클라이언트를 사용해 Bookie 노드와 인증해요.
- 브로커/프록시가 사용하는
pulsar_jaas.conf에BookKeeper구성 섹션을 추가해요.
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)
- 인증의 기본 개념은 Security overview 문서에서 확인해요.
- 권한 부여 설정은 Authorization 문서를 참고해요.
- CLI 도구 종류는 CLI tools 문서를 살펴봐요.