PaaS/MQ

kafka SASL 인증 구축하기

armyost 2022. 7. 14. 13:46
728x90

※오타주의! 오타하나에 매우 민감한 작업임.. 

 

우선 시작전에 인스턴스 구성을 설명하겠다.

  • peter-zk01.foo.bar : kerberos Server (원래 이용도가 아닌데, 자원이 없어서..)
  • peter-kafka01.foo.bar : broker Server
  • 아무 Server : Client용 Server 

최소 3대가 필요하고, broker가 replication으로 다중으로 운영된다면 broker는 여러개 여도 된다.

kerberos Server는 별도로 빼도 되고 그냥 broker서버에다가 같이 올려도 잘돌아간다. 당연히 운영을 생각한다면 분리하는것이 맞지만, 테스트용이라면 같이해도 무방

 

Kerberos 서버 세팅은 내가 공부한 책의 github에 있는 ansible-playbook를 실행하길 바란다. 

git으로 다음 소스를 받자

https://github.com/onlybooks/kafka2/tree/main/chapter2/ansible_playbook/

 

GitHub - onlybooks/kafka2: 실전 카프카 개발부터 운영까지

실전 카프카 개발부터 운영까지. Contribute to onlybooks/kafka2 development by creating an account on GitHub.

github.com

 

Kerberos Server 작업

playbook을 실행시켜 Kerberos Server를 설치하고 환경설정까지 자동으로 진행한다.

# ansible-playbook -i hosts kerberos.yml

 

 

인증정보를 갖고 있는 keytab을 생성하자

우선 principal이란 것을 등록

# kadmin.local -q "add_principal -randkey peter01@FOO.BAR"
# kadmin.local -q "add_principal -randkey peter02@FOO.BAR"
# kadmin.local -q "add_principal -randkey admin@FOO.BAR"

# kadmin.local -q "add_principal -randkey kafka/peter-kafka01.foo.bar@FOO.BAR"
# kadmin.local -q "add_principal -randkey kafka/peter-kafka02.foo.bar@FOO.BAR"
# kadmin.local -q "add_principal -randkey kafka/peter-kafka03.foo.bar@FOO.BAR"


-------------------------- 혹시 잘못해서 지울때는 ---------------------
# kadmin.local -q "delete_principal -force peter01@FOO.BAR"
# kadmin.local -q "delete_principal -force peter02@FOO.BAR"
# kadmin.local -q "delete_principal -force admin@FOO.BAR"

# kadmin.local -q "delete_principal -force kafka/peter-kafka01.foo.bar@FOO.BAR"
# kadmin.local -q "delete_principal -force kafka/peter-kafka02.foo.bar@FOO.BAR"
# kadmin.local -q "delete_principal -force kafka/peter-kafka03.foo.bar@FOO.BAR"

 

keytab 파일을 생성

# mkdir -p ~/keytabs
# kadmin.local -q "ktadd -k /root/keytabs/peter01.user.keytab peter01@FOO.BAR"
# kadmin.local -q "ktadd -k /root/keytabs/peter02.user.keytab peter02@FOO.BAR"
# kadmin.local -q "ktadd -k /root/keytabs/admin.user.keytab admin@FOO.BAR"

# kadmin.local -q "ktadd -k /root/keytabs/peter-kafka01.service.keytab kafka/peter-kafka01.foo.bar@FOO.BAR" 
# kadmin.local -q "ktadd -k /root/keytabs/peter-kafka02.service.keytab kafka/peter-kafka02.foo.bar@FOO.BAR" 
# kadmin.local -q "ktadd -k /root/keytabs/peter-kafka03.service.keytab kafka/peter-kafka03.foo.bar@FOO.BAR"

 

방금 생성한 keytab들을 broker와 client로 옮기자

# scp -r /root/keytabs root@192.168.122.13:/root/ 
# scp -r /root/keytabs root@192.168.122.14:/root/

 

Broker Server 작업

우선 kerberos 통신이 가능토록 라이브러리 및 기타 관련 모듈을 설치하자

# yum install krb5-workstation krb5-libs krb5-auth-dialog

 

kerberos Server의 /etc/krb5.conf와 동일하게 broker Server도 맞춘다. 복붙하자.

# vi /etc/krb5.conf

 

받아온 keytab 들이 잘 적용되는지 테스트 해본다. 그리고 최종적으로 service keytab을 활성화 시킨다.

# kinit -kt /root/keytabs/keytabs/peter01.user.keytab peter01
# klist
# kinit -kt /root/keytabs/peter-kafka01.service.keytab kafka/peter-kafka01.foo.bar
# klist

 

Kafka Server 환경설정을 진행한다. 

# vi /root/kafka_2.12-3.2.0/config/server.properties

-----------------------------------------------------
listeners=PLAINTEXT://:9092,SASL_PLAINTEXT://:9094
advertised.listeners=PLAINTEXT://192.168.122.12:9092,SASL_PLAINTEXT://peter-kafka01.foo.bar:9094

security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=kafka

 

Kafka Server용 JAAS를 만든다

# vi /root/kafka_2.12-3.2.0/config/kafka_server_jaas.conf
---------------------------------------------------------------------
KafkaServer {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        storeKey=true
        keyTab="/root/keytabs/peter-kafka01.service.keytab"
        principal="kafka/peter-kafka01.foo.bar@FOO.BAR";
};

 

이제 Kafka Server를 재기동하고 :9094포트가 정상 LISTEN하는지 확인하자

# KAFKA_OPTS="-Djava.security.auth.login.config=/root/kafka_2.12-3.2.0/config/kafka_server_jaas.conf" /root/kafka_2.12-3.2.0/bin/kafka-server-start.sh -daemon /root/kafka_2.12-3.2.0/config/server.properties

 

Client 작업

우선 kerberos 통신이 가능토록 라이브러리 및 기타 관련 모듈을 설치하자

# yum install krb5-workstation krb5-libs krb5-auth-dialog

 

kerberos Server의 /etc/krb5.conf와 동일하게 Client도 맞춘다. 복붙하자.

# vi /etc/krb5.conf

 

Client용 JAAS를 생성하자

vi /root/kafka_client_jaas.conf
-----------------------------------------------------------
KafkaClient {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        storeKey=true
        serviceName="kafka"
        keyTab="/root/keytabs/peter01.user.keytab"
        principal="peter01@FOO.BAR";
};

 

kerberos.config를 생성하자

#vi /root/kerberos.config
----------------------------------------------
sasl.mechanism=GSSAPI
security.protocol=SASL_PLAINTEXT

 

keytab정보를 한번더 갱신하자

# kinit -kt /root/keytabs/peter01.user.keytab peter01
# klist

 

이제 producer 로 message를 생성해보자

# KAFKA_OPTS="-Djava.security.auth.login.config=/root/kafka_client_jaas.conf" /root/kafka_2.12-3.2.0/bin/kafka-console-producer.sh --bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test07 --producer.config /root/kerberos.config

 

consumer도 켜놓자

# KAFKA_OPTS="-Djava.security.auth.login.config=/root/kafka_client_jaas.conf" /root/kafka_2.12-3.2.0/bin/kafka-console-consumer.sh --bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test07 --consumer.config /root/kerberos.config