PaaS/MQ

kafka와 보안 - 권한(ACL)

armyost 2022. 7. 8. 10:19
728x90

권한(ACL)

접근제어 리스트를 만들어 접근제어를 하는 것이다. 혹여 A서비스부서가 B토픽을 사용하는 오류를 방지하기 위해서 적용하는 것이다. 

 

kafka보안의 3단계 중 마지막으로 권한 설정을 해보겠습니다. kafka에서의 권한 설정은 각 유저별로 특정 토픽에 접근을 허용할지 또는 거부할지 등의 설정을 하는 것입니다. kafka의 권한 설정을 위해서는 먼저 브로커의 설정파일을 수정하고 그다음으로는 kafka-acls.sh 명령어를 이용해 유저별 권한을 설정해야 합니다. 

 

1. 브로커 권한 설정

kafka 권한설정을 위해 server.properties파일을 수정해서 브로커의 설정을 변경해보겠습니다. 

# vi $KAFKA_HOME/config/server.properties

-----------
# authorization options 아래 내용 추가
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
super.users=User:admin;User:kafka

해당작업은 모든 브로커에서 동일하게 작업해야 합니다 .위 설정에서 추가한 설정중 authorizer.class.name은 kafka의 권한을 위한 class를 의미하며, 기본 내장된 것을 사용하도록 지정했습니다. super.users는 모든 권한을 갖는 슈퍼유저 권한 유저를 의미하는데, 여기서는 admin과 kafka 유저가 슈퍼유저 입니다. 권한 설정에서는 차단 정책의 우선순위가 가장 높으므로 이점을 참고하기 바랍니다. 이제 재시작 합니다.

# systemctl restart kafka-server

 

2. 유저별 권한 설정

앞서 커버로스와 kafka의 연동 작업을 하면서 유저 principal을 만들었습니다. 권한 설정 테스트를 위해 미리 생성해둔 것이므로, 다음 peter01, peter02, admin 유저를 이용해 ACL 규칙을 만들고 테스트를 수행해보겠습니다. 이번 실습에서 하고자 하는 전체적인 권한 설정사항은 그림 과 같습니다. 

peter01 유저는 peter-test09 토픽에 대해 읽기와 쓰기 가능

peter02 유저는 peter-test10 토픽에 대해 읽기와 쓰기 가능

admin 유저는 peter-test09, peter-test10 토픽에 대해 읽기와 쓰기 가능

 

kafka에서 권한 설정을 위해 제공하는 kafka-acls.sh 명령어를 이용해 다음과 같이 peter01 유저에 대해 ACL 규칙을 생성합니다. 

# $KAFKA_HOME/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=peter-zk01.foo.bar:2181 --add --allow-principal User:peter01 --operation Read --operation Write --operation DESCRIBE --topic peter-test09
# $KAFKA_HOME/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=peter-zk01.foo.bar:2181 --list

 

ACL 정책이 잘 적용됐다면 이제 다음과 같이 peter01 유저의 티켓을 발급받은 후 콘솔프로듀서를 이용해 peter-test09, peter-test10 토픽에게  메시지를 전송해보겠습니다.

# kinit -kt ~/keytabs/peter01.user.keytab peter01
# export KAFKA_OPTS="-Djava.security.auth.login.config=~/kafka_client_jaas.conf"
# $KAFKA_HOME/bin/kafka-console-producer.sh --bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test09 --producer.config kerberos.config
> peter-test09 message!

정상

 

# $KAFKA_HOME/bin/kafka_console-producer.sh ==bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test10 ==producer.config kerberos.config
> peter-test10 message!

peter-test10 메시지의 경우 메시지 전송을 하려고 엔터키를 누르자마자 에러 메시지들이 뜹니다. 에러 내용을 자세히 보면 repet-topic10에 권한이 없다는 메시지 입니다. 즉 peter01 유저는 peter-test10 토픽으로 메시지를 보낼 수 없습니다. 따라서 조금전 적용한 ACL규칙이 잘 적용 된 것임을 알 수 있습니다.

 

# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test09 --from-beginning --consumer.config kerberos.config

peter-test09 토픽에 peter01 유저의 권한 설정을 했으므로 메시지를 가져올 것이라고 예상했지만 예상과 달리 peter-test09 토픽의 메시지를 읽지 못했습니다. 출력 내용을 유심히 살펴보니 콘솔 컨슈머 그룹 네임인 console-consumer-XXXX 에 대한 접근 권한이 없다는 에러 메시지가 보입니다. 왜 이런일이 벌어졌을까요? kafka에서는 리소스 타입으로 권한을 설정하도록 구분되어 있고 컨슈머 그룹에 대한 권한 설정은 그룹리소스 타입의 권한이 필요합니다. 앞서 적용한 ACL 대상은 리소스 타입이 토픽이었고, 그룹 리소스 타입에 대해서는 ACL 규칙을 추가하지 않았기 때문에 peter01 유저가 메시지를 읽을 수 없었습니다. 이제 리소스 그룹에 대한 내용을 알았으니 그룹에 대한 ACL규칙을 추가해 보겠습니다. 특정 컨슈머 그룹 이름으로 한정할 수 도 있지만, 테스트를 위해 모든 컨슈머 그룹이 가능하도록 ACL규칙을 추가하겠습니다.

 

# $KAFKA_HOME/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=peter-zk01.foo.bar:2181 --add --allow-principal User:peter01 --operation Read --group '*'
# $KAFKA_HOME/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=peter-zk01.foo.bar:2191 --list

 

다시 메시지를 가져오면 잘 되는것을 확인할 수 있습니다.

# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server peter-kafka01.foo.bar:9094 --topic peter-test09 --from-beginning --consumer.config kerberos.config

 

위 방식으로 admin 유저에도 확인을 해보면 admin유저는 모든 토픽에 권한이 있습니다. 

'PaaS > MQ' 카테고리의 다른 글

kafka 스키마 레지스트리  (0) 2022.07.08
kafka systemctl 등록  (0) 2022.07.08
kafka와 보안 - 인증(SASL)  (0) 2022.07.08
kafka와 보안 - SSL  (0) 2022.07.06
kafka 브로커 확장하기  (0) 2022.07.06