Implementing Security
1. Understanding Kafka Security Model
| Pillar |
Description |
Mechanism |
| Encryption |
In-transit confidentiality |
SSL/TLS |
| Authentication |
Verify identity |
SSL/SASL |
| Authorization |
Access control |
ACLs |
Example: Security protocol
security.protocol=SASL_SSL # auth + encryption
2. Enabling SSL Encryption
| Config |
Description |
Detail |
| security.protocol |
SSL |
Encrypt only |
| listeners |
SSL://:9093 |
Secure port |
| Overhead |
CPU for TLS |
No zero-copy |
Example: Enable SSL
listeners=SSL://:9093
security.inter.broker.protocol=SSL
3. Configuring SSL Certificates
| Config |
Description |
Detail |
| ssl.keystore.location |
Server identity |
JKS/PKCS12 |
| ssl.truststore.location |
Trusted CAs |
Verify peers |
| CA-Signed |
Prod best practice |
Chain of trust |
Example: Certificate config
ssl.keystore.location=/etc/kafka/ssl/server.keystore.jks
ssl.truststore.location=/etc/kafka/ssl/server.truststore.jks
4. Setting Keystore Password
| Config |
Description |
Detail |
| ssl.keystore.password |
Keystore file password |
Required |
| ssl.key.password |
Private key password |
If different |
| Secrets |
Externalize via providers |
Not plaintext |
Warning: Avoid plaintext passwords in config; use a ConfigProvider or environment-based secret injection.
Example: Externalized password
ssl.keystore.password=${file:/etc/kafka/secrets.properties:keystore.pwd}
5. Configuring SSL Endpoint Identification
| Config |
Description |
Detail |
ssl.endpoint. identification.algorithm |
Hostname verification |
https |
| Default |
https (enabled) |
Secure |
| Empty |
Disables check |
Risky |
Example: Hostname verification
ssl.endpoint.identification.algorithm=https
6. Enabling SASL Authentication
| Config |
Description |
Detail |
| security.protocol |
SASL_SSL / SASL_PLAINTEXT |
Auth |
| sasl.mechanism |
PLAIN/SCRAM/GSSAPI |
Method |
| JAAS |
Credentials config |
sasl.jaas.config |
Example: Enable SASL_SSL
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-256
7. Configuring SASL/PLAIN
| Aspect |
Description |
Detail |
| PLAIN |
Username/password |
Simple |
| TLS Required |
Must use SASL_SSL |
No plaintext creds |
| Static |
Users in JAAS |
No rotation |
Example: SASL/PLAIN JAAS
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule \
required username="app" password="secret";
8. Using SASL/SCRAM
| Aspect |
Description |
Detail |
| SCRAM |
Salted challenge-response |
SHA-256/512 |
| Storage |
Credentials in metadata |
kafka-configs |
| Rotation |
Add/update users live |
Dynamic |
Example: Create SCRAM user
kafka-configs.sh --bootstrap-server localhost:9092 --alter \
--add-config 'SCRAM-SHA-256=[password=secret]' \
--entity-type users --entity-name app
9. Configuring SASL/GSSAPI
| Aspect |
Description |
Detail |
| GSSAPI |
Kerberos auth |
Enterprise |
| Keytab |
Service principal creds |
useKeyTab |
| service.name |
Kerberos service |
kafka |
Example: GSSAPI JAAS
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
useKeyTab=true keyTab="/etc/security/kafka.keytab" \
principal="kafka/host@REALM";
10. Setting Up SASL/OAUTHBEARER
| Aspect |
Description |
Detail |
| OAUTHBEARER |
OAuth 2.0 tokens |
OIDC |
| Token Endpoint |
IdP issues JWT |
sasl.oauthbearer |
| Refresh |
Auto token renewal |
Callback |
Example: OAuth config
sasl.mechanism=OAUTHBEARER
sasl.oauthbearer.token.endpoint.url=https://idp/token
sasl.login.callback.handler.class=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
11. Enabling Inter-Broker Security
| Config |
Description |
Detail |
security.inter. broker.protocol |
Broker-to-broker |
SSL/SASL_SSL |
inter.broker. listener.name |
Dedicated listener |
Alternative |
| Controller |
Secure controller listener |
KRaft |
Example: Inter-broker SSL
security.inter.broker.protocol=SSL