13장. Kerberos(GSSAPI) 인증 사용
AMQ Streams는 Kafka 클러스터에 대한 보안 SSO(Single Sign-On) 액세스를 위해 Kerberos(GSSAPI) 인증 프로토콜 사용을 지원합니다. GSSAPI는 Kerberos 기능을 위한 API 래퍼로, 기본 구현 변경 사항에서 애플리케이션을 격리합니다.
Kerberos는 대칭 암호화 및 신뢰할 수 있는 타사인 KDC(Kerberos Key Distribution Centre)를 사용하여 클라이언트와 서버가 서로 인증할 수 있는 네트워크 인증 시스템입니다.
13.1. Kerberos(GSSAPI) 인증을 사용하도록 AMQ Streams 설정
다음 절차에서는 Kafka 클라이언트가 Kerberos(GSSAPI) 인증을 사용하여 Kafka 및 Zoo Cryostat에 액세스할 수 있도록 AMQ Streams를 구성하는 방법을 보여줍니다.
이 절차에서는 Kerberos krb5 리소스 서버가 Red Hat Enterprise Linux 호스트에 설정되어 있다고 가정합니다.
이 절차에서는 예제를 사용하여 다음을 구성하는 방법을 보여줍니다.
- 서비스 주체
- Kerberos 로그인을 사용하는 Kafka 브로커
- Kerberos 로그인을 사용하는 Zookeeper
- Kerberos 인증을 사용하여 Kafka에 액세스할 수 있는 생산자 및 소비자 클라이언트
지침은 생산자 및 소비자 클라이언트에 대한 추가 구성으로 단일 호스트에 단일 Zoo Cryostat 및 Kafka 설치에 대해 설정된 Kerberos를 설명합니다.
사전 요구 사항
Kerberos 자격 증명을 인증하고 인증하도록 Kafka 및 Zoo Cryostat를 구성하려면 다음이 필요합니다.
- Kerberos 서버에 액세스
- 각 Kafka 브로커 호스트의 Kerberos 클라이언트
Kerberos 서버 설정 단계에 대한 자세한 내용 및 브로커 호스트에 클라이언트를 보려면 RHEL 설정 구성의 예제 Kerberos 를 참조하십시오.
인증을 위한 서비스 주체 추가
Kerberos 서버에서 Zoo Cryostat, Kafka 브로커 및 Kafka 생산자 및 소비자 클라이언트에 대한 서비스 주체(사용자)를 생성합니다.
서비스 주체는 SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-REALM 양식을 사용해야 합니다.
Kerberos KDC를 통해 주 키를 저장하는 keytab과 서비스 주체를 생성합니다.
예를 들면 다음과 같습니다.
-
zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
Zoo Cryostat 서비스 주체는 Kafka
config/server.properties
파일의zookeeper.connect
구성과 동일한 호스트 이름을 사용해야 합니다.zookeeper.connect=node1.example.redhat.com:2181
호스트 이름이 동일하지 않으면 localhost 가 사용되고 인증이 실패합니다.
-
호스트에 디렉터리를 만들고 keytab 파일을 추가합니다.
예를 들면 다음과 같습니다.
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytab
kafka
사용자가 디렉터리에 액세스할 수 있는지 확인합니다.chown kafka:kafka -R /opt/kafka/krb5
Kerberos 로그인을 사용하도록 Zoo Cryostat 구성
Zookeeper를 위해 이전에 생성된 사용자 주체 및 키탭을 사용하여 인증에 Kerberos KDC(Key Distribution Center)를 사용하도록 Zoo Cryostat를 구성합니다
.
opt/kafka/config/jaas.conf
파일을 생성하거나 수정하여 Zoo Cryostat 클라이언트 및 서버 작업을 지원합니다.Client { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true 1 storeKey=true 2 useTicketCache=false 3 keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" 4 principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; 5 }; Server { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumServer { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumLearner { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };
- 1
- 키탭에서 기본 키를 가져오려면
true
로 설정합니다. - 2
- 기본 키를 저장하려면
true
로 설정합니다. - 3
- 티켓 캐시에서 티켓 부여 티켓(TGT)을 받으려면
true
로 설정합니다. - 4
keyTab
속성은 Kerberos KDC에서 복사한 키탭 파일의 위치를 가리킵니다. 위치와 파일은kafka
사용자가 읽을 수 있어야 합니다.- 5
principal
속성은SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-NAME
형식을 따르는 KDC 호스트에서 생성된 정규화된 주체 이름과 일치하도록 구성됩니다.
업데이트된 JAAS 구성을 사용하도록
opt/kafka/config/zookeeper.properties
를 편집합니다.# ... requireClientAuthScheme=sasl jaasLoginRenew=3600000 1 kerberos.removeHostFromPrincipal=false 2 kerberos.removeRealmFromPrincipal=false 3 quorum.auth.enableSasl=true 4 quorum.auth.learnerRequireSasl=true 5 quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner 6 quorum.auth.server.loginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST 7 quorum.cnxn.threads.size=20
- 1
- 로그인 갱신 빈도를 밀리초 단위로 제어하며 티켓 갱신 간격에 맞게 조정할 수 있습니다. 기본값은 1시간입니다.
- 2
- 호스트 이름이 로그인 주체 이름의 일부로 사용되는지 여부를 지정합니다. 클러스터의 모든 노드에 단일 키탭을 사용하는 경우
true
로 설정됩니다. 그러나 문제 해결을 위해 각 브로커 호스트에 대해 별도의 keytab과 정규화된 주체를 생성하는 것이 좋습니다. - 3
- Kerberos 협상의 주체 이름에서 영역 이름이 제거되는지 여부를 제어합니다. 이 설정을
false
로 설정하는 것이 좋습니다. - 4
- Zoo Cryostat 서버 및 클라이언트에 대한 SASL 인증 메커니즘을 활성화합니다.
- 5
RequireSasl
속성은 마스터 선택과 같은 쿼럼 이벤트에 SASL 인증이 필요한지 여부를 제어합니다.- 6
loginContext
속성은 지정된 구성 요소의 인증 구성에 사용되는 JAAS 구성에서 로그인 컨텍스트의 이름을 식별합니다. loginContext 이름은opt/kafka/config/jaas.conf
파일의 관련 섹션 이름에 해당합니다.- 7
- 식별에 사용되는 보안 주체 이름을 구성하는 데 사용할 이름 지정 규칙을 제어합니다.Controls the naming convention to be used to form the principal name used for identification. 자리 표시자
_HOST
는 런타임 시server.1
속성에 정의된 호스트 이름으로 자동으로 확인됩니다.
JVM 매개변수로 Zoo Cryostat를 시작하여 Kerberos 로그인 구성을 지정합니다.
su - kafka export EXTRA_ARGS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
기본 서비스 이름( Zookeeper )을 사용하지 않는 경우
-Dzookeeper.sasl.client.username=NAME
매개변수를 사용하여 이름을 추가합니다.참고/etc/krb5.conf
위치를 사용하는 경우 Zoo Cryostat, Kafka 또는 Kafka 생산자 및 소비자를 시작할 때-Djava.security.krb5.conf=/etc/krb5.conf
를 지정할 필요가 없습니다.
Kerberos 로그인을 사용하도록 Kafka 브로커 서버 구성
이전에 kafka
용으로 생성된 사용자 주체 및 키탭을 사용하여 인증에 KDC(Kerberos Key Distribution Center)를 사용하도록 Kafka를 구성합니다.
다음 요소를 사용하여
opt/kafka/config/jaas.conf
파일을 수정합니다.KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; KafkaClient { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };
리스너가 SASL/GSSAPI 로그인을 사용하도록
config/server.properties
파일에서 리스너 구성을 수정하여 Kafka 클러스터에서 각 브로커를 구성합니다.SASL 프로토콜을 리스너의 보안 프로토콜 맵에 추가하고 원하지 않는 프로토콜을 제거합니다.
예를 들면 다음과 같습니다.
# ... broker.id=0 # ... listeners=SECURE://:9092,REPLICATION://:9094 1 inter.broker.listener.name=REPLICATION # ... listener.security.protocol.map=SECURE:SASL_PLAINTEXT,REPLICATION:SASL_PLAINTEXT 2 # .. sasl.enabled.mechanisms=GSSAPI 3 sasl.mechanism.inter.broker.protocol=GSSAPI 4 sasl.kerberos.service.name=kafka 5 ...
- 1
- 두 개의 리스너: 클라이언트와의 범용 통신을 위한 보안 리스너( communication을 위해 TLS 지원) 및 브루커 간 통신을 위한 복제 리스너가 구성됩니다.
- 2
- TLS 지원 리스너의 경우 프로토콜 이름은 SASL_PLAINTEXT입니다. TLS 지원 커넥터의 경우 프로토콜 이름은 SASL_PLAINTEXT입니다. SSL이 필요하지 않은 경우
ssl.*
속성을 제거할 수 있습니다. - 3
- Kerberos 인증을 위한 SASL 메커니즘은
GSSAPI
입니다. - 4
- 브랜드 간 통신을 위한 Kerberos 인증.
- 5
- 인증 요청에 사용되는 서비스의 이름은 동일한 Kerberos 구성을 사용하는 다른 서비스와 구별하기 위해 지정됩니다.
JVM 매개변수를 사용하여 Kafka 브로커를 시작하여 Kerberos 로그인 구성을 지정합니다.
su - kafka export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
브로커 및 Zoo Cryostat 클러스터가 이전에 구성되어 Kerberos 기반 인증 시스템으로 작업하는 경우 Zoo Cryostat 및 브로커 클러스터를 시작하고 로그에서 구성 오류를 확인할 수 있습니다.
브로커 및 Zookeeper 인스턴스를 시작한 후 이제 Kerberos 인증을 위해 클러스터가 구성됩니다.
Kerberos 인증을 사용하도록 Kafka 생산자 및 소비자 클라이언트 구성
producer1
및 consumer1
을 위해 이전에 생성된 사용자 주체 및 keytab을 사용하여 인증에 Kerberos KMS(Key Distribution Center)를 사용하도록 Kafka 생산자 및 소비자 클라이언트를 구성합니다.
Kerberos 구성을 생산자 또는 소비자 구성 파일에 추가합니다.
예를 들면 다음과 같습니다.
/opt/kafka/config/producer.properties
# ... sasl.mechanism=GSSAPI 1 security.protocol=SASL_PLAINTEXT 2 sasl.kerberos.service.name=kafka 3 sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ 4 useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/producer1.keytab" \ principal="producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # ...
/opt/kafka/config/consumer.properties
# ... sasl.mechanism=GSSAPI security.protocol=SASL_PLAINTEXT sasl.kerberos.service.name=kafka sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/consumer1.keytab" \ principal="consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # ...
클라이언트를 실행하여 Kafka 브로커에서 메시지를 보내고 받을 수 있는지 확인합니다.
생산자 클라이언트:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-producer.sh --producer.config /opt/kafka/config/producer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
소비자 클라이언트:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
추가 리소스
- Kerberos 도움말 페이지: krb5.conf(5), kinit(1), klist(1) 및 kdestroy(1)
- RHEL의 Kerberos 서버 설정 구성 예
- Kerberos 티켓을 사용하여 Kafka 클러스터로 인증하는 클라이언트 애플리케이션의 예