Kafka
[Kafka] kafka SASL / SCRAM 인증, kafka-acls 권한 설정
흥부가귀막혀
2022. 3. 14. 15:56
개요 및 고려 사항
- SCRAM (Salted Challenge Response Authentication Mechanism) 또는 SASL / SCRAM은 PLAIN과 같은 사용자 이름 / 암호 인증을 수행하는 기존 메커니즘의 보안 문제를 해결하는 SASL 메커니즘.
- Apache Kafka는 SCRAM-SHA-256 및 SCRAM-SHA-512을 지원.
- Kafka의 SCRAM 구현은 ZooKeeper에 SCRAM 자격 증명을 저장하기 때문에 ZooKeeper가 개인 네트워크에 있을때 사용하는것을 권장
- runtime 으로 zookeeper 에 사용자에 대한 SCRAM 자격 증명을 생성할 수 있다.
super user 생성
- ${KAFKA_HOME}/bin/kafka-configs.sh 를 통해 super user 생성
$ ./kafka-configs.sh --zookeeper $ZOOKEEPER:2181 --alter --add-config 'SCRAM-SHA-256=[password=super-user-password]' --entity-type users --entity-name super-user-id
Completed Updating config for entity: user-principal 'super-user-id'.
ANONYMOUS user 권한 추가
- 기존에 보안설정을 안한 상태로 유지를 하고있다면 해당 권한 설정을 해주는게 좋다.(아니면 allow.everyone.if.no.acl.found=true 설정을 broker properties 에 해도 되는데 그럴경우 기존 운영했던 port 를 종료할때 broker 를 다시 시작해야한다.)
- authorizer 를 정의하게 되면 기존 운영중인 9092 포트로 들어온 요청도 인증을 타게되어 ANONYMOUS user 로 인증이 되 유입되게 되는데 해당 user 에 대한 권한 설정을 해주지 않으면 broker 와 client 의 operation이 모두 denied 처리 되버린다.
* cluster resource 권한 추가(broker 를 위한 설정)
$ ./kafka-configs.sh --authorizer-properties zookeeper.connect=$ZOOKEEPER --add --allow-principal User:ANONYMOUS --operation "ALL" --cluster
* topic/group resource 권한 추가(client 를 위한 설정)
$ ./kafka-configs.sh --authorizer-properties zookeeper.connect=$ZOOKEEPER --add --allow-principal User:ANONYMOUS --operation "ALL" --topic "*" --group="*"
broker 설정
- 각 kafka broker 에 jaas config 파일을 생성(kafka_server_jaas.conf)
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="super-user-id"
password="super-user-id-password";
};
- broker 실행 옵션에 -Djava.security.auth.login.config={path to jaas conf}/kafka_server_jaas.conf 설정 추가하여 재시작
- kafka server.properties 파일에 SASL/SCRAM 메커니즘 활성을 위한 설정 추가
# List of enabled mechanisms, can be more than one
sasl.enabled.mechanisms=SCRAM-SHA-256 # or SCRAM-SHA-512
# Specify one of of the SASL mechanisms
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 # or SCRAM-SHA-512
- 브로커 간 통신에 SASL을 사용하여 통신할거라면 server.properties 에 아래 설정을 추가
- SASL_SSL: SSL 암호화를 사용하는 경우
- SASL_PLAINTEXT: SSL 암호화를 사용하지 않는 경우
security.inter.broker.protocol=SASL_PLAINTEXT # or SASL_SSL
- 클라이언트 및 브로커 간 SASL연결을 어떻게 할것인지 server.properties 에 설정
listeners=SASL_PLAINTEXT://brokerhost1:9092
- 보안설정 없이 동작하는 client 를 위해 기존 PLAINTEXT 도 유지를 하고자 한다면 server.properties 를 아래와 같이 설정
# 9093 포트로 진입시에만 SASL 사용
listeners=PLAINTEXT://brokerhost1:9092,SASL_PLAINTEXT://brokerhost1:9093
advertised.listeners=PLAINTEXT://brokerhost1:9092,SASL_PLAINTEXT://brokerhost1:9093
- acl 권한 체크 활성화를 위해 server.properties 에 아래와 같이 설정
# ssl 설정을 할 경우 아래 설정 추가
# ssl.client.auth=requested
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
# client 에 보안 설정이 되어있지 않을 경우 User:ANONYMOUS 로 요청이 들어오게 되는데, 에러가 발생되지 않도록 잠시 super 유저로 설정
super.users=User:kafka-admin;User:ANONYMOUS
# 초기 보안 설정 구축시 보안 설정이 되어있지 않은 client 에서도 정상동작을 원한다면 아래 설정을 추가하는것도 방법
allow.everyone.if.no.acl.found=true
client
- 각 client 의 properties 파일에 아래 설정을 추가
security.protocol=SASL_PLAINTEXT # or SASL_SSL
sasl.mechanism=SCRAM-SHA-256 # or SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="userid" password="user password";
권한 추가
- ${KAFKA_HOME}/bin/kafka-configs.sh 를 통해 계정 생성
$ ./kafka-configs.sh --zookeeper $ZOOKEEPER:2181 --alter --add-config 'SCRAM-SHA-256=[password=demo!23]' --entity-type users --entity-name demo
Completed Updating config for entity: user-principal 'demo'.
- ${KAFKA_HOME}/bin/kafka-acls.sh 스크립트를 통해 권한 추가
예) demo 계정이 test 토픽으로 접근시 모든 group 에 대해 읽기 권한 추가
$ ./kafka-acls.sh --authorizer-properties zookeeper.connect=$ZOOKEEPER:2181 --add --allow-principal User:demo --operation read --topic test --group='*'
Adding ACLs for resource `Topic:LITERAL:test`:
User:demo has Allow permission for operations: Read from hosts: *
Adding ACLs for resource `Group:LITERAL:*`:
User:demo has Allow permission for operations: Read from hosts: *
Current ACLs for resource `Topic:LITERAL:test`:
User:demo has Allow permission for operations: Read from hosts: *
Current ACLs for resource `Group:LITERAL:*`:
User:demo has Allow permission for operations: Read from hosts: *