Skip to content

Commit 6b13e0c

Browse files
committed
wip: SASL/GSSAPI support.
Signed-off-by: Paolo Insogna <[email protected]>
1 parent 537d090 commit 6b13e0c

32 files changed

+718
-174
lines changed

docker/compose-local.yml

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,9 @@ services:
6565
- '9091:9092'
6666
healthcheck:
6767
<<: *health_check
68-
test: ['CMD', '/opt/bitnami/kafka/bin/kafka-broker-api-versions.sh', '--bootstrap-server', 'localhost:9092']
6968
environment:
7069
<<: *common_config
71-
KAFKA_CFG_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9094,DOCKER://broker-single:19092'
70+
KAFKA_CFG_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9091,DOCKER://broker-single:19092'
7271
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: '1@broker-single:29092'
7372
# Replication options
7473
KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: '1'
@@ -90,7 +89,7 @@ services:
9089
# Ports configuration
9190
KAFKA_CFG_LISTENERS: 'SASL_PLAINTEXT://:9092,PLAINTEXT://:19092,CONTROLLER://:29092'
9291
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 'SASL_PLAINTEXT:SASL_PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT'
93-
KAFKA_CFG_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://localhost:9092,PLAINTEXT://localhost:19092'
92+
KAFKA_CFG_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://localhost:9095,PLAINTEXT://localhost:19092'
9493
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: '1@broker-sasl:29092'
9594
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
9695
# Replication options
@@ -110,6 +109,7 @@ services:
110109

111110
broker-sasl-oauthbearer:
112111
image: bitnami/kafka:${KAFKA_VERSION}
112+
container_name: broker-sasl-oauthbearer
113113
ports:
114114
- '9096:9092' # SASL
115115
healthcheck: *health_check
@@ -120,7 +120,7 @@ services:
120120
# Ports configuration
121121
KAFKA_CFG_LISTENERS: 'SASL_PLAINTEXT://:9092,PLAINTEXT://:19092,CONTROLLER://:29092'
122122
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 'SASL_PLAINTEXT:SASL_PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT'
123-
KAFKA_CFG_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://localhost:9092,PLAINTEXT://localhost:19092'
123+
KAFKA_CFG_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://localhost:9096,PLAINTEXT://localhost:19092'
124124
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: '1@broker-sasl-oauthbearer:29092'
125125
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
126126
# Replication options
@@ -139,3 +139,58 @@ services:
139139
KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL: 'PLAIN'
140140
KAFKA_CFG_SASL_OAUTHBEARER_EXPECTED_ISSUER: kafka
141141
KAFKA_CFG_SASL_OAUTHBEARER_EXPECTED_AUDIENCE: users
142+
143+
kdc:
144+
image: alpine:latest
145+
container_name: kdc
146+
ports:
147+
- '8000:88/tcp'
148+
- '8000:88/udp'
149+
- '8001:749'
150+
volumes:
151+
- './data/kerberos/kdc/krb5.conf:/etc/krb5.conf:ro'
152+
- './data/kerberos/kdc/kdc.conf:/var/lib/krb5kdc/kdc.conf:ro'
153+
- './data/kerberos/kdc/init.sh:/init.sh:ro'
154+
- './data/kerberos/data:/data'
155+
entrypoint: ['/bin/sh', '/init.sh']
156+
healthcheck:
157+
test: ['CMD', 'kadmin.local', '-q', 'list_principals']
158+
interval: 10s
159+
timeout: 5s
160+
retries: 5
161+
162+
broker-sasl-kerberos:
163+
image: bitnami/kafka:${KAFKA_VERSION}
164+
container_name: broker-sasl-kerberos
165+
ports:
166+
- '9097:9092'
167+
healthcheck: *health_check
168+
volumes:
169+
- './data/jaas/jaas-kerberos.conf:/opt/bitnami/kafka/config/kafka_jaas.conf'
170+
- './data/kerberos/krb5.conf:/etc/krb5.conf'
171+
- './data/kerberos/data/broker.keytab:/opt/bitnami/kafka/config/kafka.keytab'
172+
depends_on:
173+
kdc:
174+
condition: service_healthy
175+
environment:
176+
<<: *common_config
177+
# Ports configuration
178+
KAFKA_CFG_LISTENERS: 'SASL_PLAINTEXT://:9092,PLAINTEXT://:19092,CONTROLLER://:29092'
179+
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 'SASL_PLAINTEXT:SASL_PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT'
180+
KAFKA_CFG_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://localhost:9097,PLAINTEXT://localhost:19092'
181+
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: '1@broker-sasl-kerberos:29092'
182+
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
183+
# Replication options
184+
KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: '1'
185+
KAFKA_CFG_MIN_INSYNC_REPLICAS: '1'
186+
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR: '1'
187+
KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR: '1'
188+
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: '1'
189+
# SASL
190+
KAFKA_CLIENT_USERS: 'admin'
191+
KAFKA_CLIENT_PASSWORDS: 'admin'
192+
KAFKA_CFG_SASL_ENABLED_MECHANISMS: 'GSSAPI'
193+
KAFKA_CFG_SUPER_USERS: 'User:admin;User:broker/[email protected];User:admin-keytab/[email protected];User:admin-password/[email protected]'
194+
KAFKA_CFG_ALLOW_EVERYONE_IF_NO_ACL_FOUND: 'false'
195+
KAFKA_CFG_SASL_KERBEROS_SERVICE_NAME: 'kafka'
196+
KAFKA_OPTS: '-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf -Djava.security.krb5.conf=/etc/krb5.conf'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
KafkaServer {
2+
com.sun.security.auth.module.Krb5LoginModule required
3+
useKeyTab=true
4+
storeKey=true
5+
keyTab="/opt/bitnami/kafka/config/kafka.keytab"
6+
principal="broker/[email protected]"
7+
serviceName="kafka"
8+
useTicketCache=false;
9+
};

docker/data/jaas/jaas.conf

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
KafkaServer {
22
org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin" user_admin="admin";
33
org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin";
4-
};
5-
6-
KafkaClient {
7-
org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";
84
};

docker/data/kerberos/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
To create `kafka.keytab`:
2+
3+
```
4+
ktutil
5+
addent -password -p admin/[email protected] -k 1 -e aes256-cts-hmac-sha1-96
6+
write_kt kafka.keytab
7+
quit
8+
```
9+
10+
On Mac, use `ktutil` from `krb5`, installed via Homebrew
150 Bytes
Binary file not shown.
182 Bytes
Binary file not shown.

docker/data/kerberos/kdc/init.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# Setup KDC if needed
5+
if [ ! -f /var/lib/krb5kdc/principal ]; then
6+
echo "Setting up KDC ..."
7+
8+
apk add --no-cache krb5-server krb5
9+
kdb5_util create -s -P password
10+
11+
# # ACL file
12+
echo "*/[email protected] *" > /var/lib/krb5kdc/kadm5.acl
13+
14+
# Create principals
15+
kadmin.local -q "addprinc -pw admin [email protected]" # Main administrator
16+
kadmin.local -q "addprinc -randkey broker/[email protected]" # Kafka broker
17+
kadmin.local -q "addprinc -randkey [email protected]" # Client with keytab
18+
kadmin.local -q "addprinc -pw admin [email protected]" # Client with password
19+
20+
# Genera keytab
21+
kadmin.local -q "ktadd -k /data/broker.keytab broker/[email protected]"
22+
kadmin.local -q "ktadd -k /data/admin.keytab [email protected]"
23+
fi
24+
25+
krb5kdc
26+
kadmind -nofork

docker/data/kerberos/kdc/kdc.conf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[kdcdefaults]
2+
kdc_ports = 88
3+
kdc_tcp_ports = 88
4+
5+
[realms]
6+
EXAMPLE.COM = {
7+
acl_file = /var/lib/krb5kdc/kadm5.acl
8+
dict_file = /usr/share/dict/words
9+
admin_keytab = /var/lib/krb5kdc/kadm5.keytab
10+
supported_enctypes = aes256-cts:normal aes128-cts:normal
11+
}

docker/data/kerberos/kdc/krb5.conf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[libdefaults]
2+
default_realm = EXAMPLE.COM
3+
dns_lookup_realm = false
4+
dns_lookup_kdc = false
5+
6+
[realms]
7+
EXAMPLE.COM = {
8+
kdc = localhost:88
9+
admin_server = localhost:749
10+
}
11+
12+
[domain_realm]
13+
.example.com = EXAMPLE.COM
14+
example.com = EXAMPLE.COM

docker/data/kerberos/krb5.conf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[libdefaults]
2+
default_realm = EXAMPLE.COM
3+
dns_lookup_realm = false
4+
dns_lookup_kdc = false
5+
6+
[realms]
7+
EXAMPLE.COM = {
8+
kdc = kdc:88
9+
admin_server = kdc:749
10+
}
11+
12+
[domain_realm]
13+
.example.com = EXAMPLE.COM
14+
example.com = EXAMPLE.COM

0 commit comments

Comments
 (0)