Kafka Security
Kafka의 인증, 인가를 분석한다.
1. Kafka Security Protocol
Kafka에서 제공하는 Security Protocol은 다음과 같다. 여기서 Security Protocol은 Kafka에 접근하기 위한 인증과 Network 구간 암호화 방식을 결정한다.
PLAINTEXT: 인증을 수행하지 않고, Network 구간 암호화를 수행하지 않는다.SSL: 인증을 수행하지 않고, Network 구간을 SSL로 암호화한다.SASL_PLAINTEXT: SASL을 이용하여 인증을 수행하고, Network 구간 암호화를 수행하지 않는다.SASL_SSL: SASL을 이용하여 인증을 수행하고, Network 구간을 SSL로 암호화한다.
1.1. SASL (Simple Authentication and Security Layer)
SASL은 Kafka에서 이용하는 인증 기법을 의미한다. 다음과 같은 Mechanism을 이용하여 인증을 수행할 수 있다.
PLAIN: Username과 Password를 이용하여 인증을 수행한다. Username과 Password가 그대로 Kafka에 전송되는 방식이기 때문에, SSL로 Network 구간을 암호화하지 않으면 Username과 Password가 그대로 노출된다.SCRAM-SHA-256,SCRAM-SHA-512: Username과 Password를 이용하여 인증을 수행한다. Username과 Password를 SCRAM (Salted Challenge Response Authentication Mechanism) 방식으로 암호화하여 Kafka에 전송한다.GSSAPI: Kerberos를 이용하여 인증을 수행한다.OAUTHBEARER: OAuth 2.0을 이용하여 인증을 수행한다.
1.2. Kafka Config Examples
Security Protocol과 SASL Mechanism 설정에 따른 Kafka의 Config와 Producer/Consumer의 Config를 예시는 다음과 같다.
1.2.1. Security Protocol : PLAINTEXT
| |
[Config 1]은 Security Protocol이 PLAINTEXT인 경우의 Kafka의 server.properties 예시를 나타내고 있다. Listener와 Inter-Broker Communication Protocol을 PLAINTEXT로 설정하고 있는걸 확인할 수 있다.
| |
[Config 2]는 Security Protocol이 PLAINTEXT인 경우의 Producer/Consumer Config 예시를 나타낸다. bootstrap.servers에 Kafka Broker의 외부 주소인 external.broker.com:9092로 설정하고 있는걸 확인할 수 있으며, 별도의 인증 설정이 없기 때문에 별도의 인증 정보를 전달하지 않는다.
1.2.2. Security Protocol : SASL_PLAINTEXT, SASL : PLAIN
| |
[Config 3]는 Security Protocol이 SASL_PLAINTEXT이고 SASL Mechanism이 PLAIN인 경우의 Kafka의 server.properties 예시를 나타내고 있다. Listener와 Inter-Broker Communication Protocol을 SASL_SSL로 설정하고 있으며, SASL Mechanism을 PLAIN으로 설정하고 있는걸 확인할 수 있다. 또한 Username과 Password를 설정하고 있는것도 확인할 수 있다. username과 password는 Kafka Broker 사이에 인증을 위한 Admin User/Password를 의미하며, user_[username]은 해당 User의 Password를 의미한다.
| |
[Config 4]는 Producer/Consumer Config 예시를 나타내고 있다. security.protocol과 sasl.mechanism을 SASL_SSL과 PLAIN으로 설정하고 있으며, Username과 Password를 설정하고 있는걸 확인할 수 있다.
2. Kafka ACL (Access Control List)
| |
Kafka의 ACL을 이용해서 각 User가 접근할 수 있는 Topic과 Operation을 제한할 수 있다. [Config 5]는 ACL을 활성화하기 위한 Kafka server.properties 예시를 나타내고 있다. authorizer.class.name을 kafka.security.authorizer.AclAuthorizer로 설정해야 Kafka가 ACL을 이용할 수 있다. super.users는 ACL을 무시하고 Kafka에 접근할 수 있는 Super User를 지정할때 이용한다. allow.everyone.if.no.acl.found는 ACL이 없을 때 기본 동작을 지정할때 이용하며 false로 설정하면 ACL이 없을 때 접근을 거부한다.
| |
[Shell 6]는 Kafka에 User의 ACL을 추가하기 위한 Command 예시를 나타내고 있다. bootstrap-server에 Kafka Broker의 주소를 지정하고, add로 ACL을 추가거나 remove로 ACL을 삭제하고, allow-principal에 User를 지정하고, operation에 Operation을 지정하고, topic에 Topic을 지정하면 된다. 지원하는 Operation은 다음과 같다.
Read: Topic으로 부터 Message를 읽을 수 있는 권한을 부여한다.Write: Topic에 Message를 쓸 수 있는 권한을 부여한다.Describe: Topic의 정보를 조회할 수 있는 권한을 부여한다.Create: Topic이나 Consumer Group을 생성할 수 있는 권한을 부여한다.Delete: Topic이나 Consumer Group을 삭제할 수 있는 권한을 부여한다.Describe: Topic이나 Consumer Group의 Meta 정보를 조회할 수 있는 권한을 부여한다.DescribeConfigs: Topic의 설정 정보를 조회할 수 있는 권한을 부여한다.AlterConfigs: Topic의 설정 정보를 변경할 수 있는 권한을 부여한다.IdempotentWrite: 중복 메시지를 방지하기 위한 Idempotent 쓰기 권한을 부여한다.All: 모든 Operation을 의미한다.
3. 참조
- Kafka Security : https://godekdls.github.io/Apache%20Kafka/security/
- Kafka Security Protocol : https://kafka.apache.org/25/javadoc/org/apache/kafka/common/security/auth/SecurityProtocol.html
- Kafka SASL : https://velog.io/@limsubin/Kafka-SASLPALIN-%EC%9D%B8%EC%A6%9D-%EC%84%A4%EC%A0%95%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90
- Kafka Operation ACL Operation : https://docs.arenadata.io/en/ADStreaming/current/how-to/kafka/access_management/authorization/acl.html