6.3. 인증
Kafka 클러스터에 대한 클라이언트 연결을 인증하기 위해 다음 옵션을 사용할 수 있습니다.
- TLS 클라이언트 인증
- 암호화된 연결에서 X.509 인증서를 사용하는 TLS(Transport Layer Security)
- Kafka SASL
- 지원되는 인증 메커니즘을 사용하는 Kafka SASL(Simple Authentication and Security Layer)
- OAuth 2.0
- OAuth 2.0 토큰 기반 인증
SASL 인증은 일반 암호화되지 않은 연결 및 TLS 연결에 대한 다양한 메커니즘을 지원합니다.
-
PLAIN
- 사용자 이름 및 암호를 기반으로 하는 인증입니다. -
SCRAM-SHA-256
및SCRAM-SHA-512
- SCRAM(Salted Challenge Response Authentication Mechanism)을 사용한 인증입니다. -
GSSAPI
- Kerberos 서버에 대한 인증입니다.
PLAIN
메커니즘은 암호화되지 않은 형식으로 네트워크를 통해 사용자 이름과 암호를 보냅니다. TLS 암호화와 함께만 사용해야 합니다.
6.3.1. TLS 클라이언트 인증 활성화
Kafka 브로커에서 TLS 클라이언트 인증을 활성화하여 이미 TLS 암호화를 사용하는 Kafka 노드 연결에 대한 보안을 강화합니다.
ssl.client.auth
속성을 사용하여 다음 값 중 하나로 TLS 인증을 설정합니다.
-
none
- TLS 클라이언트 인증이 꺼져 있습니다(기본값) -
요청
됨 - 선택적 TLS 클라이언트 인증 -
필수
- 클라이언트는 TLS 클라이언트 인증서를 사용하여 인증해야 합니다.
클라이언트가 TLS 클라이언트 인증을 사용하여 인증하면 인증된 주체 이름이 클라이언트 인증서에서 고유 이름에서 파생됩니다. 예를 들어 고유 이름이 CN=someuser
인 인증서가 있는 사용자는 CN=someuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown
을 사용하여 인증됩니다. 이 주체 이름은 인증된 사용자 또는 엔티티에 대한 고유 식별자를 제공합니다. TLS 클라이언트 인증을 사용하지 않고 SASL이 비활성화된 경우 주 이름은 기본적으로 ANONYMOUS
입니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
- TLS 암호화가 활성화되어 있습니다.
프로세스
- 사용자 인증서에 서명하는 데 사용되는 CA(Certification Authority)의 공개 키가 포함된 JKS(Java 키 저장소) 신뢰 저장소를 준비합니다.
다음과 같이 모든 클러스터 노드에서 Kafka 구성 속성 파일을 편집합니다.
-
ssl.truststore.location
속성을 사용하여 JKS 신뢰 저장소의 경로를 지정합니다. -
신뢰 저장소가 암호로 보호되는 경우
ssl.truststore.password
속성을 사용하여 암호를 설정합니다. ssl.client.auth
속성을required
로 설정합니다.TLS 클라이언트 인증 구성
ssl.truststore.location=/path/to/truststore.jks ssl.truststore.password=123456 ssl.client.auth=required
-
- Kafka 브로커를 시작합니다.
6.3.2. SASL PLAIN 클라이언트 인증 활성화
Kafka에서 SASL PLAIN 인증을 활성화하여 Kafka 노드 연결에 대한 보안을 강화합니다.
SASL 인증은 KafkaServer
JAAS 컨텍스트를 사용하는 JAAS(Java Authentication and Authorization Service)를 통해 활성화됩니다. 전용 파일에서 또는 Kafka 구성에서 직접 JAAS 구성을 정의할 수 있습니다.
전용 파일의 권장 위치는 /opt/kafka/config/jaas.conf
입니다. kafka
사용자가 파일을 읽을 수 있는지 확인합니다. 모든 Kafka 노드에서 JAAS 구성 파일을 동기화 상태로 유지합니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
프로세스
/opt/kafka/config/jaas.conf
JAAS 구성 파일을 편집하거나 생성하여PlainLoginModule
을 활성화하고 허용된 사용자 이름과 암호를 지정합니다.이 파일이 모든 Kafka 브로커에서 동일한지 확인합니다.
JAAS 구성
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="123456" user_user1="123456" user_user2="123456"; };
다음과 같이 모든 클러스터 노드에서 Kafka 구성 속성 파일을 편집합니다.
-
listener.security.protocol.map
속성을 사용하여 특정 리스너에서 SASL PLAIN 인증을 활성화합니다.SASL_PLAINTEXT
또는SASL_SSL
을 지정합니다. sasl.enabled.mechanisms
속성을PLAIN
으로 설정합니다.SASL 일반 구성
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=PLAIN
-
(re)
KAFKA_OPTS
환경 변수를 사용하여 Kafka 브로커를 시작하여 JAAS 구성을 Kafka 브로커에 전달합니다.su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
6.3.3. SASL SCRAM 클라이언트 인증 활성화
Kafka에서 SASL SCRAM 인증을 활성화하여 Kafka 노드 연결에 대한 보안을 강화합니다.
SASL 인증은 KafkaServer
JAAS 컨텍스트를 사용하는 JAAS(Java Authentication and Authorization Service)를 통해 활성화됩니다. 전용 파일에서 또는 Kafka 구성에서 직접 JAAS 구성을 정의할 수 있습니다.
전용 파일의 권장 위치는 /opt/kafka/config/jaas.conf
입니다. kafka
사용자가 파일을 읽을 수 있는지 확인합니다. 모든 Kafka 노드에서 JAAS 구성 파일을 동기화 상태로 유지합니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
프로세스
/opt/kafka/config/jaas.conf
JAAS 구성 파일을 편집하거나 생성하여ScramLoginModule
을 활성화합니다.이 파일이 모든 Kafka 브로커에서 동일한지 확인합니다.
JAAS 구성
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
다음과 같이 모든 클러스터 노드에서 Kafka 구성 속성 파일을 편집합니다.
-
listener.security.protocol.map
속성을 사용하여 특정 리스너에서 SASL SCRAM 인증을 활성화합니다.SASL_PLAINTEXT
또는SASL_SSL
을 지정합니다. sasl.enabled.mechanisms
옵션을SCRAM-SHA-256
또는SCRAM-SHA-512
로 설정합니다.예를 들면 다음과 같습니다.
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=SCRAM-SHA-512
-
(re)
KAFKA_OPTS
환경 변수를 사용하여 Kafka 브로커를 시작하여 JAAS 구성을 Kafka 브로커에 전달합니다.su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
6.3.4. 여러 SASL 메커니즘 활성화
SASL 인증을 사용하는 경우 둘 이상의 메커니즘을 활성화할 수 있습니다. Kafka는 둘 이상의 SASL 메커니즘을 동시에 사용할 수 있습니다. 여러 메커니즘이 활성화되면 클라이언트가 사용하는 메커니즘을 선택할 수 있습니다.
둘 이상의 메커니즘을 사용하려면 각 메커니즘에 필요한 구성을 설정합니다. 동일한 컨텍스트에 다른 KafkaServer
JAAS 구성을 추가하고 sasl.mechanism.inter.broker.protocol
속성을 사용하여 Kafka 구성에서 하나 이상의 메커니즘을 쉼표로 구분된 목록으로 활성화할 수 있습니다.
두 개 이상의 SASL 메커니즘에 대한 JAAS 구성
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="123456" user_user1="123456" user_user2="123456"; com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/kafka1.hostname.com@EXAMPLE.COM"; org.apache.kafka.common.security.scram.ScramLoginModule required; };
SASL 메커니즘 활성화
sasl.enabled.mechanisms=PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
6.3.5. broker 인증을 위한 SASL 활성화
Kafka 노드 간에 SASL SCRAM 인증을 활성화하여 브루커 간 연결에 대한 보안을 강화합니다. Kafka 클러스터에 대한 클라이언트 연결에 SASL 인증을 사용할 뿐만 아니라broker 간 인증에 SASL을 사용할 수도 있습니다. 클라이언트 연결에 대한 SASL과 달리 상호 통신에 대한 하나의 메커니즘만 선택할 수 있습니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
SCRAM 메커니즘을 사용하는 경우 Kafka 클러스터에 SCRAM 자격 증명을 등록합니다.
Kafka 클러스터의 모든 노드에 대해
kafka-storage.sh
툴을 사용하여__cluster_metadata
항목에 inter-broker SASL SCRAM 사용자를 추가합니다. 이렇게 하면 Kafka 클러스터가 실행되기 전에 인증에 대한 인증 정보가 부트스트랩을 위해 업데이트됩니다.broker SASL SCRAM 사용자 등록
bin/kafka-storage.sh format \ --config /opt/kafka/config/kraft/server.properties \ --cluster-id 1 \ --release-version 3.7 \ --add-scram 'SCRAM-SHA-512=[name=kafka, password=changeit]' \ --ignore formatted
프로세스
sasl.mechanism.inter.broker.protocol
속성을 사용하여 Kafka 구성에서 inter-broker SASL 메커니즘을 지정합니다.broker SASL 메커니즘
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
username
및 password 필드를 사용하여KafkaServer
JAAS 컨텍스트에서broker 간 통신의 사용자 이름과암호를
지정합니다.broker JAAS 컨텍스트
KafkaServer { org.apache.kafka.common.security.plain.ScramLoginModule required username="kafka" password="changeit" # ... };
6.3.6. SASL SCRAM 사용자 추가
이 절차에서는 Kafka의 SASL SCRAM을 사용하여 인증에 대한 새 사용자를 등록하는 단계를 간략하게 설명합니다. SASL SCRAM 인증은 클라이언트 연결의 보안을 향상시킵니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
- SASL SCRAM 인증이 활성화됩니다.
프로세스
kafka-configs.sh
도구를 사용하여 새 SASL SCRAM 사용자를 추가합니다./opt/kafka/kafka-configs.sh \ --bootstrap-server <broker_host>:<port> \ --alter \ --add-config 'SCRAM-SHA-512=[password=<password>]' \ --entity-type users --entity-name <username>
예를 들면 다음과 같습니다.
/opt/kafka/kafka-configs.sh \ --bootstrap-server localhost:9092 \ --alter \ --add-config 'SCRAM-SHA-512=[password=123456]' \ --entity-type users \ --entity-name user1
6.3.7. SASL SCRAM 사용자 삭제
이 절차에서는 Kafka의 SASL SCRAM을 사용하여 인증에 등록된 사용자를 제거하는 단계를 간략하게 설명합니다.
사전 요구 사항
- Apache Kafka의 스트림 은 각 호스트에 설치되고 구성 파일을 사용할 수 있습니다.
- SASL SCRAM 인증이 활성화됩니다.
프로세스
kafka-configs.sh
도구를 사용하여 SASL SCRAM 사용자를 삭제합니다./opt/kafka/bin/kafka-configs.sh \ --bootstrap-server <broker_host>:<port> \ --alter \ --delete-config 'SCRAM-SHA-512' \ --entity-type users \ --entity-name <username>
예를 들면 다음과 같습니다.
/opt/kafka/bin/kafka-configs.sh \ --bootstrap-server localhost:9092 \ --alter \ --delete-config 'SCRAM-SHA-512' \ --entity-type users \ --entity-name user1
6.3.8. Kerberos(GSSAPI) 인증 활성화
Apache Kafka용 스트림은 Kafka 클러스터에 대한 보안 SSO(Single Sign-On) 액세스를 위해 Kerberos(GSSAPI) 인증 프로토콜 사용을 지원합니다. GSSAPI는 Kerberos 기능을 위한 API 래퍼로, 기본 구현 변경 사항에서 애플리케이션을 격리합니다.
Kerberos는 대칭 암호화 및 신뢰할 수 있는 타사인 KDC(Kerberos Key Distribution Centre)를 사용하여 클라이언트와 서버가 서로 인증할 수 있는 네트워크 인증 시스템입니다.
다음 절차에서는 Kafka 클라이언트가 Kerberos(GSSAPI) 인증을 사용하여 Kafka에 액세스할 수 있도록 Apache Kafka용 Streams를 구성하는 방법을 보여줍니다.
이 절차에서는 Kerberos krb5 리소스 서버가 Red Hat Enterprise Linux 호스트에 설정되어 있다고 가정합니다.
이 절차에서는 예제를 사용하여 다음을 구성하는 방법을 보여줍니다.
- 서비스 주체
- Kerberos 로그인을 사용하는 Kafka 브로커
- Kerberos 인증을 사용하여 Kafka에 액세스할 수 있는 생산자 및 소비자 클라이언트
지침은 생산자 및 소비자 클라이언트에 대한 추가 구성으로 단일 호스트에서 Kafka 설치에 대한 Kerberos 설정을 설명합니다.
사전 요구 사항
Kerberos 인증 정보를 인증하고 권한을 부여하도록 Kafka를 구성하려면 다음이 필요합니다.
- Kerberos 서버에 액세스
- 각 Kafka 브로커 호스트의 Kerberos 클라이언트
인증을 위한 서비스 주체 추가
Kerberos 서버에서 Kafka 브로커 및 Kafka 생산자 및 소비자 클라이언트를 위한 서비스 주체(사용자)를 생성합니다. 서비스 주체는 SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-REALM 양식을 사용해야 합니다.
Kerberos KDC를 통해 주 키를 저장하는 keytab과 서비스 주체를 생성합니다.
Kerberos 주체의 도메인 이름이 대문자인지 확인합니다.
예를 들면 다음과 같습니다.
-
kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
호스트에 디렉터리를 만들고 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 로그인을 사용하도록 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/kraft/server.properties
- 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
,kinit
,klist
,kdestroy