Quantcast
Channel: CodeSection,代码区,数据库(综合) - CodeSec
Viewing all articles
Browse latest Browse all 6262

Percona Server for MongoDB: Dashing New LDAP Authentication Plugin

$
0
0

This blog post is another in the series on the Percona Server for MongoDB 3.4 bundle release. In this blog, we’ll look at the new LDAP authentication plugin.

Hear ye, hear ye, hear ye… With the arrival of version 3.4, Percona has included an LDAP plugin in Percona Server for MongoDB. Authentication is an essential part in client communication with the database backend.

What is LDAP?

LDAP stands for Lightweight Directory Access Protocol. It’s a centralized environment containing information on users or services. This information can be objects like passwords, roles or other meta information. Typically when connecting to the MongoDB server, you simply have to authenticate with the MongoDB servers local credential lists. Using an external authentication method like the one included in Percona Server for MongoDB, you can poll an external service. External authentication allows the MongoDB server to verify the client’s username and password against a separate service, such as OpenLDAP or Active Directory.


Percona Server for MongoDB: Dashing New LDAP Authentication Plugin
Why should you use it?

Having a centralized LDAP offers you the ability to rely on one single “truth” for authentication and authorization. LDAP is essential in large organizations where maintaining users on a big infrastructure becomes troublesome.

In ideal situations, you would use your LDAP authentication for multiple MongoDB servers, and even other database solutions like mysql. The idea is that you only need to modify the passwords or accounts centrally, so you can manage entries without having to modify them locally on each MongoDB instance.

Having a centralized authentication repository is often a requirement when managing highly sensitive information (due to compliancy requirements). A central repository for user information, like an LDAP server, solves the problem of a central source for authentication. When a user with database level privileges leaves the organization, simply shutting off the one central LDAP account will prevent access to all databases that use it as a source. If local accounts were created without being tied back to a central user repository, then the likelihood of an access revocation getting missed is far greater. This is why many security standards require accounts to be created with an LDAP/Active Directory type of service.

So what components do we actually use?

If you want to visualize it in a figure:


Percona Server for MongoDB: Dashing New LDAP Authentication Plugin
LDAP Server . Remotely stores all user credentials (i.e. user name and associated password). In our documentation, we rely on two technologies (windows AD services and OpenLDAP) as LDAP backends. More information can be found at https://www.percona.com/doc/percona-server-for-mongodb/3.4/authentication.html SASL Daemon . Used as a MongoDB server-local proxy for the remote LDAP service. This service is used for MongoDB as an intermediate service. It will translate the request and poll the LDAP server. SASL Library . Used by the MongoDB client and server to create data necessary for the authentication mechanism. This library is used by the MongoDB client and server for making properly formatted requests to the SASL daemon. So how does it work?

An authentication session uses the following sequence:

A MongoDB client connects to a running mongod instance. The client creates a PLAIN authentication request using the SASL library. The client then sends this SASL request to the server as a special MongoDB command. The mongod server receives this SASL Message, with its authentication request payload. The server then creates a SASL session scoped to this client, using its own reference to the SASL library. Then the server passes the authentication payload to the SASL library, which in turn passes it on to the saslauthd daemon. The saslauthd daemon passes the payload on to the LDAP service to get a YES or NO authentication response (in other words, does this user exist and is the password correct). The YES/NO response moves back from saslauthd, through the SASL library, to mongod. The mongod server uses this YES/NO response to authenticate the client or reject the request. If successful, the client has authenticated and can proceed.

Below a visualisation of the authentication path using the LDAP connector


Percona Server for MongoDB: Dashing New LDAP Authentication Plugin
An example of the output when using the authentication plugin

The mongod server is running with the added option:

cat /etc/default/mongodOPTIONS="-f /etc/mongod.conf --auth --setParameter authenticationMechanisms=PLAIN,SCRAM-SHA-1" STDOUT="/var/log/mongodb/mongod.stdout" STDERR="/var/log/mongodb/mongod.stderr" Firstlet’s make a userin MongoDB, I’vecreatedanOrganisationalUnitand associateduserwithpasswordonLDAP > db.getSiblingDB("$external").createUser({ ... user : 'dim0', ... roles: [ {role : "read", db: 'percona'} ] ... }) Successfullyaddeduser: { "user" : "utest", "roles" : [ { "role" : "read", "db" : "percona" } ] }

At this point the user is correctly added on MongoDB.

Let’s try and perform a read query on the database “percona”:

db.getSiblingDB("$external").auth({mechanism: "PLAIN", user: 'dim0', pwd: 'test’, digestPassword: false }) 1 use perconadb.foo.find() { "_id" : ObjectId("58b3e4b80322deccc99dc763"), "x" : 1 } { "_id" : ObjectId("58b3e8fee48bdc7edeb31cc5"), "x" : 2 } { "_id" : ObjectId("58b3e931e48bdc7edeb31cc6"), "x" : 3 } > exit

Now let’s try and write something in it:

db.foo.insert({x : 5}) WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on percona to execute command { insert: "foo", documents: [ { _id: ObjectId('58b3e97f2343c5da97a2256e'), x: 5.0 } ], ordered: true }" } })

This is logical behavior, as we only allowed read interaction on the percona database.

After a correct login, you will find the following in the mongod.log:

2017-02-27T08:55:19.612+0000 I ACCESS [conn2] Successfullyauthenticatedas principaldim0on $external

If an incorrect login happens, the following entry will appear in the mongod.log:

2017-02-27T09:10:55.297+0000 I ACCESS [conn4] PLAINauthenticationfailedfor dim0on $external fromclient 127.0.0.1:34812 ; OperationFailed: SASLstepdidnot complete: (authenticationfailure)

Conclusion

Percona Server for MongoDB has an easy way of integrating correctly with SASL authd. If you are looking for an option of centrally managing the users of your MongoDB environments, look no further. Keep in mind, however, that if you don’t need a centrally managed environment adding this functionality creates additional complexity to your infrastructure. You can find additional information on the LDAP plugin in our documentation at https://www.percona.com/doc/percona-server-for-mongodb/ext_authentication/index.html .


Viewing all articles
Browse latest Browse all 6262

Trending Articles