作为 Percona 云团队的一员,我在 Kubernetes 中运行了很多数据库,尤其是我们的Percona Operator for MongoDB。我们大多数人都对相当小而整洁的基础设施感到满意,这些基础设施易于控制和操作。然而,组织的自然增长带来了许多需要解决的挑战,尤其是在访问管理方面。我们都经历过——每个新帐户都需要针对特定平台的努力,这会增加您的基础架构支持的运营成本。这种负担可以通过基于 LDAP 的软件(如 OpenLDAP、Microsoft Active Directory 等)作为身份验证/授权过程的真实来源来解决。让我们深入了解Percona Distribution for MongoDB的详细信息由 Kubernetes 操作员管理的可以连接到 LDAP 服务器。
环境
我们的场景基于 OpenLDAP 服务器和 Percona Distribution for MongoDB 以及相应的 Kubernetes Operator 的集成。我们将保持设置尽可能简单,因此此处不会列出复杂的域关系。
开放式LDAP
在 OpenLDAP 端,可以使用以下设置:
0-percona-ous.ldif: |- dn: ou=perconadba,dc=ldap,dc=local objectClass: organizationalUnit ou: perconadba 1-percona-users.ldif: |- dn: uid=percona,ou=perconadba,dc=ldap,dc=local objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: percona uid: percona uidNumber: 1100 gidNumber: 100 homeDirectory: /home/percona loginShell: /bin/bash gecos: percona userPassword: {crypt}x shadowLastChange: -1 shadowMax: -1 shadowWarning: -1
复制
此外,应该为数据库发布的用户查找创建一个只读用户。
如果一切都正确完成,以下命令应该可以工作
$ ldappasswd -s percona -D "cn=admin,dc=ldap,dc=local" -w password -x "uid=percona,ou=perconadba,dc=ldap,dc=local"
复制
数据库
Percona Operator for MongoDB 将在 Kubernetes 内完成所有工作。您可以使用系统要求中的任何支持的平台。
为了让 MongoDB 与 OpenLDAP 连接,我们需要同时配置:
- mongodb
- 内部 mongodb 角色
至于 mongod,您可以使用以下配置片段:
security: authorization: "enabled" ldap: authz: queryTemplate: 'ou=perconadba,dc=ldap,dc=local??sub?(&(objectClass=group)(uid={USER}))' servers: "openldap" transportSecurity: none bind: queryUser: "cn=readonly,dc=ldap,dc=local" queryPassword: "password" userToDNMapping: '[ { match : "(.+)", ldapQuery: "OU=perconadba,DC=ldap,DC=local??sub?(uid={0})" } ]' setParameter: authenticationMechanisms: 'PLAIN,SCRAM-SHA-1'
复制
不过,该片段的内部结构是另一篇博文的主题。基本上,我们为 mongod 提供了 ldap 特定的参数,例如 ldap 服务器的域名(“服务器”)、显式查找用户、域规则等。
将代码片段放在本地机器上,并从Install Percona server for MongoDB on Kubernetes创建以 MongoDB 集群名称命名的 Kubernetes 机密对象。
$ kubectl create secret generic cluster1-rs0-mongod --from-file=mongod.conf=<path-to-mongod-ldap-configuration>
复制
Percona Operator for MongoDB 能够通过这些 Kubernetes 对象的自定义配置:自定义资源、ConfigMap、Secret。由于我们要使用一些安全敏感信息,因此我们选择了 Kubernetes Secret。
下一步是启动 MongoDB 集群,如Install Percona Server for MongoDB on Kubernetes 中所述。
成功完成文档中的步骤后,我们将继续在 MongoDB 中设置 LDAP 用户的角色。让我们以管理员身份登录 MongoDB 并执行:
var admin = db.getSiblingDB("admin") admin.createRole( { role: "ou=perconadba,dc=ldap,dc=local", privileges: [], roles: [ "userAdminAnyDatabase" ] } )
复制
现在我们在 OpenLDAP 中创建的percona用户能够以管理员身份登录 MongoDB。请将
$ mongo --username percona --password 'percona' --authenticationMechanism 'PLAIN' --authenticationDatabase '$external' --host <mongodb-rs-endpoint> --port 27017
复制
限制
Percona Operator for MongoDB 在撰写本文时仅支持 mongodb 和 LDAP 服务器之间的未加密传输。我们将尽最大努力在未来带来这样的功能,同时在安全宽松的场景中随意使用它。
结论
这篇博客文章仅描述了多种可能组合中的一种可能情况。它相当简单,不会带来 TLS 安全传输设置、目录设计等讨论主题。我们鼓励您尝试为概念证明、开发环境设置等描述的 MongoDB LDAP 集成,其中安全问题不那么苛刻. 不要犹豫,通过复杂的目录结构、用户权限方案等来增加复杂性。如果您发现自己的配置有趣且值得与社区分享,请访问我们的Percona 社区论坛。 我们很乐意检查您的结果。
使用Percona Operator for MongoDB玩得开心!
原文标题:Percona Operator for MongoDB and LDAP: How Hard Can it Be?
原文作者:Ivan Pylypenko
原文地址:https://www.percona.com/blog/percona-operator-for-mongodb-and-ldap-how-hard-can-it-be/