Skip to content

Commit 7c01738

Browse files
PSMDB. Add kerberos to setup and test to check PMM GSSAPI support + fix for LDAP group on latest openldap
1 parent 74d03b3 commit 7c01738

File tree

9 files changed

+104
-4
lines changed

9 files changed

+104
-4
lines changed

Diff for: pmm_psmdb-pbm_setup/Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ RUN if [[ "$PMM_CLIENT_VERSION" == http* ]]; then \
8181

8282
COPY conf/sysconfig/mongod /etc/sysconfig/
8383
COPY keyfile /etc/keyfile
84+
COPY conf/krb/krb5.conf /etc/krb5.conf
8485
RUN ln -s /usr/bin/mongosh /usr/bin/mongo || true
8586
RUN chown mongod /etc/keyfile && chmod 400 /etc/keyfile
8687
EXPOSE 27017

Diff for: pmm_psmdb-pbm_setup/conf/krb/krb5.conf

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[libdefaults]
2+
default_realm = PERCONATEST.COM
3+
forwardable = true
4+
dns_lookup_realm = false
5+
dns_lookup_kdc = false
6+
ignore_acceptor_hostname = true
7+
rdns = false
8+
[realms]
9+
PERCONATEST.COM = {
10+
kdc_ports = 88
11+
kdc = kerberos
12+
}
13+
[domain_realm]
14+
.perconatest.com = PERCONATEST.COM
15+
perconatest.com = PERCONATEST.COM
16+
kerberos = PERCONATEST.COM

Diff for: pmm_psmdb-pbm_setup/conf/sysconfig/mongod

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
OPTIONS="-f /etc/mongod/mongod.conf"
22
STDOUT="/var/log/mongo/mongod.stdout"
33
STDERR="/var/log/mongo/mongod.stderr"
4+
KRB5_KTNAME=/keytabs/mongodb.keytab

Diff for: pmm_psmdb_diffauth_setup/Dockerfile-kerberos

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM alpine
2+
RUN apk add --no-cache bash krb5 krb5-server krb5-pkinit
3+
COPY conf/configure_krb5.sh /var/lib/krb5kdc/
4+
EXPOSE 88/udp
5+
ENTRYPOINT [ "sh", "/var/lib/krb5kdc/configure_krb5.sh"]

Diff for: pmm_psmdb_diffauth_setup/conf/configure_krb5.sh

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#! /env/sh
2+
3+
cat > /etc/krb5.conf << EOL
4+
[libdefaults]
5+
default_realm = PERCONATEST.COM
6+
forwardable = true
7+
dns_lookup_realm = false
8+
dns_lookup_kdc = false
9+
ignore_acceptor_hostname = true
10+
rdns = false
11+
[realms]
12+
PERCONATEST.COM = {
13+
kdc_ports = 88
14+
kdc = kerberos
15+
admin_server = kerberos
16+
}
17+
[domain_realm]
18+
.perconatest.com = PERCONATEST.COM
19+
perconatest.com = PERCONATEST.COM
20+
kerberos = PERCONATEST.COM
21+
EOL
22+
23+
kdb5_util -P password create -s
24+
kadmin.local -q "addprinc -pw password root/admin"
25+
kadmin.local -q "addprinc -pw mongodb mongodb/psmdb-server"
26+
kadmin.local -q "addprinc -pw password1 pmm-test"
27+
kadmin.local -q "ktadd -k /keytabs/mongodb.keytab mongodb/psmdb-server@PERCONATEST.COM"
28+
29+
krb5kdc -n

Diff for: pmm_psmdb_diffauth_setup/conf/mongod.conf

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ security:
2626
validateLDAPServerConfig: false
2727
transportSecurity: none
2828
servers: ldap-server:1389
29-
userToDNMapping: '[{match: "arn:aws:iam::(.+):user/(.+)|CN=(.+)", substitution: "cn={1}{2},ou=users,dc=example,dc=org"}]'
29+
userToDNMapping: '[{match: "arn:aws:iam::(.+):user/(.+)|CN=(.+)|([^@]+)@PERCONATEST.COM", substitution: "cn={1}{2}{3},ou=users,dc=example,dc=org"}]'
3030
authz:
3131
queryTemplate: 'dc=example,dc=org??sub?(&(objectClass=groupOfNames)(member={USER}))'
3232
setParameter:
33-
authenticationMechanisms: SCRAM-SHA-1,PLAIN,MONGODB-X509,MONGODB-AWS
33+
authenticationMechanisms: SCRAM-SHA-1,PLAIN,MONGODB-X509,MONGODB-AWS,GSSAPI
3434

3535
replication:
3636
replSetName: rs0

Diff for: pmm_psmdb_diffauth_setup/docker-compose-pmm-psmdb.yml

+24-1
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ services:
4242
- -c
4343
- |
4444
cp /mongodb_certs/ca-certs.pem /etc/pki/tls/certs/
45+
chown -R mongod:mongod /keytabs
4546
exec /usr/sbin/init
4647
volumes:
4748
- ./conf:/etc/mongod
4849
- ./certs:/mongodb_certs
4950
- /sys/fs/cgroup:/sys/fs/cgroup:rw
5051
- 'psmdb-server-data:/data/db'
52+
- keytabs:/keytabs
5153
- ../pmm_psmdb-pbm_setup/conf/datagen:/etc/datagen:ro
5254
privileged: true
5355
cgroup: host
@@ -62,6 +64,8 @@ services:
6264
depends_on:
6365
pmm-server:
6466
condition: service_healthy
67+
kerberos:
68+
condition: service_healthy
6569

6670
pmm-server:
6771
container_name: pmm-server
@@ -84,7 +88,7 @@ services:
8488
ldap-server:
8589
container_name: ldap-server
8690
hostname: ldap-server
87-
image: bitnami/openldap:2
91+
image: bitnami/openldap
8892
environment:
8993
- LDAP_ADMIN_USERNAME=admin
9094
- LDAP_ADMIN_PASSWORD=adminpassword
@@ -96,6 +100,23 @@ services:
96100
volumes:
97101
- 'openldap-data:/bitnami/openldap'
98102

103+
kerberos:
104+
image: kerberos/local
105+
build:
106+
dockerfile: ./Dockerfile-kerberos
107+
context: .
108+
container_name: kerberos
109+
hostname: kerberos
110+
environment:
111+
- "KRB5_TRACE=/dev/stderr"
112+
volumes:
113+
- keytabs:/keytabs
114+
healthcheck:
115+
test: ["CMD", "kadmin.local", "-q", "listprincs"]
116+
interval: 2s
117+
timeout: 1s
118+
retries: 5
119+
99120
minio:
100121
image: minio/minio
101122
container_name: minio
@@ -128,3 +149,5 @@ volumes:
128149
driver: local
129150
openldap-data:
130151
driver: local
152+
keytabs:
153+
driver: local

Diff for: pmm_psmdb_diffauth_setup/init/setup_psmdb.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ db.getSiblingDB("admin").createRole({
2626
roles:[]
2727
});
2828
db.getSiblingDB("admin").createRole({
29-
role: "cn=readers,ou=users,dc=example,dc=org",
29+
role: "cn=readers,ou=groups,dc=example,dc=org",
3030
privileges: [],
3131
roles: [
3232
{ role: "explainRole", db: "admin" },

Diff for: pmm_psmdb_diffauth_setup/test/test.py

+25
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ def test_simple_auth_tls():
5858
'--tls --tls-certificate-key-file=/mongodb_certs/client.pem --tls-ca-file=/mongodb_certs/ca-certs.pem '
5959
'--cluster=mycluster')
6060

61+
#####
62+
# All tests for external authentication methods (X509, LDAP, Kerberos, AWS) rely on the `mongod` configuration to handle
63+
# authentication using the selected method, followed by authorization via LDAP.
64+
#
65+
# Therefore, no users are added to `$external` database before testing. Instead, after successful authentication
66+
# against the selected service, the username is transformed based on the pattern below to match LDAP user
67+
# `cn=pmm-test,ou=users,dc=example,dc=org`.
68+
# This user is preconfigured on LDAP server and, after authorization, inherits the privileges assigned in
69+
# MongoDB to its default group, `cn=readers,ou=users,dc=example,dc=org`.
70+
#
71+
# Transformation pattern from `mongod` configuration:
72+
# [{match: "arn:aws:iam::(.+):user/(.+)|CN=(.+)|([^@]+)@PERCONATEST.COM", substitution: "cn={1}{2}{3},ou=users,dc=example,dc=org"}]
73+
#####
6174

6275
def test_x509_auth():
6376
run_test('pmm-admin add mongodb psmdb-server --host=psmdb-server --port 27017 '
@@ -80,6 +93,18 @@ def test_ldap_auth_tls():
8093
'--tls --tls-certificate-key-file=/mongodb_certs/client.pem --tls-ca-file=/mongodb_certs/ca-certs.pem '
8194
'--cluster=mycluster')
8295

96+
def test_kerberos_auth_wo_tls():
97+
run_test('pmm-admin add mongodb psmdb-server --username="pmm-test@PERCONATEST.COM" --password=password1 '
98+
'--host=psmdb-server --port 27017 '
99+
'--authentication-mechanism=GSSAPI --authentication-database=\'$external\' '
100+
'--cluster=mycluster')
101+
102+
def test_kerberos_auth_tls():
103+
run_test('pmm-admin add mongodb psmdb-server --username="pmm-test@PERCONATEST.COM" --password=password1 '
104+
'--host=psmdb-server --port 27017 '
105+
'--authentication-mechanism=GSSAPI --authentication-database=\'$external\' '
106+
'--tls --tls-certificate-key-file=/mongodb_certs/client.pem --tls-ca-file=/mongodb_certs/ca-certs.pem '
107+
'--cluster=mycluster')
83108

84109
@pytest.mark.skipif(
85110
any(not os.environ.get(var) for var in env_vars) or os.environ.get('SKIP_AWS_TESTS') == 'true',

0 commit comments

Comments
 (0)