0% found this document useful (0 votes)
189 views102 pages

MongoDB Security Guide

MongoDB Atlas offers built-in security controls for all your data. Enable enterprise-grade features to integrate with your existing security protocols and compliance standards.

Uploaded by

Eugene Semashko
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
189 views102 pages

MongoDB Security Guide

MongoDB Atlas offers built-in security controls for all your data. Enable enterprise-grade features to integrate with your existing security protocols and compliance standards.

Uploaded by

Eugene Semashko
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 102

MongoDB Security Guide

Release 2.6.1

MongoDB Documentation Project

May 09, 2014

Contents

1 Security Introduction 4
1.1 Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Role Based Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Transport Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Encryption at Rest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Hardening Deployments and Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Security Concepts 5
2.1 Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Authentication Mechanisms and Credential Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Authentication Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Authentication Behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Role Assignment to Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Protect the User and Role Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
See Also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Network Exposure and Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Configuration Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Firewalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Virtual Private Networks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Security and MongoDB API Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
JavaScript and the Security of the mongo Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
HTTP Status Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
REST API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Audit Events and Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Audit Guarantee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Kerberos Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Kerberos Components and MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Operational Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Kerberized MongoDB Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Security Tutorials 16
3.1 Security Checklist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Require Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Configure Role-Based Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Encrypt Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Limit Network Exposure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Audit System Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Encrypt and Protect Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Run MongoDB with a Dedicated User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Run MongoDB with Secure Configuration Options . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2 Network Security Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Configure Linux iptables Firewall for MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Configure Windows netsh Firewall for MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Connect to MongoDB with SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Upgrade a Cluster to Use SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Security Deployment Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Deploy Replica Set and Configure Authentication and Authorization . . . . . . . . . . . . . . . . . . 32
3.4 Access Control Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Enable Client Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Enable Authentication in a Sharded Cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Enable Authentication after Creating the User Administrator . . . . . . . . . . . . . . . . . . . . . . 39
Authenticate with x.509 Certificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Authenticate Using SASL and LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Configure MongoDB with Kerberos Authentication on Linux . . . . . . . . . . . . . . . . . . . . . . 47
Configure MongoDB with Kerberos Authentication on Windows . . . . . . . . . . . . . . . . . . . . 50
Authenticate to a MongoDB Instance or Cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Generate a Key File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Troubleshoot Kerberos Authentication on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Implement Field Level Redaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.5 User and Role Management Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Create a User Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Add a User to a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Create an Administrative User with Unrestricted Access . . . . . . . . . . . . . . . . . . . . . . . . 62
Create a Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Assign a User a Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Verify User Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Modify a User’s Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
View Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Change a User’s Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Change Your Password and Custom Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6 Configure System Events Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Enable and Configure Audit Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Filter Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Filter for a Single Operation Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Filter for Multiple Operation Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Filter on Authentication Operations on a Single Database . . . . . . . . . . . . . . . . . . . . . . . . 74
3.7 Create a Vulnerability Report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Create the Report in JIRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Information to Provide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Send the Report via Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Evaluation of a Vulnerability Report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Disclosure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

4 Security Reference 76

2
4.1 Security Methods in the mongo Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
User Management Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Role Management Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.2 Security Reference Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Built-In Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
system.roles Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
system.users Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Resource Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Privilege Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Default MongoDB Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
System Event Audit Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.3 Security Release Notes Alerts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Security Release Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Index 101

This section outlines basic security and risk management strategies and access control. The included tutorials outline
specific tasks for configuring firewalls, authentication, and system privileges.
Security Introduction (page 4) A high-level introduction to security and MongoDB deployments.
Security Concepts (page 5) The core documentation of security.
Authentication (page 5) Mechanisms for verifying user and instance access to MongoDB.
Authorization (page 8) Control access to MongoDB instances using authorization.
Network Exposure and Security (page 10) Discusses potential security risks related to the network and strate-
gies for decreasing possible network-based attack vectors for MongoDB.
Continue reading from Security Concepts (page 5) for additional documentation of MongoDB’s security features
and operation.
Security Tutorials (page 16) Tutorials for enabling and configuring security features for MongoDB.
Security Checklist (page 17) A high level overview of global security consideration for administrators of Mon-
goDB deployments. Use this checklist if you are new to deploying MongoDB in production and want to
implement high quality security practices.
Network Security Tutorials (page 19) Ensure that the underlying network configuration supports a secure oper-
ating environment for MongoDB deployments, and appropriately limits access to MongoDB deployments.
Access Control Tutorials (page 36) These tutorials describe procedures relevant for the configuration, opera-
tion, and maintenance of MongoDB’s access control system.
User and Role Management Tutorials (page 58) MongoDB’s access control system provides a flexible role-
based access control system that you can use to limit access to MongoDB deployments. The tutorials in
this section describe the configuration an setup of the authorization system.
Continue reading from Security Tutorials (page 16) for additional tutorials that address the use and management
of secure MongoDB deployments.
Create a Vulnerability Report (page 75) Report a vulnerability in MongoDB.
Security Reference (page 76) Reference for security related functions.

3
1 Security Introduction

Maintaining a secure MongoDB deployment requires administrators to implement controls to ensure that users and
applications have access to only the data that they require. MongoDB provides features that allow administrators to
implement these controls and restrictions for any MongoDB deployment.
If you are already familiar with security and MongoDB security practices, consider the Security Checklist (page 17)
for a collection of recommended actions to protect a MongoDB deployment.

1.1 Authentication

Before gaining access to a system all clients should identify themselves to MongoDB. This ensures that no client can
access the data stored in MongoDB without being explicitly allowed.
MongoDB includes two mechanism: a password-based challenge and response protocol and x.509 certificates. Addi-
tionally MongoDB includes support for several external authentication mechanisms to integrate with existing authen-
tication infrastructure.
When you enable authentication MongoDB, MongoDB will require authentication for all connections, including all
clients and all other MongoDB instances in a deployment. See Authentication (page 5) for more information.

1.2 Role Based Access Control

Clients should only be able to perform the operations required to fulfill their approved functions. This is the “principal
of least privilege,” and limits the potential risk of a compromised application.
MongoDB’s role-based access control system allows administrators to control all access and ensure that all granted
access applies as narrowly as possible.
Privileges in MongoDB consist of an action, or a set operations that a user can perform, and a resource, or context
where the user can perform that action. Multiple privileges combine to create a role, and users may have one or more
role that describes their access. MongoDB provides several built-in roles (page 77) and users can construct specific
roles tailored to clients’ actual requirements.
See Authorization (page 8) for more information.

1.3 Auditing

Auditing provides administrators with the ability to verify that the implemented security policies are controlling activ-
ity in the system. Retaining audit information ensures that administrators have enough information to perform forensic
investigations and comply with regulations and polices that require audit data.
See Auditing (page 13) for more information.

1.4 Encryption

Transport Encryption

You can use SSL to encrypt all of MongoDB’s network traffic. SSL ensures that MongoDB network traffic is only
readable by the intended client.
See Connect to MongoDB with SSL (page 26) for more information.

4
Encryption at Rest

MongoDB has a partnership with Gazzang to encrypt and secure sensitive data within MongoDB. The solution en-
crypts data in real time, and Gazzang provides advanced key management that ensures only authorized processes can
access this data. The Gazzang software ensures that the cryptographic keys remain safe and ensures compliance with
standards including HIPAA, PCI-DSS, and FERPA.
For more information on the partnership, refer to the following resources:
• Partnership1
• Datasheet2
• Webinar3

1.5 Hardening Deployments and Environments

In addition to implementing controls within MongoDB, you should also place controls around MongoDB to reduce
the risk exposure of the entire MongoDB system. This is a defense in depth strategy.
Hardening MongoDB extends the ideas of least privilege, auditing, and encryption outside of MongoDB. Reducing
risk includes: configuring the network rules to ensure that only trusted hosts have access to MongoDB, and that the
MongoDB processes only have access to the parts of the filesystem required for operation.

2 Security Concepts

These documents introduce and address concepts and strategies related to security practices in MongoDB deployments.
Authentication (page 5) Mechanisms for verifying user and instance access to MongoDB.
Authorization (page 8) Control access to MongoDB instances using authorization.
Network Exposure and Security (page 10) Discusses potential security risks related to the network and strategies for
decreasing possible network-based attack vectors for MongoDB.
Security and MongoDB API Interfaces (page 12) Discusses potential risks related to MongoDB’s JavaScript, HTTP
and REST interfaces, including strategies to control those risks.
Auditing (page 13) Audit server and client activity for mongod and mongos instances.
Kerberos Authentication (page 14) Kerberos authentication and MongoDB.

2.1 Authentication

Authentication is the process of verifying the identity of a client. When enabled, MongoDB requires all clients to
provide credentials to access MongoDB databases. By default, MongoDB does not require authentication.
MongoDB supports a number of authentication mechanisms or methods that clients can use to validate their identity.
These mechanisms allow MongoDB to integrate into existing authentication systems that your environments may use.
MongoDB’s default authentication method is a challenge and response mechanism. MongoDB also supports x509
certificate authentication, LDAP proxy authentication, and Kerberos authentication.
With authentication, MongoDB requires authentication for all clients, including connections between all MongoDB
components in a deployment. See Authentication Between MongoDB Instances (page 7) for more information.
1 https://www.mongodb.com/partners/technology/gazzang
2 http://www.gazzang.com/images/datasheet-zNcrypt-for-MongoDB.pdf
3 http://gazzang.com/resources/videos/partner-videos/item/209-gazzang-zncrypt-on-mongodb

5
Authentication is distinct from authorization (page 8), which determines the client’s access to resources and operations.

Authentication Mechanisms and Credential Storage

MongoDB supports multiple authentication mechanisms to fit into existing deployments and use existing authenti-
cation infrastructure. To declare a specific authentication mechanism, use the authenticationMechanisms
parameter. For details, see Enable Client Access Control (page 37).
MongoDB represents authentication credentials differently depending on authentication mechanism. This section
addresses all available methods and describes how each method stores user credentials.

MONGODB-CR Authentication

MONGODB-CR is a challenge-response mechanism that authenticates users through passwords. MONGODB-CR


applies by default when you enable authentication in MongoDB without setting a mechanism in the
authenticationMechanisms parameter. You can also explicitly apply MONGODB-CR by setting it as the value
of authenticationMechanisms.
When you enable MONGODB-CR authentication using the authorization setting, MongoDB uses the credentials
stored in the admin database’s system.users collection.
When you enable MONGODB-CR authentication using the keyFile setting, you must store the key file on each
mongod or mongos instance. MongoDB uses the key file as stored on each instance. See Generate a Key File
(page 53) for instructions on generating a key file.

x.509 Certificate Authentication

New in version 2.6.


MongoDB supports x.509 certificate authentication for use with a secure SSL connection (page 26).
To authenticate to servers, clients can use x.509 certificates instead of usernames and passwords. See Use x.509 for
Client Authentication (page 41) for more information.
For membership authentication, members of sharded clusters and replica sets can use x.509 certificates instead of key
files. See Use x.509 for Replica Set/Sharded Cluster Member Authentication (page 42) for more information.

Kerberos Authentication

MongoDB Enterprise4 supports authentication using a Kerberos service. Kerberos is an industry standard authentica-
tion protocol for large client/server system.
To use MongoDB with Kerberos, you must have a properly configured Kerberos deployment, configured Kerberos
service principals (page 14) for MongoDB, and added Kerberos user principal (page 14) to MongoDB.
See Kerberos Authentication (page 14) for more information on Kerberos and MongoDB. To configure MongoDB to
use Kerberos authentication, see Configure MongoDB with Kerberos Authentication on Linux (page 47) and Configure
MongoDB with Kerberos Authentication on Windows (page 50).

LDAP Proxy Authority Authentication

MongoDB Enterprise5 supports proxy authentication through a Lightweight Directory Access Protocol (LDAP) ser-
4 http://www.mongodb.com/products/mongodb-enterprise
5 http://www.mongodb.com/products/mongodb-enterprise

6
vice. See Authenticate Using SASL and LDAP (page 44).
MongoDB Enterprise for Windows does not include LDAP support for authentication.
MongoDB does not support LDAP authentication in mixed sharded cluster deployments that contain both version 2.4
and version 2.6 shards.

Authentication Options

Clients can authenticate using the Challenge Response, x.509 (page 6), LDAP Proxy (page 6) and Kerberos (page 6)
methods.
MongoDB can use the keyFile and x.509 (page 6) methods to authenticate members of a single MongoDB deploy-
ment to each other.

Authentication Behavior

Localhost Exception

The localhost exception allows you to enable authentication before creating the first user in the system. When active,
the localhost exception allows all connections from the localhost interface to have full access to that instance. The
exception applies only when there are no user documents in the admin database of a MongoDB instance.
If you use the localhost exception when deploying a new MongoDB system, the first user created must be
an administrator who has privileges to create other users, such as a user with the userAdmin (page 79) or
userAdminAnyDatabase (page 83) role. See Enable Client Access Control (page 37) and Create a User Ad-
ministrator (page 58) for more information.
In the case of a sharded cluster, the localhost exception applies to the cluster as a whole when no user exists in the
cluster’s admin database, which exists on the config servers and clients access via mongos instances. The localhost
exception applies separately on each shard according to whether a user exists in the shard’s admin database.
To prevent unauthorized access to a cluster’s shards, you must either create an administrator on each shard
or disable the localhost exception. To disable the localhost exception, use setParameter to set the
enableLocalhostAuthBypass parameter to 0 during startup.

Client Authentication

Each client connection should authenticate as exactly one user. If a client authenticates to a database as one user and
later authenticates on the same database as a different user, the second authentication invalidates the first. Clients may
be authenticated to multiple databases at the same time.
MongoDB stores all user information, including credentials and authorization (page 8) information, for a MongoDB
instance in the system.users collection in the admin database.
See Authenticate to a MongoDB Instance or Cluster (page 52) for more information.

Authentication Between MongoDB Instances

Replica sets and sharded clusters require authentication between MongoDB instances. The default mechanism for
authentication between MongoDB instances is the keyFile setting. The key file serves as a shared password. The
content of the key file is arbitrary but must be the same on all mongod and mongos instances that connect to each
other.

7
Always run replica sets and sharded clusters in a trusted networking environment. Ensure that the network permits
only trusted traffic to reach each mongod and mongos instance.
Use your environment’s firewall and network routing to ensure that traffic only from clients and other members can
reach your mongod and mongos instances. If needed, use virtual private networks (VPNs) to ensure secure connec-
tions over wide area networks (WANs).
Always ensure that:
• Your network configuration will allow every member of the replica set or sharded cluster to contact every other
member.
• If you use MongoDB’s authentication system to limit access to your infrastructure, ensure that you configure a
keyFile on all members to permit authentication.

Authentication on Sharded Clusters

In a sharded cluster, you can authenticate to the cluster as a whole, to a specific database on the cluster, or to a given
shard. This section describes how to authenticate to each and where the credentials for authenticating to each are
stored.
To authenticate to a sharded cluster, connect and authenticate to the mongos instance. The credentials all users of a
sharded cluster reside on the admin databases of the config servers.
Changed in version 2.6: Previously, the credentials for authenticating to a database on a cluster resided on the mongod
instance that is the primary shard for that database.
To perform maintenance operations that require direct connections to specific shards in a sharded cluster, (e.g.
cleanupOrphaned, compact, rs.reconfig()) you must create shard local administrative users for each
shard. The credentials for these users reside in the admin database of the shard.
For additional information, see Enable Authentication in a Sharded Cluster (page 38).

2.2 Authorization

MongoDB employs Role-Based Access Control (RBAC) to govern access to a MongoDB system. A user is granted
one or more roles (page 8) that determine the user’s access to database resources and operations. Outside of role
assignments, the user has no access to the system.
MongoDB provides built-in roles (page 77), each with a dedicated purpose for a common use case. Examples include
the read (page 77), readWrite (page 77), dbAdmin (page 78), and root (page 84) roles.
Administrators also can create new roles and privileges to cater to operational needs. Administrators can assign
privileges scoped as granularly as the collection level.
When granted a role, a user receives all the privileges of that role. A user can have several roles concurrently, in which
case the user receives the union of all the privileges of the respective roles.

Roles

A role consists of privileges that pair resources with allowed operations. Each privilege is defined directly in the role
or inherited from another role.
A role’s privileges apply to the database where the role is created. A role created on the admin database can include
privileges that apply to all databases or to the cluster (page 89).
A user assigned a role receives all the privileges of that role. The user can have multiple roles and can have different
roles on different databases.

8
Roles always grant privileges and never limit access. For example, if a user has both read (page 77) and
readWriteAnyDatabase (page 83) roles on a database, the greater access prevails.

Privileges

A privilege consists of a specified resource and the actions permitted on the resource.
A privilege resource (page 88) is either a database, collection, set of collections, or the cluster. If the cluster, the
affiliated actions affect the state of the system rather than a specific database or collection.
An action (page 90) is a command or method the user is allowed to perform on the resource. A resource can have
multiple allowed actions. For available actions see Privilege Actions (page 90).
For example, a privilege that includes the update (page 90) action allows a user to modify existing documents on
the resource. To additionally grant the user permission to create documents on the resource, the administrator would
add the insert (page 90) action to the privilege.
For privilege syntax, see admin.system.roles.privileges (page 85).

Inherited Privileges

A role can include one or more existing roles in its definition, in which case the role inherits all the privileges of the
included roles.
A role can inherit privileges from other roles in its database. A role created on the admin database can inherit
privileges from roles in any database.

User-Defined Roles

New in version 2.6.


User administrators can create custom roles to ensure collection-level and command-level granularity and to adhere to
the policy of least privilege. Administrators create and edit roles using the role management commands.
MongoDB scopes a user-defined role to the database in which it is created and uniquely identifies the role by the pairing
of its name and its database. MongoDB stores the roles in the admin database’s system.roles (page 84) collection. Do
not access this collection directly but instead use the role management commands to view and edit custom roles.

Users

MongoDB stores user credentials in the protected admin.system.users. Use the user management methods to
view and edit user credentials.

Role Assignment to Users

User administrators create the users that access the system’s databases. MongoDB’s user management commands let
administrators create users and assign them roles.
MongoDB scopes a user to the database in which the user is created. MongoDB stores all user definitions in the admin
database, no matter which database the user is scoped to. MongoDB stores users in the admin database’s system.users
collection (page 87). Do not access this collection directly but instead use the user management commands.
The first role assigned in a database should be either userAdmin (page 79) or userAdminAnyDatabase
(page 83). This user can then create all other users in the system. See Create a User Administrator (page 58).

9
Protect the User and Role Collections

MongoDB stores role and user data in the protected admin.system.roles and admin.system.users col-
lections, which are only accessible using the user management methods.
If you disable access control, do not modify the admin.system.roles and admin.system.users collections
using normal insert() and update() operations.

See Also

Built-In Roles (page 77)


Resource Document (page 88)
Privilege Actions (page 90)
Create a User Administrator (page 58)
Add a User to a Database (page 60)

2.3 Network Exposure and Security

By default, MongoDB programs (i.e. mongos and mongod) will bind to all available network interfaces (i.e. IP
addresses) on a system.
This page outlines various runtime options that allow you to limit access to MongoDB programs.

Configuration Options

You can limit the network exposure with the following mongod and mongos configuration options: enabled,
net.http.RESTInterfaceEnabled, bindIp, and port. You can use a configuration file to specify
these settings.

nohttpinterface

The enabled setting for mongod and mongos instances disables the “home” status page.
Changed in version 2.6: The mongod and mongos instances run with the http interface disabled by default.
The status interface is read-only by default, and the default port for the status page is 28017. Authentication does not
control or affect access to this interface.

Important: Disable this interface for production deployments. If you enable this interface, you should only allow
trusted clients to access this port. See Firewalls (page 11).

rest

The net.http.RESTInterfaceEnabled setting for mongod enables a fully interactive administrative REST
interface, which is disabled by default. The net.http.RESTInterfaceEnabled configuration makes the http
status interface 6 , which is read-only by default, fully interactive. Use the net.http.RESTInterfaceEnabled
setting with the enabled setting.
6 Starting in version 2.6, http interface is disabled by default.

10
The REST interface does not support any authentication and you should always restrict access to this interface to only
allow trusted clients to connect to this port.
You may also enable this interface on the command line as mongod --rest --httpinterface.

Important: Disable this option for production deployments. If do you leave this interface enabled, you should only
allow trusted clients to access this port.

bind_ip

The bindIp setting for mongod and mongos instances limits the network interfaces on which MongoDB programs
will listen for incoming connections. You can also specify a number of interfaces by passing bindIp a comma
separated list of IP addresses. You can use the mongod --bind_ip and mongos --bind_ip option on the
command line at run time to limit the network accessibility of a MongoDB program.

Important: Make sure that your mongod and mongos instances are only accessible on trusted networks. If your
system has more than one network interface, bind MongoDB programs to the private or internal network interface.

port

The port setting for mongod and mongos instances changes the main port on which the mongod or mongos
instance listens for connections. The default port is 27017. Changing the port does not meaningfully reduce risk or
limit exposure. You may also specify this option on the command line as mongod --port or mongos --port.
Setting port also indirectly sets the port for the HTTP status interface, which is always available on the port numbered
1000 greater than the primary mongod port.
Only allow trusted clients to connect to the port for the mongod and mongos instances. See Firewalls (page 11).
See also configuration-security and Default MongoDB Port (page 95).

Firewalls

Firewalls allow administrators to filter and control access to a system by providing granular control over what network
communications. For administrators of MongoDB, the following capabilities are important: limiting incoming traffic
on a specific port to specific systems, and limiting incoming traffic from untrusted hosts.
On Linux systems, the iptables interface provides access to the underlying netfilter firewall. On Windows
systems, netsh command line interface provides access to the underlying Windows Firewall. For additional infor-
mation about firewall configuration, see Configure Linux iptables Firewall for MongoDB (page 19) and Configure
Windows netsh Firewall for MongoDB (page 22).
For best results and to minimize overall exposure, ensure that only traffic from trusted sources can reach mongod and
mongos instances and that the mongod and mongos instances can only connect to trusted outputs.
See also:
For MongoDB deployments on Amazon’s web services, see the Amazon EC27 page, which addresses Amazon’s
Security Groups and other EC2-specific security features.
7 http://docs.mongodb.org/ecosystem/platforms/amazon-ec2

11
Virtual Private Networks

Virtual private networks, or VPNs, make it possible to link two networks over an encrypted and limited-access trusted
network. Typically MongoDB users who use VPNs use SSL rather than IPSEC VPNs for performance issues.
Depending on configuration and implementation, VPNs provide for certificate validation and a choice of encryption
protocols, which requires a rigorous level of authentication and identification of all clients. Furthermore, because
VPNs provide a secure tunnel, by using a VPN connection to control access to your MongoDB instance, you can
prevent tampering and “man-in-the-middle” attacks.

2.4 Security and MongoDB API Interfaces

The following section contains strategies to limit risks related to MongoDB’s available interfaces including JavaScript,
HTTP, and REST interfaces.

JavaScript and the Security of the mongo Shell

The following JavaScript evaluation behaviors of the mongo shell represents risk exposures.

JavaScript Expression or JavaScript File

The mongo program can evaluate JavaScript expressions using the command line --eval option. Also, the mongo
program can evaluate a JavaScript file (.js) passed directly to it (e.g. mongo someFile.js).
Because the mongo program evaluates the JavaScript directly, inputs should only come from trusted sources.

.mongorc.js File

If a .mongorc.js file exists 8 , the mongo shell will evaluate a .mongorc.js file before starting. You can disable
this behavior by passing the mongo --norc option.

HTTP Status Interface

The HTTP status interface provides a web-based interface that includes a variety of operational data, logs, and status
reports regarding the mongod or mongos instance. The HTTP interface is always available on the port numbered
1000 greater than the primary mongod port. By default, the HTTP interface port is 28017, but is indirectly set using
the port option which allows you to configure the primary mongod port.
Without the net.http.RESTInterfaceEnabled setting, this interface is entirely read-only, and limited in
scope; nevertheless, this interface may represent an exposure. To disable the HTTP interface, set the enabled run
time option or the --nohttpinterface command line option. See also Configuration Options (page 10).

REST API

The REST API to MongoDB provides additional information and write access on top of the HTTP Status interface.
While the REST API does not provide any support for insert, update, or remove operations, it does provide adminis-
trative access, and its accessibility represents a vulnerability in a secure environment. The REST interface is disabled
by default, and is not recommended for production use.
8 On Linux and Unix systems, mongo reads the .mongorc.js file from $HOME/.mongorc.js (i.e. ~/.mongorc.js). On Windows,

mongo.exe reads the .mongorc.js file from %HOME%.mongorc.js or %HOMEDRIVE%%HOMEPATH%.mongorc.js.

12
If you must use the REST API, please control and limit access to the REST API. The REST API does not include any
support for authentication, even when running with authorization enabled.
See the following documents for instructions on restricting access to the REST API interface:
• Configure Linux iptables Firewall for MongoDB (page 19)
• Configure Windows netsh Firewall for MongoDB (page 22)

2.5 Auditing

New in version 2.6.


MongoDB Enterprise includes an auditing capability for mongod and mongos instances. The auditing facility allows
administrators and users to track system activity for deployments with multiple users and applications. The auditing
facility can write audit events to the console, the syslog, a JSON file, or a BSON file. For details on the audit log
messages, see System Event Audit Messages (page 95).

Audit Events and Filter

The auditing system can record the following operations:


• schema (DDL),
• replica set,
• authentication and authorization, and
• general operations.
See Event Actions, Details, and Results (page 96) for the specific actions recorded.
By default, the auditing system records all these operations; however, you can configure the --auditFilter option
to restrict the events captured.
See Configure System Events Auditing (page 72) to enable and configure auditing for MongoDB Enterprise. To set up
filters, see Filter Events (page 74).

Audit Guarantee

The auditing system writes every audit event 9 to an in-memory buffer of audit events. MongoDB writes this buffer to
disk periodically. For events collected from any single connection, the events have a total order: if MongoDB writes
one event to disk, the system guarantees that it has written all prior events for that connection to disk.
If an audit event entry corresponds to an operation that affects the durable state of the database, such as a modification
to data, MongoDB will always write the audit event to disk before writing to the journal for that entry.
That is, before adding an operation to the journal, MongoDB writes all audit events on the connection that triggered
the operation, up to and including the entry for the operation.
These auditing guarantees require that MongoDB runs with the journaling enabled.

Warning: MongoDB may lose events if the server terminates before it commits the events to the audit log.
The client may receive confirmation of the event before MongoDB commits to the audit log. For example, while
auditing an aggregation operation, the server might crash after returning the result but before the audit log flushes.

9 Audit configuration can include a filter (page 74) to limit events to audit.

13
2.6 Kerberos Authentication

New in version 2.4.

Overview

MongoDB Enterprise provides support for Kerberos authentication of MongoDB clients to mongod and mongos.
Kerberos is an industry standard authentication protocol for large client/server systems. Kerberos allows MongoDB
and applications to take advantage of existing authentication infrastructure and processes.

Kerberos Components and MongoDB

Principals

In a Kerberos-based system, every participant in the authenticated communication is known as a “principal”, and every
principal must have a unique name.
Principals belong to administrative units called realms. For each realm, the Kerberos Key Distribution Center (KDC)
maintains a database of the realm’s principal and the principals’ associated “secret keys”.
For a client-server authentication, the client requests from the KDC a “ticket” for access to a specific asset. KDC
uses the client’s secret and the server’s secret to construct the ticket which allows the client and server to mutually
authenticate each other, while keeping the secrets hidden.
For the configuration of MongoDB for Kerberos support, two kinds of principal names are of interest: user principals
(page 14) and service principals (page 14).

User Principal To authenticate using Kerberos, you must add the Kerberos user principals to MongoDB to the
$external database. User principal names have the form:
<username>@<KERBEROS REALM>

For every user you want to authenticate using Kerberos, you must create a corresponding user in MongoDB in the
$external database.
For examples of adding a user to MongoDB as well as authenticating as that user, see Configure MongoDB with Ker-
beros Authentication on Linux (page 47) and Configure MongoDB with Kerberos Authentication on Windows (page 50).
See also:
http://docs.mongodb.org/manualreference/command/nav-user-management for general in-
formation regarding creating and managing users in MongoDB.

Service Principal Every MongoDB mongod and mongos instance (or mongod.exe or mongos.exe on Win-
dows) must have an associated service principal. Service principal names have the form:
<service>/<fully qualified domain name>@<KERBEROS REALM>

For MongoDB, the <service> defaults to mongodb. For example, if m1.example.com is a MongoDB server,
and example.com maintains the EXAMPLE.COM Kerberos realm, then m1 should have the service principal name
mongodb/[email protected].
To specify a different value for <service>, use serviceName during the start up of mongod or mongos (or
mongod.exe or mongos.exe). mongo shell or other clients may also specify a different service principal name
using serviceName.

14
Service principal names must be reachable over the network using the fully qualified domain name (FQDN) part of its
service principal name.
By default, Kerberos attempts to identify hosts using the /etc/kerb5.conf file before using DNS to resolve hosts.
On Windows, if running MongoDB as a service, see Assign Service Principal Name to MongoDB Windows Service
(page 52).

Linux Keytab Files

Linux systems can store Kerberos authentication keys for a service principal (page 14) in keytab files. Each Kerberized
mongod and mongos instance running on Linux must have access to a keytab file containing keys for its service
principal (page 14).
To keep keytab files secure, use file permissions that restrict access to only the user that runs the mongod or mongos
process.

Tickets

On Linux, MongoDB clients can use Kerberos’s kinit program to initialize a credential cache for authenticating the
user principal to servers.

Windows Active Directory

Unlike on Linux systems, mongod and mongos instances running on Windows do not require access to keytab
files. Instead, the mongod and mongos instances read their server credentials from a credential store specific to the
operating system.
However, from the Windows Active Directory, you can export a keytab file for use on Linux systems. See Ktpass10
for more information.

Authenticate With Kerberos

To configure MongoDB for Kerberos support and authenticate, see Configure MongoDB with Kerberos Authentication
on Linux (page 47) and Configure MongoDB with Kerberos Authentication on Windows (page 50).

Operational Considerations

The HTTP Console

The MongoDB HTTP Console11 interface does not support Kerberos authentication.

DNS

Each host that runs a mongod or mongos instance must have both A and PTR DNS records to provide forward and
reverse lookup.
Without A and PTR DNS records, the host cannot resolve the components of the Kerberos domain or the Key Distri-
bution Center (KDC).
10 http://technet.microsoft.com/en-us/library/cc753771.aspx
11 http://docs.mongodb.org/ecosystem/tools/http-interface/#http-console

15
System Time Synchronization

To successfully authenticate, the system time for each mongod and mongos instance must be within 5 minutes of the
system time of the other hosts in the Kerberos infrastructure.

Kerberized MongoDB Environments

Driver Support

The following MongoDB drivers support Kerberos authentication:


• Java12
• C#13
• C++14
• Python15

Use with Additional MongoDB Authentication Mechanism

Although MongoDB supports the use of Kerberos authentication with other authentication mechanisms, only add the
other mechanisms as necessary. See the Incorporate Additional Authentication Mechanisms sec-
tion in Configure MongoDB with Kerberos Authentication on Linux (page 47) and Configure MongoDB with Kerberos
Authentication on Windows (page 50) for details.

3 Security Tutorials

The following tutorials provide instructions for enabling and using the security features available in MongoDB.
Security Checklist (page 17) A high level overview of global security consideration for administrators of MongoDB
deployments. Use this checklist if you are new to deploying MongoDB in production and want to implement
high quality security practices.
Network Security Tutorials (page 19) Ensure that the underlying network configuration supports a secure operating
environment for MongoDB deployments, and appropriately limits access to MongoDB deployments.
Configure Linux iptables Firewall for MongoDB (page 19) Basic firewall configuration patterns and exam-
ples for iptables on Linux systems.
Configure Windows netsh Firewall for MongoDB (page 22) Basic firewall configuration patterns and exam-
ples for netsh on Windows systems.
Connect to MongoDB with SSL (page 26) SSL allows MongoDB clients to support encrypted connections to
mongod instances.
Continue reading from Network Security Tutorials (page 19) for more information on running MongoDB in
secure environments.
Security Deployment Tutorials (page 32) These tutorials describe procedures for deploying MongoDB using authen-
tication and authorization.
12 http://docs.mongodb.org/ecosystem/tutorial/authenticate-with-java-driver/
13 http://docs.mongodb.org/ecosystem/tutorial/authenticate-with-csharp-driver/
14 http://docs.mongodb.org/ecosystem/tutorial/authenticate-with-cpp-driver/
15 http://api.mongodb.org/python/current/examples/authentication.html

16
Access Control Tutorials (page 36) These tutorials describe procedures relevant for the configuration, operation, and
maintenance of MongoDB’s access control system.
Enable Client Access Control (page 37) Describes the process for enabling authentication for MongoDB de-
ployments.
Authenticate with x.509 Certificate (page 40) Use x.509 for client authentication and internal member authen-
tication.
Configure MongoDB with Kerberos Authentication on Linux (page 47) For MongoDB Enterprise Linux, de-
scribes the process to enable Kerberos-based authentication for MongoDB deployments.
Continue reading from Access Control Tutorials (page 36) for additional tutorials on configuring MongoDB’s
authentication systems.
Enable Authentication after Creating the User Administrator (page 39) Describes an alternative process for
enabling authentication for MongoDB deployments.
User and Role Management Tutorials (page 58) MongoDB’s access control system provides a flexible role-based
access control system that you can use to limit access to MongoDB deployments. The tutorials in this section
describe the configuration an setup of the authorization system.
Add a User to a Database (page 60) Create non-administrator users using MongoDB’s role-based authentica-
tion system.
Create a Role (page 63) Create custom role.
Modify a User’s Access (page 67) Modify the actions available to a user on specific database resources.
View Roles (page 69) View a role’s privileges.
Continue reading from User and Role Management Tutorials (page 58) for additional tutorials on managing
users and privileges in MongoDB’s authorization system.
Configure System Events Auditing (page 72) Enable and configure MongoDB Enterprise system event auditing fea-
ture.
Create a Vulnerability Report (page 75) Report a vulnerability in MongoDB.

3.1 Security Checklist

This documents provides a list of security measures that you should implement to protect your MongoDB installation.

Require Authentication

Enable MongoDB authentication and specify the authentication mechanism. You can use the MongoDB authentica-
tion mechanism or an existing external framework. Authentication requires that all clients and servers provide valid
credentials before they can connect to the system. In clustered deployments, enable authentication for each MongoDB
server.
See Authentication (page 5), Enable Client Access Control (page 37), and Enable Authentication in a Sharded Cluster
(page 38).

Configure Role-Based Access Control

Create roles that define the exact access a set of users needs. Follow a principle of least privilege. Then create users
and assign them only the roles they need to perform their operations. A user can be a person or a client application.

17
Create a user administrator first, then create additional users. Create a unique MongoDB user for each person and
application that accesses the system.
See Authorization (page 8), Create a Role (page 63), Create a User Administrator (page 58), and Add a User to a
Database (page 60).

Encrypt Communication

Configure MongoDB to use SSL for all incoming and outgoing connections. Use SSL to encrypt communication
between mongod and mongos components of a MongoDB client, as well as between all applications and MongoDB.
See Connect to MongoDB with SSL (page 26).

Limit Network Exposure

Ensure that MongoDB runs in a trusted network environment and limit the interfaces on which MongoDB instances
listen for incoming connections. Allow only trusted clients to access the network interfaces and ports on which
MongoDB instances are available.
See the bindIp setting, and see Configure Linux iptables Firewall for MongoDB (page 19) and Configure Windows
netsh Firewall for MongoDB (page 22).

Audit System Activity

Track access and changes to database configurations and data. MongoDB Enterprise16 includes a system auditing
facility that can record system events (e.g. user operations, connection events) on a MongoDB instance. These audit
records permit forensic analysis and allow administrators to verify proper controls.
See Auditing (page 13) and Configure System Events Auditing (page 72).

Encrypt and Protect Data

Encrypt MongoDB data on each host using file-system, device, or physical encryption. Protect MongoDB data using
file-system permissions. MongoDB data includes data files, configuration files, auditing logs, and key files.

Run MongoDB with a Dedicated User

Run MongoDB processes with a dedicated operating system user account. Ensure that the account has permissions to
access data but no unnecessary permissions.
See http://docs.mongodb.org/manualinstallation for more information on running MongoDB.

Run MongoDB with Secure Configuration Options

MongoDB supports the execution of JavaScript code for certain server-side operations: mapReduce, group, eval,
and $where. If you do not use these operations, disable server-side scripting by using the --noscripting option
on the command line.
Use only the MongoDB wire protocol on production deployments. Do not enable the following, all of which enable
the web server interface: enabled, net.http.JSONPEnabled, and net.http.RESTInterfaceEnabled.
Leave these disabled, unless required for backwards compatibility.
16 http://www.mongodb.com/products/mongodb-enterprise

18
Keep input validation enabled. MongoDB enables input validation by default through the wireObjectCheck
setting. This ensures that all documents stored by the mongod instance are valid BSON.

3.2 Network Security Tutorials

The following tutorials provide information on handling network security for MongoDB.
Configure Linux iptables Firewall for MongoDB (page 19) Basic firewall configuration patterns and examples for
iptables on Linux systems.
Configure Windows netsh Firewall for MongoDB (page 22) Basic firewall configuration patterns and examples for
netsh on Windows systems.
Connect to MongoDB with SSL (page 26) SSL allows MongoDB clients to support encrypted connections to
mongod instances.
Upgrade a Cluster to Use SSL (page 31) Rolling upgrade process to use SSL.

Configure Linux iptables Firewall for MongoDB

On contemporary Linux systems, the iptables program provides methods for managing the Linux Kernel’s
netfilter or network packet filtering capabilities. These firewall rules make it possible for administrators to
control what hosts can connect to the system, and limit risk exposure by limiting the hosts that can connect to a
system.
This document outlines basic firewall configurations for iptables firewalls on Linux. Use these approaches as a
starting point for your larger networking organization. For a detailed overview of security practices and risk manage-
ment for MongoDB, see Security Concepts (page 5).
See also:
For MongoDB deployments on Amazon’s web services, see the Amazon EC217 page, which addresses Amazon’s
Security Groups and other EC2-specific security features.

Overview

Rules in iptables configurations fall into chains, which describe the process for filtering and processing specific
streams of traffic. Chains have an order, and packets must pass through earlier rules in a chain to reach later rules.
This document addresses only the following two chains:
INPUT Controls all incoming traffic.
OUTPUT Controls all outgoing traffic.
Given the default ports (page 10) of all MongoDB processes, you must configure networking rules that permit only
required communication between your application and the appropriate mongod and mongos instances.
Be aware that, by default, the default policy of iptables is to allow all connections and traffic unless explicitly
disabled. The configuration changes outlined in this document will create rules that explicitly allow traffic from
specific addresses and on specific ports, using a default policy that drops all traffic that is not explicitly allowed. When
you have properly configured your iptables rules to allow only the traffic that you want to permit, you can Change
Default Policy to DROP (page 21).
17 http://docs.mongodb.org/ecosystem/platforms/amazon-ec2

19
Patterns

This section contains a number of patterns and examples for configuring iptables for use with MongoDB deploy-
ments. If you have configured different ports using the port configuration setting, you will need to modify the rules
accordingly.

Traffic to and from mongod Instances This pattern is applicable to all mongod instances running as standalone
instances or as part of a replica set.
The goal of this pattern is to explicitly allow traffic to the mongod instance from the application server. In the
following examples, replace <ip-address> with the IP address of the application server:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT

The first rule allows all incoming traffic from <ip-address> on port 27017, which allows the application server to
connect to the mongod instance. The second rule, allows outgoing traffic from the mongod to reach the application
server.

Optional
If you have only one application server, you can replace <ip-address> with either the IP address itself, such as:
198.51.100.55. You can also express this using CIDR notation as 198.51.100.55/32. If you want to permit
a larger block of possible IP addresses you can allow traffic from a http://docs.mongodb.org/manual24
using one of the following specifications for the <ip-address>, as follows:
10.10.10.10/24
10.10.10.10/255.255.255.0

Traffic to and from mongos Instances mongos instances provide query routing for sharded clusters. Clients
connect to mongos instances, which behave from the client’s perspective as mongod instances. In turn, the mongos
connects to all mongod instances that are components of the sharded cluster.
Use the same iptables command to allow traffic to and from these instances as you would from the mongod
instances that are members of the replica set. Take the configuration outlined in the Traffic to and from mongod
Instances (page 20) section as an example.

Traffic to and from a MongoDB Config Server Config servers, host the config database that stores metadata
for sharded clusters. Each production cluster has three config servers, initiated using the mongod --configsvr
option. 18 Config servers listen for connections on port 27019. As a result, add the following iptables rules to the
config server to allow incoming and outgoing connection on port 27019, for connection to the other config servers.
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27019 -m state --state ESTABLISHED -j ACCEPT

Replace <ip-address> with the address or address space of all the mongod that provide config servers.
Additionally, config servers need to allow incoming connections from all of the mongos instances in the cluster and
all mongod instances in the cluster. Add rules that resemble the following:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j

Replace <ip-address> with the address of the mongos instances and the shard mongod instances.
18 You also can run a config server by using the configsvr value for the clusterRole setting in a configuration file.

20
Traffic to and from a MongoDB Shard Server For shard servers, running as mongod --shardsvr 19 Because
the default port number is 27018 when running with the shardsvr value for the clusterRole setting, you must
configure the following iptables rules to allow traffic to and from each shard:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27018 -m state --state NEW,ESTABLISHED -j
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT

Replace the <ip-address> specification with the IP address of all mongod. This allows you to permit incoming
and outgoing traffic between all shards including constituent replica set members, to:
• all mongod instances in the shard’s replica sets.
20
• all mongod instances in other shards.
Furthermore, shards need to be able make outgoing connections to:
• all mongos instances.
• all mongod instances in the config servers.
Create a rule that resembles the following, and replace the <ip-address> with the address of the config servers
and the mongos instances:
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT

Provide Access For Monitoring Systems


1. The mongostat diagnostic tool, when running with the --discover needs to be able to reach all compo-
nents of a cluster, including the config servers, the shard servers, and the mongos instances.
2. If your monitoring system needs access the HTTP interface, insert the following rule to the chain:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 28017 -m state --state NEW,ESTABLISH

Replace <ip-address> with the address of the instance that needs access to the HTTP or REST interface.
For all deployments, you should restrict access to this port to only the monitoring instance.

Optional
For config server mongod instances running with the shardsvr value for the clusterRole setting, the
rule would resemble the following:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 28018 -m state --state NEW,ESTABLISH

For config server mongod instances running with the configsvr value for the clusterRole setting, the
rule would resemble the following:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 28019 -m state --state NEW,ESTABLISH

Change Default Policy to DROP

The default policy for iptables chains is to allow all traffic. After completing all iptables configuration changes,
you must change the default policy to DROP so that all traffic that isn’t explicitly allowed as above will not be able to
reach components of the MongoDB deployment. Issue the following commands to change this policy:
19 You can also specify the shard server option with the shardsvr value for the clusterRole setting in the configuration file. Shard members

are also often conventional replica sets using the default port.
20 All shards in a cluster need to be able to communicate with all other shards to facilitate chunk and balancing operations.

21
iptables -P INPUT DROP

iptables -P OUTPUT DROP

Manage and Maintain iptables Configuration

This section contains a number of basic operations for managing and using iptables. There are various front end
tools that automate some aspects of iptables configuration, but at the core all iptables front ends provide the
same basic functionality:

Make all iptables Rules Persistent By default all iptables rules are only stored in memory. When your
system restarts, your firewall rules will revert to their defaults. When you have tested a rule set and have guaranteed
that it effectively controls traffic you can use the following operations to you should make the rule set persistent.
On Red Hat Enterprise Linux, Fedora Linux, and related distributions you can issue the following command:
service iptables save

On Debian, Ubuntu, and related distributions, you can use the following command to dump the iptables rules to
the /etc/iptables.conf file:
iptables-save > /etc/iptables.conf

Run the following operation to restore the network rules:


iptables-restore < /etc/iptables.conf

Place this command in your rc.local file, or in the /etc/network/if-up.d/iptables file with other
similar operations.

List all iptables Rules To list all of currently applied iptables rules, use the following operation at the system
shell.
iptables --L

Flush all iptables Rules If you make a configuration mistake when entering iptables rules or simply need to
revert to the default rule set, you can use the following operation at the system shell to flush all rules:
iptables --F

If you’ve already made your iptables rules persistent, you will need to repeat the appropriate procedure in the
Make all iptables Rules Persistent (page 22) section.

Configure Windows netsh Firewall for MongoDB

On Windows Server systems, the netsh program provides methods for managing the Windows Firewall. These
firewall rules make it possible for administrators to control what hosts can connect to the system, and limit risk
exposure by limiting the hosts that can connect to a system.
This document outlines basic Windows Firewall configurations. Use these approaches as a starting point for your
larger networking organization. For a detailed over view of security practices and risk management for MongoDB, see
Security Concepts (page 5).
See also:

22
Windows Firewall21 documentation from Microsoft.

Overview

Windows Firewall processes rules in an ordered determined by rule type, and parsed in the following order:
1. Windows Service Hardening
2. Connection security rules
3. Authenticated Bypass Rules
4. Block Rules
5. Allow Rules
6. Default Rules
By default, the policy in Windows Firewall allows all outbound connections and blocks all incoming connections.
Given the default ports (page 10) of all MongoDB processes, you must configure networking rules that permit only
required communication between your application and the appropriate mongod.exe and mongos.exe instances.
The configuration changes outlined in this document will create rules which explicitly allow traffic from specific
addresses and on specific ports, using a default policy that drops all traffic that is not explicitly allowed.
You can configure the Windows Firewall with using the netsh command line tool or through a windows application.
On Windows Server 2008 this application is Windows Firewall With Advanced Security in Administrative Tools. On
previous versions of Windows Server, access the Windows Firewall application in the System and Security control
panel.
The procedures in this document use the netsh command line tool.

Patterns

This section contains a number of patterns and examples for configuring Windows Firewall for use with MongoDB
deployments. If you have configured different ports using the port configuration setting, you will need to modify the
rules accordingly.

Traffic to and from mongod.exe Instances This pattern is applicable to all mongod.exe instances running as
standalone instances or as part of a replica set. The goal of this pattern is to explicitly allow traffic to the mongod.exe
instance from the application server.
netsh advfirewall firewall add rule name="Open mongod port 27017" dir=in action=allow protocol=TCP lo

This rule allows all incoming traffic to port 27017, which allows the application server to connect to the
mongod.exe instance.
Windows Firewall also allows enabling network access for an entire application rather than to a specific port, as in the
following example:
netsh advfirewall firewall add rule name="Allowing mongod" dir=in action=allow program=" C:\mongodb\b

You can allow all access for a mongos.exe server, with the following invocation:
netsh advfirewall firewall add rule name="Allowing mongos" dir=in action=allow program=" C:\mongodb\b
21 http://technet.microsoft.com/en-us/network/bb545423.aspx

23
Traffic to and from mongos.exe Instances mongos.exe instances provide query routing for sharded clusters.
Clients connect to mongos.exe instances, which behave from the client’s perspective as mongod.exe instances.
In turn, the mongos.exe connects to all mongod.exe instances that are components of the sharded cluster.
Use the same Windows Firewall command to allow traffic to and from these instances as you would from the
mongod.exe instances that are members of the replica set.
netsh advfirewall firewall add rule name="Open mongod shard port 27018" dir=in action=allow protocol=

Traffic to and from a MongoDB Config Server Configuration servers, host the config database that stores meta-
data for sharded clusters. Each production cluster has three configuration servers, initiated using the mongod
--configsvr option. 22 Configuration servers listen for connections on port 27019. As a result, add the fol-
lowing Windows Firewall rules to the config server to allow incoming and outgoing connection on port 27019, for
connection to the other config servers.
netsh advfirewall firewall add rule name="Open mongod config svr port 27019" dir=in action=allow prot

Additionally, config servers need to allow incoming connections from all of the mongos.exe instances in the cluster
and all mongod.exe instances in the cluster. Add rules that resemble the following:
netsh advfirewall firewall add rule name="Open mongod config svr inbound" dir=in action=allow protoco

Replace <ip-address> with the addresses of the mongos.exe instances and the shard mongod.exe instances.

Traffic to and from a MongoDB Shard Server For shard servers, running as mongod --shardsvr 23 Because
the default port number is 27018 when running with the shardsvr value for the clusterRole setting, you must
configure the following Windows Firewall rules to allow traffic to and from each shard:
netsh advfirewall firewall add rule name="Open mongod shardsvr inbound" dir=in action=allow protocol=
netsh advfirewall firewall add rule name="Open mongod shardsvr outbound" dir=out action=allow protoco

Replace the <ip-address> specification with the IP address of all mongod.exe instances. This allows you to
permit incoming and outgoing traffic between all shards including constituent replica set members to:
• all mongod.exe instances in the shard’s replica sets.
24
• all mongod.exe instances in other shards.
Furthermore, shards need to be able make outgoing connections to:
• all mongos.exe instances.
• all mongod.exe instances in the config servers.
Create a rule that resembles the following, and replace the <ip-address> with the address of the config servers
and the mongos.exe instances:
netsh advfirewall firewall add rule name="Open mongod config svr outbound" dir=out action=allow proto

Provide Access For Monitoring Systems


1. The mongostat diagnostic tool, when running with the --discover needs to be able to reach all compo-
nents of a cluster, including the config servers, the shard servers, and the mongos.exe instances.
22 You also can run a config server by using the configsrv value for the clusterRole setting in a configuration file.
23 You can also specify the shard server option with the shardsvr value for the clusterRole setting in the configuration file. Shard members
are also often conventional replica sets using the default port.
24 All shards in a cluster need to be able to communicate with all other shards to facilitate chunk and balancing operations.

24
2. If your monitoring system needs access the HTTP interface, insert the following rule to the chain:
netsh advfirewall firewall add rule name="Open mongod HTTP monitoring inbound" dir=in action=all

Replace <ip-address> with the address of the instance that needs access to the HTTP or REST interface.
For all deployments, you should restrict access to this port to only the monitoring instance.

Optional
For config server mongod instances running with the shardsvr value for the clusterRole setting, the
rule would resemble the following:
netsh advfirewall firewall add rule name="Open mongos HTTP monitoring inbound" dir=in action=all

For config server mongod instances running with the configsvr value for the clusterRole setting, the
rule would resemble the following:
netsh advfirewall firewall add rule name="Open mongod configsvr HTTP monitoring inbound" dir=in

Manage and Maintain Windows Firewall Configurations

This section contains a number of basic operations for managing and using netsh. While you can use the GUI front
ends to manage the Windows Firewall, all core functionality is accessible is accessible from netsh.

Delete all Windows Firewall Rules To delete the firewall rule allowing mongod.exe traffic:
netsh advfirewall firewall delete rule name="Open mongod port 27017" protocol=tcp localport=27017

netsh advfirewall firewall delete rule name="Open mongod shard port 27018" protocol=tcp localport=270

List All Windows Firewall Rules To return a list of all Windows Firewall rules:
netsh advfirewall firewall show rule name=all

Reset Windows Firewall To reset the Windows Firewall rules:


netsh advfirewall reset

Backup and Restore Windows Firewall Rules To simplify administration of larger collection of systems, you can
export or import firewall systems from different servers) rules very easily on Windows:
Export all firewall rules with the following command:
netsh advfirewall export "C:\temp\MongoDBfw.wfw"

Replace "C:\temp\MongoDBfw.wfw" with a path of your choosing. You can use a command in the following
form to import a file created using this operation:
netsh advfirewall import "C:\temp\MongoDBfw.wfw"

25
Connect to MongoDB with SSL

This document outlines the use and operation of MongoDB’s SSL support. SSL allows MongoDB clients to support
encrypted connections to mongod instances.

Note: The default distribution of MongoDB25 does not contain support for SSL. To use SSL, you must either build
MongoDB locally passing the --ssl option to scons or use MongoDB Enterprise26 .

These instructions outline the process for getting started with SSL and assume that you have already installed a build
of MongoDB that includes SSL support and that your client driver supports SSL. For instructions on upgrading a
cluster currently not using SSL to using SSL, see Upgrade a Cluster to Use SSL (page 31).
Changed in version 2.6: MongoDB’s SSL encryption only allows use of strong SSL ciphers with a minimum of
128-bit key length for all connections. MongoDB Enterprise for Windows includes support for SSL.

Configure mongod and mongos for SSL

Combine SSL Certificate and Key File Before you can use SSL, you must have a .pem file that contains the public
key certificate and private key. MongoDB can use any valid SSL certificate. To generate a self-signed certificate and
private key, use a command that resembles the following:
• cd /etc/ssl/
openssl req -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key

This operation generates a new, self-signed certificate with no passphrase that is valid for 365 days. Once you have
the certificate, concatenate the certificate and private key to a .pem file, as in the following example:
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

Set Up mongod and mongos with SSL Certificate and Key To use SSL in your MongoDB deployment, include
the following run-time options with mongod and mongos:
• net.ssl.mode set to requireSSL. This setting restricts each server to use only SSL encrypted connections.
You can also specify either the value allowSSL or preferSSL to set up the use of mixed SSL modes on a
port. See net.ssl.mode for details.
• PEMKeyfile with the .pem file that contains the SSL certificate and key.
Consider the following syntax for mongod:
mongod --sslMode requireSSL --sslPEMKeyFile <pem>

For example, given an SSL certificate located at /etc/ssl/mongodb.pem, configure mongod to use SSL encryp-
tion for all connections with the following command:
mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem

Note:
• Specify <pem> with the full path name to the certificate.
• If the private key portion of the <pem> is encrypted, specify the passphrase. See SSL Certificate Passphrase
(page 28).
• You may also specify these options in the configuration file, as in the following example:
25 http://www.mongodb.org/downloads
26 http://www.mongodb.com/products/mongodb-enterprise

26
sslMode = requireSSL
sslPEMKeyFile = /etc/ssl/mongodb.pem

To connect, to mongod and mongos instances using SSL, the mongo shell and MongoDB tools must include the
--ssl option. See SSL Configuration for Clients (page 28) for more information on connecting to mongod and
mongos running with SSL.
See also:
Upgrade a Cluster to Use SSL (page 31)

Set Up mongod and mongos with Certificate Validation To set up mongod or mongos for SSL encryption
using an SSL certificate signed by a certificate authority, include the following run-time options during startup:
• net.ssl.mode set to requireSSL. This setting restricts each server to use only SSL encrypted connections.
You can also specify either the value allowSSL or preferSSL to set up the use of mixed SSL modes on a
port. See net.ssl.mode for details.
• PEMKeyfile with the name of the .pem file that contains the signed SSL certificate and key.
• CAFile with the name of the .pem file that contains the root certificate chain from the Certificate Authority.
Consider the following syntax for mongod:
mongod --sslMode requireSSL --sslPEMKeyFile <pem> --sslCAFile <ca>

For example, given a signed SSL certificate located at /etc/ssl/mongodb.pem and the certificate authority file
at /etc/ssl/ca.pem, you can configure mongod for SSL encryption as follows:
mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem

Note:
• Specify the <pem> file and the <ca> file with either the full path name or the relative path name.
• If the <pem> is encrypted, specify the passphrase. See SSL Certificate Passphrase (page 28).
• You may also specify these options in the configuration file, as in the following example:
sslMode = requireSSL
sslPEMKeyFile = /etc/ssl/mongodb.pem
sslCAFile = /etc/ssl/ca.pem

To connect, to mongod and mongos instances using SSL, the mongo tools must include the both the --ssl and
--sslPEMKeyFile option. See SSL Configuration for Clients (page 28) for more information on connecting to
mongod and mongos running with SSL.
See also:
Upgrade a Cluster to Use SSL (page 31)

Block Revoked Certificates for Clients To prevent clients with revoked certificates from connecting, include the
sslCRLFile to specify a .pem file that contains revoked certificates.
For example, the following mongod with SSL configuration includes the sslCRLFile setting:
mongod --sslMode requireSSL --sslCRLFile /etc/ssl/ca-crl.pem --sslPEMKeyFile /etc/ssl/mongodb.pem --s

Clients with revoked certificates in the /etc/ssl/ca-crl.pem will not be able to connect to this mongod in-
stance.

27
Validate Only if a Client Presents a Certificate In most cases it is important to ensure that clients present valid
certificates. However, if you have clients that cannot present a client certificate, or are transitioning to using a certificate
authority you may only want to validate certificates from clients that present a certificate.
If you want to bypass validation for clients that don’t present certificates, include the
weakCertificateValidation run-time option with mongod and mongos. If the client does not present a
certificate, no validation occurs. These connections, though not validated, are still encrypted using SSL.
For example, consider the following mongod with an SSL configuration that includes the
weakCertificateValidation setting:
mongod --sslMode requireSSL --sslWeakCertificateValidation --sslPEMKeyFile /etc/ssl/mongodb.pem --ssl

Then, clients can connect either with the option --ssl and no certificate or with the option --ssl and a valid
certificate. See SSL Configuration for Clients (page 28) for more information on SSL connections for clients.

Note: If the client presents a certificate, the certificate must be a valid certificate.
All connections, including those that have not presented certificates are encrypted using SSL.

Run in FIPS Mode MongoDB Enterprise27 supports running in FIPS mode.


If your mongod or mongos is running on a system with an OpenSSL library configured with the FIPS 140-2 module,
you can run mongod or mongos in FIPS mode, with the FIPSMode setting.
For Red Hat Enterprise Linux 6.x (RHEL 6.x) or its derivatives such as CentOS 6.x, the OpenSSL toolkit must be
at least openssl-1.0.1e-16.el6_5 to run in FIPS mode. To upgrade the toolkit for these platforms, issue the
following command:
yum update openssl

SSL Certificate Passphrase The PEM files for PEMKeyfile and ClusterFile may be encrypted. With en-
crypted PEM files, you must specify the passphrase at startup with a command-line or a configuration file option or
enter the passphrase when prompted.
Changed in version 2.6: In previous versions, you can only specify the passphrase with a command-line or a configu-
ration file option.
To specify the passphrase in clear text on the command line or in a configuration file, use the PEMKeyPassword
and/or the ClusterPassword option.
To have MongoDB prompt for the passphrase at the start of mongod or mongos and avoid specifying the passphrase
in clear text, omit the PEMKeyPassword and/or the ClusterPassword option. MongoDB will prompt for each
passphrase as necessary.

Important: The passphrase prompt option is available if you run the MongoDB instance in the foreground with
a connected terminal. If you run mongod or mongos in a non-interactive session (e.g. without a terminal or as a
service on Windows), you cannot use the passphrase prompt option.

SSL Configuration for Clients

Clients must have support for SSL to work with a mongod or a mongos instance that has SSL support enabled. The
current versions of the Python, Java, Ruby, Node.js, .NET, and C++ drivers have support for SSL, with full support
coming in future releases of other drivers.
27 http://www.mongodb.com/products/mongodb-enterprise

28
mongo SSL Configuration For SSL connections, you must use the mongo shell built with SSL support or dis-
tributed with MongoDB Enterprise. To support SSL, mongo has the following settings:
• --ssl
• --sslPEMKeyFile with the name of the .pem file that contains the SSL certificate and key.
• --sslCAFile with the name of the .pem file that contains the certificate from the Certificate Authority.
• --sslPEMKeyPassword option if the client certificate-key file is encrypted.

Connect to MongoDB Instance with SSL Encryption To connect to a mongod or mongos instance that requires
only a SSL encryption mode (page 26), start mongo shell with --ssl, as in the following:
mongo --ssl

Connect to MongoDB Instance that Requires Client Certificates To connect to a mongod or mongos that re-
quires CA-signed client certificates (page 27), start the mongo shell with --ssl and the --sslPEMKeyFile option
to specify the signed certificate-key file, as in the following:
mongo --ssl --sslPEMKeyFile /etc/ssl/client.pem

Connect to MongoDB Instance that Validates when Presented with a Certificate To connect to a mongod or
mongos instance that only requires valid certificates when the client presents a certificate (page 28), start mongo
shell either with the --ssl ssl and no certificate or with the --ssl ssl and a valid signed certificate.
For example, if mongod is running with weak certificate validation, both of the following mongo shell clients can
connect to that mongod:
mongo --ssl
mongo --ssl --sslPEMKeyFile /etc/ssl/client.pem

Important: If the client presents a certificate, the certificate must be valid.

MMS Monitoring Agent The Monitoring agent will also have to connect via SSL in order to gather its stats. Be-
cause the agent already utilizes SSL for its communications to the MMS servers, this is just a matter of enabling SSL
support in MMS itself on a per host basis.
Use the “Edit” host button (i.e. the pencil) on the Hosts page in the MMS console to enable SSL.
Please see the MMS documentation28 for more information about MMS configuration.

PyMongo Add the “ssl=True” parameter to a PyMongo MongoClient29 to create a MongoDB connection to
an SSL MongoDB instance:
from pymongo import MongoClient
c = MongoClient(host="mongodb.example.net", port=27017, ssl=True)

To connect to a replica set, use the following operation:


from pymongo import MongoReplicaSetClient
c = MongoReplicaSetClient("mongodb.example.net:27017",
replicaSet="mysetname", ssl=True)
28 http://mms.mongodb.com/help
29 http://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient

29
PyMongo also supports an “ssl=true” option for the MongoDB URI:
mongodb://mongodb.example.net:27017/?ssl=true

Java Consider the following example “SSLApp.java” class file:


import com.mongodb.*;
import javax.net.ssl.SSLSocketFactory;

public class SSLApp {

public static void main(String args[]) throws Exception {

MongoClientOptions o = new MongoClientOptions.Builder()


.socketFactory(SSLSocketFactory.getDefault())
.build();

MongoClient m = new MongoClient("localhost", o);

DB db = m.getDB( "test" );
DBCollection c = db.getCollection( "foo" );

System.out.println( c.findOne() );
}
}

Ruby The recent versions of the Ruby driver have support for connections to SSL servers. Install the latest version
of the driver with the following command:
gem install mongo

Then connect to a standalone instance, using the following form:


require 'rubygems'
require 'mongo'

connection = MongoClient.new('localhost', 27017, :ssl => true)

Replace connection with the following if you’re connecting to a replica set:


connection = MongoReplicaSetClient.new(['localhost:27017'],
['localhost:27018'],
:ssl => true)

Here, mongod instance run on “localhost:27017” and “localhost:27018”.

Node.JS (node-mongodb-native) In the node-mongodb-native30 driver, use the following invocation to con-
nect to a mongod or mongos instance via SSL:
var db1 = new Db(MONGODB, new Server("127.0.0.1", 27017,
{ auto_reconnect: false, poolSize:4, ssl:true } );

To connect to a replica set via SSL, use the following form:

30 https://github.com/mongodb/node-mongodb-native

30
var replSet = new ReplSetServers( [
new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
],
{rs_name:RS.name, ssl:true}
);

.NET As of release 1.6, the .NET driver supports SSL connections with mongod and mongos instances. To connect
using SSL, you must add an option to the connection string, specifying ssl=true as follows:
var connectionString = "mongodb://localhost/?ssl=true";
var server = MongoServer.Create(connectionString);

The .NET driver will validate the certificate against the local trusted certificate store, in addition to providing en-
cryption of the server. This behavior may produce issues during testing if the server uses a self-signed certificate. If
you encounter this issue, add the sslverifycertificate=false option to the connection string to prevent the
.NET driver from validating the certificate, as follows:
var connectionString = "mongodb://localhost/?ssl=true&sslverifycertificate=false";
var server = MongoServer.Create(connectionString);

MongoDB Tools Changed in version 2.6.


Various MongoDB utility programs supports SSL. These tools include:
• mongodump
• mongoexport
• mongofiles
• mongoimport
• mongooplog
• mongorestore
• mongostat
• mongotop

Tip
To use SSL connections with these tools, use the same SSL options as the mongo shell. See mongo SSL Configuration
(page 29).

Upgrade a Cluster to Use SSL

Note: The default distribution of MongoDB31 does not contain support for SSL. To use SSL you can either compile
MongoDB with SSL support or use MongoDB Enterprise. See Connect to MongoDB with SSL (page 26) for more
information about SSL and MongoDB.

Changed in version 2.6.


31 http://www.mongodb.org/downloads

31
The MongoDB server supports listening for both SSL encrypted and unencrypted connections on the same TCP port.
This allows upgrades of MongoDB clusters to use SSL encrypted connections. To upgrade from a MongoDB cluster
using no SSL encryption to one using only SSL encryption, use the following rolling upgrade process:
1. For each node of a cluster, start the node with the option --sslMode set to allowSSL. The --sslMode
allowSSL setting allows the node to accept both SSL and non-SSL incoming connections. Its connections to
other servers do not use SSL. Include other SSL options (page 26) as well as any other options that are required
for your specific configuration. For example:
mongod --replSet <name> --sslMode allowSSL --sslPEMKeyFile <path to SSL Certificate and key PEM

Upgrade all nodes of the cluster to these settings.

Note: You may also specify these options in the configuration file, as in the following example:
sslMode = <disabled|allowSSL|preferSSL|requireSSL>
sslPEMKeyFile = <path to SSL certificate and key PEM file>
sslCAFile = <path to root CA PEM file>

2. Switch all clients to use SSL. See SSL Configuration for Clients (page 28).
3. For each node of a cluster, use the setParameter command to update the sslMode to preferSSL. 32
With preferSSL as its net.ssl.mode, the node accepts both SSL and non-SSL incoming connections,
and its connections to other servers use SSL. For example:
db.getSiblingDB('admin').runCommand( { setParameter: 1, sslMode: "preferSSL" } )

Upgrade all nodes of the cluster to these settings.


At this point, all connections should be using SSL.
4. For each node of the cluster, use the setParameter command to update the sslMode to requireSSL. 1
With requireSSL as its net.ssl.mode, the node will reject any non-SSL connections. For example:
db.getSiblingDB('admin').runCommand( { setParameter: 1, sslMode: "requireSSL" } )

5. After the upgrade of all nodes, edit the configuration file with the appropriate SSL settings to ensure
that upon subsequent restarts, the cluster uses SSL.

3.3 Security Deployment Tutorials

The following tutorials provide information in deploying MongoDB using authentication and authorization.
Deploy Replica Set and Configure Authentication and Authorization (page 32) Configure a replica set that has au-
thentication enabled.

Deploy Replica Set and Configure Authentication and Authorization

Overview

With authentication (page 5) enabled, MongoDB forces all clients to identify themselves before granting access to the
server. Authorization (page 8), in turn, allows administrators to define and limit the resources and operations that a
user can access. Using authentication and authorization is a key part of a complete security strategy.
32 As an alternative to using the setParameter command, you can also restart the nodes with the appropriate SSL options and values.

32
All MongoDB deployments support authentication. By default, MongoDB does not require authorization checking.
You can enforce authorization checking when deploying MongoDB, or on an existing deploying; however, you cannot
enable authorization checking on a running deployment without downtime.
This tutorial provides a procedure for creating a MongoDB replica set that uses the challenge-response authen-
tication mechanism. The tutorial includes creation of a minimal authorization system to support basic operations.

Considerations

Authentication In this procedure, you will configure MongoDB using the default challenge-response authentication
mechanism, using the keyFile to supply the password for inter-process authentication (page 7). The content of the
key file is the shared secret used for all internal authentication.
All deployments that enforce authorization checking should have one user administrator user that can create new users
and modify existing users. During this procedure you will create a user administrator that you will use to administer
this deployment.

Architecture In a production, deploy each member of the replica set to its own machine and if possible bind to the
standard MongoDB port of 27017. Use the bind_ip option to ensure that MongoDB listens for connections from
applications on configured addresses.
For a geographically distributed replica sets, ensure that the majority of the set’s mongod instances reside in the
primary site.
See http://docs.mongodb.org/manualcore/replica-set-architectures for more information.

Connectivity Ensure that network traffic can pass between all members of the set and all clients in the network
securely and efficiently. Consider the following:
• Establish a virtual private network. Ensure that your network topology routes all traffic between members within
a single site over the local area network.
• Configure access control to prevent connections from unknown clients to the replica set.
• Configure networking and firewall rules so that incoming and outgoing packets are permitted only on the default
MongoDB port and only from within your deployment.
Finally ensure that each member of a replica set is accessible by way of resolvable DNS or hostnames. You should
either configure your DNS names appropriately or set up your systems’ /etc/hosts file to reflect this configuration.

Configuration Specify the run time configuration on each system in a configuration file stored in
/etc/mongodb.conf or a related location. Create the directory where MongoDB stores data files before de-
ploying MongoDB.
For more information about the run time options used above and other configuration options, see
http://docs.mongodb.org/manualreference/configuration-options.

Procedure

This procedure deploys a replica set in which all members use the same key file.

Step 1: Start one member of the replica set. This mongod should not enable auth.

33
Step 1: Create the key file to be used by each member of the replica set. Create the key file your deployment will
use to authenticate servers to each other.
To generate pseudo-random data to use for a keyfile, issue the following openssl command:
openssl rand -base64 741 > mongodb-keyfile
chmod 600 mongodb-keyfile

You may generate a key file using any method you choose. Always ensure that the password stored in the key file is
both long and contains a high amount of entropy. Using openssl in this manner helps generate such a key.

Step 2: Create administrative users. The following operations will create two users: a user administrator that will
be able to create and modify users (siteUserAdmin), and a root (page 84) user (siteRootAdmin) that you
will use to complete the remainder of the tutorial:
use admin
db.createUser( {
user: "siteUserAdmin",
pwd: "<password>",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
});
db.createUser( {
user: "siteRootAdmin",
pwd: "<password>",
roles: [ { role: "root", db: "admin" } ]
});

Step 2: Copy the key file to each member of the replica set. Copy the mongodb-keyfile to all hosts where
components of a MongoDB deployment run. Set the permissions of these files to 600 so that only the owner of the
file can read or write this file to prevent other users on the system from accessing the shared secret.

Step 3: Stop the mongod instance.

Step 3: Start each member of the replica set with the appropriate options. For each member, start a mongod
and specify the key file and the name of the replica set. Also specify other parameters as needed for your deployment.
For replication-specific parameters, see cli-mongod-replica-set required by your deployment.
If your application connects to more than one replica set, each set should have a distinct name. Some drivers group
replica set connections by replica set name.
The following example specifies parameters through the --keyFile and --replSet command-line options:
mongod --keyFile /mysecretdirectory/keyfile --replSet "rs0"

The following example specifies parameters through a configuration file:


mongod --config $HOME/.mongodb/config

In production deployments, you can configure a control script to manage this process. Control scripts are beyond the
scope of this document.

Step 4: Connect to the member of the replica set where you created the administrative users. Connect to
the replica set member you started and authenticate as the siteRootAdmin user. From the mongo shell, use the
following operation to authenticate:

34
use admin
db.auth("siteRootAdmin", "<password>");

Step 5: Initiate the replica set. Use rs.initiate():


rs.initiate()

MongoDB initiates a set that consists of the current member and that uses the default replica set configuration.

Step 6: Verify the initial replica set configuration. Use rs.conf() to display the replica set
configuration object:
rs.conf()

The replica set configuration object resembles the following:


{
"_id" : "rs0",
"version" : 1,
"members" : [
{
"_id" : 1,
"host" : "mongodb0.example.net:27017"
}
]
}

Step 7: Add the remaining members to the replica set. Add the remaining members with the rs.add() method.
The following example adds two members:
rs.add("mongodb1.example.net")
rs.add("mongodb2.example.net")

When complete, you have a fully functional replica set. The new replica set will elect a primary.

Step 8: Check the status of the replica set. Use the rs.status() operation:
rs.status()

Step 9: Create the system user administrator. Add the user administrator with the userAdminAnyDatabase
(page 83) role, and only that role.
You must issue the following operation while connected to the primary as the siteRootAdmin user.
The following example creates the user siteUserAdmin user on the admin database:
use admin
db.createUser(
{
user: "siteUserAdmin",
pwd: "password",
roles:
[
{

35
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)

Step 10: Create additional users to address operational requirements. You can use built-in roles (page 77) to
create common types of database users, such as the dbOwner (page 79) role to create a database administrator, the
readWrite (page 77) role to create a user who can update data, or the read (page 77) role to create user who can
search data but no more. You also can define custom roles (page 9).
For example, the following creates a database administrator for the products database:
use products
db.createUser(
{
user: "productsDBAdmin",
pwd: "password",
roles:
[
{
role: "dbOwner",
db: "products"
}
]
}
)

For an overview of roles and privileges, see Authorization (page 8). For more information on adding users, see Add a
User to a Database (page 60).

3.4 Access Control Tutorials

The following tutorials provide instructions for MongoDB”s authentication and authorization related features.
Enable Client Access Control (page 37) Describes the process for enabling authentication for MongoDB deploy-
ments.
Enable Authentication in a Sharded Cluster (page 38) Control access to a sharded cluster through a key file and the
keyFile setting on each of the cluster’s components.
Enable Authentication after Creating the User Administrator (page 39) Describes an alternative process for en-
abling authentication for MongoDB deployments.
Authenticate with x.509 Certificate (page 40) Use x.509 for client authentication and internal member authentica-
tion.
Authenticate Using SASL and LDAP (page 44) Describes the process for authentication with SASL/LDAP.
Configure MongoDB with Kerberos Authentication on Linux (page 47) For MongoDB Enterprise Linux, describes
the process to enable Kerberos-based authentication for MongoDB deployments.
Configure MongoDB with Kerberos Authentication on Windows (page 50) For MongoDB Enterprise for Windows,
describes the process to enable Kerberos-based authentication for MongoDB deployments.
Authenticate to a MongoDB Instance or Cluster (page 52) Describes the process for authenticating to MongoDB
systems using the mongo shell.

36
Generate a Key File (page 53) Use key file to allow the components of MongoDB sharded cluster or replica set to
mutually authenticate.
Troubleshoot Kerberos Authentication on Linux (page 54) Steps to troubleshoot Kerberos-based authentication for
MongoDB deployments.
Implement Field Level Redaction (page 56) Describes the process to set up and access document content that can
have different access levels for the same data.

Enable Client Access Control

Overview

Enabling access control on a MongoDB instance restricts access to the instance by requiring that users identify them-
selves when connecting. In this procedure, you enable access control and then create the instance’s first user, which
must be a user administrator. The user administrator grants further access to the instance by creating additional users.

Considerations

If you create the user administrator before enabling access control, MongoDB disables the localhost exception (page 7).
In that case, you must use the “Enable Authentication after Creating the User Administrator (page 39)” procedure to
enable access control.
This procedure uses the localhost exception (page 7) to allow you to create the first user after enabling authentication.
See Localhost Exception (page 7) and Authentication (page 5) for more information.

Procedure

Step 1: Start the MongoDB instance with authentication enabled. Start the mongod or mongos instance with
the authorization or keyFile setting. Use authorization on a standalone instance. Use keyFile on an
instance in a replica set or sharded cluster.
For example, to start a mongod with authentication enabled and a key file stored in
http://docs.mongodb.org/manualprivate/var, first set the following option in the mongod‘s
configuration file:
security:
keyFile: /private/var/key.pem

Then start the mongod and specify the config file. For example:
mongod --config /etc/mongodb/mongodb.conf

After you enable authentication, only the user administrator can connect to the MongoDB instance. The user admin-
istrator must log in and grant further access to the instance by creating additional users.

Step 2: Connect to the MongoDB instance via the localhost exception. Connect to the MongoDB instance from
a client running on the same system. This access is made possible by the localhost exception (page 7).

Step 3: Create the system user administrator. Add the user with the userAdminAnyDatabase (page 83) role,
and only that role.
The following example creates the user siteUserAdmin user on the admin database:

37
use admin
db.createUser(
{
user: "siteUserAdmin",
pwd: "password",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)

After you create the user administrator, the localhost exception (page 7) is no longer available.

Step 4: Create additional users. Login in with the user administrator’s credentials and create additional users. See
Add a User to a Database (page 60).

Next Steps

If you need to disable access control for any reason, restart the process without the authorization or keyFile
setting.

Enable Authentication in a Sharded Cluster

New in version 2.0: Support for authentication with sharded clusters.

Overview

When authentication is enabled on a sharded cluster every client that accesses the cluster must provide credentials.
This includes MongoDB instances that access each other within the cluster.
To enable authentication on a sharded cluster, you must enable authentication individually on each component of the
cluster. This means enabling authentication on each mongos and each mongod, including each config server, and all
members of a shard’s replica set.
Authentication requires an authentication mechanism and, in most cases, a key file. The content of the key file
must be the same on all cluster members.

Procedure

Step 1: Create a key file. Create the key file your deployment will use to authenticate servers to each other.
To generate pseudo-random data to use for a keyfile, issue the following openssl command:
openssl rand -base64 741 > mongodb-keyfile
chmod 600 mongodb-keyfile

You may generate a key file using any method you choose. Always ensure that the password stored in the key file is
both long and contains a high amount of entropy. Using openssl in this manner helps generate such a key.

38
Step 2: Enable authentication on each component in the cluster. On each mongos and mongod in the cluster,
including all config servers and shards, specify the key file using one of the following approaches:

Specify the key file in the configuration file. In the configuration file, set the keyFile option to the key file’s path
and then start the component, as in the following example:
security:
keyFile: /srv/mongodb/keyfile

Specify the key file at runtime. When starting the component, set the --keyFile option, which is an option
for both mongos instances and mongod instances. Set the --keyFile to the key file’s path. The keyFile
setting implies the authorization setting, which means in most cases you do not need to set authorization
explicitly.

Step 3: Add users. While connected to a mongos, add the first administrative user and then add subsequent users.
See Create a User Administrator (page 58).

Related Documents

• Authentication (page 5)
• Security (page 3)
• Authenticate with x.509 Certificate (page 40)

Enable Authentication after Creating the User Administrator

Overview

Enabling authentication on a MongoDB instance restricts access to the instance by requiring that users identify them-
selves when connecting. In this procedure, you will create the instance’s first user, which must be a user administrator
and then enable authentication. Then, you can authenticate as the user administrator to create additional users and
grant additional access to the instance.
This procedures outlines how enable authentication after creating the user administrator. The approach requires a
restart. To enable authentication without restarting, see Enable Client Access Control (page 37).

Considerations

This document outlines a procedure for enabling authentication for MongoDB instance where you create the first
user on an existing MongoDB system that does not require authentication before restarting the instance and requiring
authentication. You can use the localhost exception (page 7) to gain access to a system with no users and authentication
enabled. See Enable Client Access Control (page 37) for the description of that procedure.

Procedure

Step 1: Start the MongoDB instance without authentication. Start the mongod or mongos instance without the
authorization or keyFile setting. For example:

39
mongod --port 27017 --dbpath /data/db1

For details on starting a mongod or mongos, see http://docs.mongodb.org/manualtutorial/manage-mongodb-proc


or http://docs.mongodb.org/manualtutorial/deploy-shard-cluster.

Step 2: Create the system user administrator. Add the user with the userAdminAnyDatabase (page 83) role,
and only that role.
The following example creates the user siteUserAdmin user on the admin database:
use admin
db.createUser(
{
user: "siteUserAdmin",
pwd: "password",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)

Step 3: Re-start the MongoDB instance with authentication enabled. Re-start the mongod or mongos instance
with the authorization or keyFile setting. Use authorization on a standalone instance. Use keyFile
on an instance in a replica set or sharded cluster.
The following example enables authentication on a standalone mongod using the authorization command-line
option:
mongod --auth --config /etc/mongodb/mongodb.conf

Step 4: Create additional users. Login in with the user administrator’s credentials and create additional users. See
Add a User to a Database (page 60).

Next Steps

If you need to disable authentication for any reason, restart the process without the authorization or keyFile
option.

Authenticate with x.509 Certificate

New in version 2.6.


MongoDB supports x.509 certificate authentication for use with a secure SSL connection (page 26). The x.509 authen-
tication allows clients to authenticate to servers with certificates (page 41) instead of with username and password.
The x.509 authentication also allows sharded cluster members and replica set members to use x.509 certificates to
verify their membership to the cluster or the replica set (page 42) instead of using keyfiles (page 5). The membership
authentication is an internal process.

40
Use x.509 for Client Authentication

Client x.509 Certificate The client certificate must have the following properties:
• A single Certificate Authority (CA) must issue the certificates for both the client and the server.
• Client certificates must contain the following fields:
keyUsage = digitalSignature
extendedKeyUsage = clientAuth

Configure MongoDB Server Configure the MongoDB server from the command line, as in the following:
mongod --sslMode requireSSL --sslPEMKeyFile <path to SSL certificate and key PEM file> --sslCAFile <p

You may also specify these options in the configuration file:


sslMode = requireSSL
sslPEMKeyFile = <path to SSL certificate and key PEM file>
sslCAFile = <path to the root CA PEM file>

Include any additional options, SSL or otherwise, that are required for your specific configuration.

Add x.509 Certificate subject as a User To authenticate with a client certificate, you must first add the value of
the subject from the client certificate as a MongoDB user.
1. You can retrieve the subject from the client certificate with the following command:
openssl x509 -in <pathToClient PEM> -inform PEM -subject -nameopt RFC2253

The command returns the subject string as well as certificate:


subject= CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry
-----BEGIN CERTIFICATE-----
# ...
-----END CERTIFICATE-----

2. Add the value of the subject, omitting the spaces, from the certificate as a user.
For example, in the mongo shell, to add the user with both the readWrite role in the test database and the
userAdminAnyDatabase role which is defined only in the admin database:
db.getSiblingDB("$external").runCommand(
{
createUser: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry",
roles: [
{ role: 'readWrite', db: 'test' },
{ role: 'userAdminAnyDatabase', db: 'admin' }
],
writeConcern: { w: "majority" , wtimeout: 5000 }
}
)

In the above example, to add the user with the readWrite role in the test database, the role specification
document specified ’test’ in the db field. To add userAdminAnyDatabase role for the user, the above
example specified ’admin’ in the db field.

Note: Some roles are defined only in the admin database, including: clusterAdmin,

41
readAnyDatabase, readWriteAnyDatabase, dbAdminAnyDatabase, and
userAdminAnyDatabase. To add a user with these roles, specify ’admin’ in the db.

See Add a User to a Database (page 60) for details on adding a user with roles.

Authenticate with a x.509 Certificate To authenticate with a client certificate, you must first add a MongoDB user
that corresponds to the client certificate. See Add x.509 Certificate subject as a User (page 41).
To authenticate, use the db.auth() method in the $external database, specifying "MONGODB-X509" for the
mechanism field, and the user that corresponds to the client certificate (page 41) for the user field.
For example, if using the mongo shell,
1. Connect mongo shell to the mongod set up for SSL:
mongo --ssl --sslPEMKeyFile <path to CA signed client PEM file>

2. To perform the authentication, use the db.auth() method in the $external database. For the mechanism
field, specify "MONGODB-X509", and for the user field, specify the user, or the subject, that corresponds
to the client certificate.
db.getSiblingDB("$external").auth(
{
mechanism: "MONGODB-X509",
user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
}
)

Use x.509 for Replica Set/Sharded Cluster Member Authentication

Member x.509 Certificate The member certificate, used for internal authentication to verify membership to the
sharded cluster or a replica set, must have the following properties:
• A single Certificate Authority (CA) must issue all the x.509 certificates for the members of a sharded cluster or
a replica set.
• The member certificate’s subject, which contains the Distinguished Name (DN), must match the subject
of the certificate on the other servers in the cluster, starting from and including the Organizational Unit (OU) of
the certificate on the server.
• Either the Common Name (CN) or one of the Subject Alternative Name (SAN) entries must match the hostname
of the server, used by the other members of the cluster.
For example, the certificates for a cluster could have the following subjects:
subject= CN=<myhostname1>,OU=Dept1,O=MongoDB,ST=NY,C=US
subject= CN=<myhostname2>,OU=Dept1,O=MongoDB,ST=NY,C=US
subject= CN=<myhostname3>,OU=Dept1,O=MongoDB,ST=NY,C=US

Configure Clusters To specify the x.509 certificate for internal cluster member authentication, append the additional
SSL options --clusterAuthMode and --sslClusterFile, as in the following example for a member of a
replica set:
mongod --replSet <name> --sslMode requireSSL --clusterAuthMode x509 --sslClusterFile <path to members

42
Include any additional options, SSL or otherwise, that are required for your specific configuration. For instance, if
the membership key is encrypted, set the --sslClusterPassword to the passphrase to decrypt the key or have
MongoDB prompt for the passphrase. See SSL Certificate Passphrase (page 28) for details.

Note: You may also specify these options in the configuration file, as in the following example:
sslMode = requireSSL
sslPEMKeyFile = <path to SSL certificate and key PEM file>
sslCAFile = <path to root CA PEM file>
clusterAuthMode = x509
sslClusterFile = <path to membership certificate and key PEM file>

Upgrade from Keyfile Authentication to to x.509 Authentication To upgrade clusters that are currently using
keyfile authentication to x.509 authentication, use a rolling upgrade process.

Clusters Currently Using SSL For clusters using SSL and keyfile authentication, to upgrade to x.509 cluster au-
thentication, use the following rolling upgrade process:
1. For each node of a cluster, start the node with the option --clusterAuthMode set to sendKeyFile and
the option --sslClusterFile set to the appropriate path of the node’s certificate. Include other SSL options
(page 26) as well as any other options that are required for your specific configuration. For example:
mongod --replSet <name> --sslMode requireSSL --clusterAuthMode sendKeyFile --sslClusterFile <pat

With this setting, each node continues to use its keyfile to authenticate itself as a member. However, each
node can now accept either a keyfile or an x.509 certificate from other members to authenticate those members.
Upgrade all nodes of the cluster to this setting.
2. Then, for each node of a cluster, connect to the node and use the setParameter command to update the
clusterAuthMode to sendX509. 33 For example,
db.getSiblingDB('admin').runCommand( { setParameter: 1, clusterAuthMode: "sendX509" } )

With this setting, each node uses its x.509 certificate, specified with the --sslClusterFile option in the
previous step, to authenticate itself as a member. However, each node continues to accept either a keyfile or an
x.509 certificate from other members to authenticate those members. Upgrade all nodes of the cluster to this
setting.
3. Optional but recommended. Finally, for each node of the cluster, connect to the node and use the
setParameter command to update the clusterAuthMode to x509 to only use the x.509 certificate for
authentication. 1 For example:
db.getSiblingDB('admin').runCommand( { setParameter: 1, clusterAuthMode: "x509" } )

4. After the upgrade of all nodes, edit the configuration file with the appropriate x.509 settings to ensure
that upon subsequent restarts, the cluster uses x.509 authentication.
See --clusterAuthMode for the various modes and their descriptions.

Clusters Currently Not Using SSL For clusters using keyfile authentication but not SSL, to upgrade to x.509
authentication, use the following rolling upgrade process:
33 As an alternative to using the setParameter command, you can also restart the nodes with the appropriate SSL and x509 options and

values.

43
1. For each node of a cluster, start the node with the option --sslMode set to allowSSL, the option
--clusterAuthMode set to sendKeyFile and the option --sslClusterFile set to the appropri-
ate path of the node’s certificate. Include other SSL options (page 26) as well as any other options that are
required for your specific configuration. For example:
mongod --replSet <name> --sslMode allowSSL --clusterAuthMode sendKeyFile --sslClusterFile <path

The --sslMode allowSSL setting allows the node to accept both SSL and non-SSL incoming connections.
Its outgoing connections do not use SSL.
The --clusterAuthMode sendKeyFile setting allows each node continues to use its keyfile to authen-
ticate itself as a member. However, each node can now accept either a keyfile or an x.509 certificate from other
members to authenticate those members.
Upgrade all nodes of the cluster to these settings.
2. Then, for each node of a cluster, connect to the node and use the setParameter command to update the
sslMode to preferSSL and the clusterAuthMode to sendX509. 1 For example:
db.getSiblingDB('admin').runCommand( { setParameter: 1, sslMode: "preferSSL", clusterAuthMode: "

With the sslMode set to preferSSL, the node accepts both SSL and non-SSL incoming connections, and its
outgoing connections use SSL.
With the clusterAuthMode set to sendX509, each node uses its x.509 certificate, specified with the
--sslClusterFile option in the previous step, to authenticate itself as a member. However, each node
continues to accept either a keyfile or an x.509 certificate from other members to authenticate those members.
Upgrade all nodes of the cluster to these settings.
3. Optional but recommended. Finally, for each node of the cluster, connect to the node and use the
setParameter command to update the sslMode to requireSSL and the clusterAuthMode to x509.
1
For example:
db.getSiblingDB('admin').runCommand( { setParameter: 1, sslMode: "requireSSL", clusterAuthMode:

With the sslMode set to requireSSL, the node only uses SSL connections.
With the clusterAuthMode set to x509, the node only uses the x.509 certificate for authentication.
4. After the upgrade of all nodes, edit the configuration file with the appropriate SSL and x.509 settings
to ensure that upon subsequent restarts, the cluster uses x.509 authentication.
See --clusterAuthMode for the various modes and their descriptions.

Authenticate Using SASL and LDAP

MongoDB Enterprise provides support for proxy authentication of users. This allows administrators to configure
a MongoDB cluster to authenticate users by proxying authentication requests to a specified Lightweight Directory
Access Protocol (LDAP) service.
MongoDB Enterprise for Windows does not include LDAP support for authentication.
MongoDB does not support LDAP authentication in mixed sharded cluster deployments that contain both version
2.4 and version 2.6 shards. See http://docs.mongodb.org/manualrelease-notes/2.6-upgrade for
upgrade instructions.

44
Considerations

Because the transmission of the username and password from the client to the MongoDB server, from the MongoDB
server to saslauthd, and from saslauthd to the LDAP server uses SASL PLAIN mechanism, i.e. in plain text,
you should, in general, use only on a trusted channel (VPN, SSL, trusted wired network).

Configure saslauthd

LDAP support for user authentication requires proper configuration of the saslauthd daemon process as well as
the MongoDB server.

Step 1: Specify the mechanism. On systems that configure saslauthd with the
/etc/sysconfig/saslauthd file, such as Red Hat Enterprise Linux, Fedora, CentOS, and Amazon
Linux AMI, set the mechanism MECH to ldap:
MECH=ldap

On systems that configure saslauthd with the /etc/default/saslauthd file, set the MECHANISMS option
to ldap:
MECHANISMS="ldap"

Step 2: Adjust caching behavior. On certain Linux distributions, saslauthd starts with the caching of authenti-
cation credentials enabled. Until restarted or until the cache expires, saslauthd will not contact the LDAP server
to re-authenticate users in its authentication cache. This allows saslauthd to successfully authenticate users in its
cache, even in the LDAP server is down or if the cached users’ credentials are revoked.
To set the expiration time (in seconds) for the authentication cache, see the -t option34 of saslauthd.

Step 3: Configure with LDAP Options. If the saslauthd.conf file does not exist, create it. The
saslauthd.conf file usually resides in the /etc folder. If specifying a different file path, see the -O option35
of saslauthd.

Configure for Use with ActiveDirectory To use with ActiveDirectory, start saslauthd with the following con-
figuration options set in the saslauthd.conf file:
ldap_servers: <ldap uri>
ldap_use_sasl: yes
ldap_mech: DIGEST-MD5
ldap_auth_method: fastbind

For the <ldap uri>, specify the uri of the ldap server. For example, ldap_servers:
ldaps://ad.example.net.

Configure for Use with OpenLDAP To connect to an OpenLDAP server, update the saslauthd.conf file with
the following configuration options:
ldap_servers: <ldap uri>
ldap_search_base: <search base>
ldap_filter: <filter>
34 http://www.linuxcommand.org/man_pages/saslauthd8.html
35 http://www.linuxcommand.org/man_pages/saslauthd8.html

45
The ldap_servers specifies the uri of the LDAP server used for authentication. In general, for OpenLDAP installed
on the local machine, you can specify the value ldap://localhost:389 or if using LDAP over SSL, you can
specify the value ldaps://localhost:636.
The ldap_search_base specifies distinguished name to which the search is relative. The search includes the base
or objects below.
The ldap_filter specifies the search filter.
The values for these configuration options should correspond to the values specific for your test. For example, to filter
on email, specify ldap_filter: (mail=%n) instead.

Example A sample saslauthd.conf file for OpenLDAP includes the following content:
ldap_servers: ldaps://ad.example.net
ldap_search_base: ou=Users,dc=example,dc=com
ldap_filter: (uid=%u)

To use this sample OpenLDAP configuration, create users with a uid attribute (login name) and place under the
Users organizational unit (ou) under the domain components (dc) example and com.
For more information on saslauthd configuration, see http://www.openldap.org/doc/admin24/guide.html#Configuringsaslauthd.

Step 4: Test the saslauthd configuration. Use testsaslauthd utility to test the saslauthd configuration.
For example:
testsaslauthd -u testuser -p testpassword -f /var/run/saslauthd/mux

Configure MongoDB

Step 1: Add user to MongoDB for authentication. Add the user to the $external database in MongoDB. To
specify the user’s privileges, assign roles (page 8) to the user.
For example, the following adds a user with read-only access to the records database.
db.getSiblingDB("$external").createUser(
{
user : <username>,
roles: [ { role: "read", db: "records" } ]
}
)

Add additional principals as needed. For more information about creating and managing users, see
http://docs.mongodb.org/manualreference/command/nav-user-management.

Step 2: Configure MongoDB server. To configure the MongoDB server to use the saslauthd instance for proxy
authentication, start the mongod with the following options:
• --auth,
• authenticationMechanisms parameter set to PLAIN, and
• saslauthdPath parameter set to the path to the Unix-domain Socket of the saslauthd instance.
Configure the MongoDB server using either the command line option --setParameter or the configuration
file. Specify additional configurations as appropriate for your configuration.

46
Use specific saslauthd socket path. For socket path of /<some>/<path>/saslauthd, set the
saslauthdPath to /<some>/<path>/saslauthd/mux, as in the following command line example:
mongod --auth --setParameter saslauthdPath=/<some>/<path>/saslauthd/mux --setParameter authentication

Or if using a configuration file, specify the following parameters in the file:


auth=true
setParameter=saslauthdPath=/<some>/<path>/saslauthd/mux
setParameter=authenticationMechanisms=PLAIN

Use default Unix-domain socket path. To use the default Unix-domain socket path, set the saslauthdPath to
the empty string "", as in the following command line example:
mongod --auth --setParameter saslauthdPath="" --setParameter authenticationMechanisms=PLAIN

Or if using a configuration file, specify the following parameters in the file:


auth=true
setParameter=saslauthdPath=/<some>/<path>/saslauthd/mux
setParameter=authenticationMechanisms=PLAIN

Step 3: Authenticate the user in the mongo shell. To perform the authentication in the mongo shell, use the
db.auth() method in the $external database.
Specify the value "PLAIN" in the mechanism field, the user and password in the user and pwd fields respectively,
and the value false in the digestPassword field. You must specify false for digestPassword since the
server must receive an undigested password to forward on to saslauthd, as in the following example:
db.getSiblingDB("$external").auth(
{
mechanism: "PLAIN",
user: <username>,
pwd: <cleartext password>,
digestPassword: false
}
)

The server forwards the password in plain text. In general, use only on a trusted channel (VPN, SSL, trusted wired
network). See Considerations (page 45).

Configure MongoDB with Kerberos Authentication on Linux

New in version 2.4.

Overview

MongoDB Enterprise supports authentication using a Kerberos service (page 14). Kerberos is an industry standard
authentication protocol for large client/server system.

Prerequisites

Setting up and configuring a Kerberos deployment is beyond the scope of this document. This tutorial assumes
you have have configured a Kerberos service principal (page 14) for each mongod and mongos instance in your

47
MongoDB deployment, and you have a valid keytab file (page 15) for for each mongod and mongos instance.

Procedure

The following procedure outlines the steps to add a Kerberos user principal to MongoDB, configure a standalone
mongod instance for Kerberos support, and connect using the mongo shell and authenticate the user principal.

Step 1: Start mongod without Kerberos. For the initial addition of Kerberos users, start mongod without Kerberos
support.
If a Kerberos user is already in MongoDB and has the privileges required to create a user, you can start mongod with
Kerberos support.

Step 2: Connect to mongod. Connect via the mongo shell to the mongod instance. If mongod has --auth
enabled, ensure you connect with the privileges required to create a user.

Step 3: Add Kerberos Principal(s) to MongoDB. Add a Kerberos principal, <username>@<KERBEROS


REALM> or <username>/<instance>@<KERBEROS REALM>, to MongoDB in the $external database.
Specify the Kerberos realm in all uppercase. The $external database allows mongod to consult an external source
(e.g. Kerberos) to authenticate. To specify the user’s privileges, assign roles (page 8) to the user.
The following example adds the Kerberos principal application/[email protected] with read-only
access to the records database:
use $external
db.createUser(
{
user: "application/[email protected]",
roles: [ { role: "read", db: "records" } ]
}
)

Add additional principals as needed. For every user you want to authenticate using Kerberos, you must
create a corresponding user in MongoDB. For more information about creating and managing users, see
http://docs.mongodb.org/manualreference/command/nav-user-management.

Step 4: Start mongod with Kerberos support. To start mongod with Kerberos support, set the environmental
variable KRB5_KTNAME to the path of the keytab file and the mongod parameter authenticationMechanisms
to GSSAPI in the following form:
env KRB5_KTNAME=<path to keytab file> \
mongod \
--setParameter authenticationMechanisms=GSSAPI
<additional mongod options>

For example, the following starts a standalone mongod instance with Kerberos support:
env KRB5_KTNAME=/opt/mongodb/mongod.keytab \
/opt/mongodb/bin/mongod --auth \
--setParameter authenticationMechanisms=GSSAPI \
--dbpath /opt/mongodb/data

48
The path to your mongod as well as your keytab file (page 15) may differ. Modify or include additional mongod
options as required for your configuration. The keytab file (page 15) must be only accessible to the owner of the
mongod process.
With the official .deb or .rpm packages, you can set the KRB5_KTNAME in a environment settings file. See
KRB5_KTNAME (page 49) for details.

Step 5: Connect mongo shell to mongod and authenticate. Connect the mongo shell client as the Kerberos prin-
cipal application/[email protected]. Before connecting, you must have used Kerberos’s kinit
program to get credentials for application/[email protected].
You can connect and authenticate from the command line.
mongo --authenticationMechanism=GSSAPI --authenticationDatabase='$external' \
--username application/[email protected]

Or, alternatively, you can first connect mongo to the mongod, and then from the mongo shell, use the db.auth()
method to authenticate in the $external database.
use $external
db.auth( { mechanism: "GSSAPI", user: "application/[email protected]" } )

Additional Considerations

KRB5_KTNAME If you installed MongoDB Enterprise using one of the official .deb or .rpm packages, and you
use the included init/upstart scripts to control the mongod instance, you can set the KR5_KTNAME variable in the
default environment settings file instead of setting the variable each time.
For .rpm packages, the default environment settings file is /etc/sysconfig/mongod.
For .deb packages, the file is /etc/default/mongodb.
Set the KRB5_KTNAME value in a line that resembles the following:
export KRB5_KTNAME="<path to keytab>"

Configure mongos for Kerberos To start mongos with Kerberos support, set the environmental variable
KRB5_KTNAME to the path of its keytab file (page 15) and the mongos parameter authenticationMechanisms
to GSSAPI in the following form:
env KRB5_KTNAME=<path to keytab file> \
mongos \
--setParameter authenticationMechanisms=GSSAPI \
<additional mongos options>

For example, the following starts a mongos instance with Kerberos support:
env KRB5_KTNAME=/opt/mongodb/mongos.keytab \
mongos \
--setParameter authenticationMechanisms=GSSAPI \
--configdb shard0.example.net, shard1.example.net,shard2.example.net \
--keyFile /opt/mongodb/mongos.keyfile

The path to your mongos as well as your keytab file (page 15) may differ. The keytab file (page 15) must be only
accessible to the owner of the mongos process.

49
Modify or include any additional mongos options as required for your configuration. For example, instead of using
--keyFile for for internal authentication of sharded cluster members, you can use x.509 member authentication
(page 42) instead.

Use a Config File To configure mongod or mongos for Kerberos support using a configuration file,
specify the authenticationMechanisms setting in the configuration file:
setParameter=authenticationMechanisms=GSSAPI

Modify or include any additional mongod options as required for your configuration.
For example, if http://docs.mongodb.org/manualopt/mongodb/mongod.conf contains the follow-
ing configuration settings for a standalone mongod:
auth = true
setParameter=authenticationMechanisms=GSSAPI
dbpath=/opt/mongodb/data

To start mongod with Kerberos support, use the following form:


env KRB5_KTNAME=/opt/mongodb/mongod.keytab \
/opt/mongodb/bin/mongod --config /opt/mongodb/mongod.conf

The path to your mongod, keytab file (page 15), and configuration file may differ. The keytab file (page 15) must be
only accessible to the owner of the mongod process.

Troubleshoot Kerberos Setup for MongoDB If you encounter problems when starting mongod or mongos with
Kerberos authentication, see Troubleshoot Kerberos Authentication on Linux (page 54).

Incorporate Additional Authentication Mechanisms Kerberos authentication (GSSAPI) can work alongside
MongoDB’s challenge/response authentication mechanism (MONGODB-CR), MongoDB’s authentication mechanism
for LDAP (PLAIN), and MongoDB’s authentication mechanism for x.509 (MONGODB-X509). Specify the mecha-
nisms, as follows:
--setParameter authenticationMechanisms=GSSAPI,MONGODB-CR

Only add the other mechanisms if in use. This parameter setting does not affect MongoDB’s internal authentication of
cluster members.

Configure MongoDB with Kerberos Authentication on Windows

New in version 2.6.

Overview

MongoDB Enterprise supports authentication using a Kerberos service (page 14). Kerberos is an industry standard
authentication protocol for large client/server system. Kerberos allows MongoDB and applications to take advantage
of existing authentication infrastructure and processes.

Prerequisites

Setting up and configuring a Kerberos deployment is beyond the scope of this document. This tutorial assumes have
configured a Kerberos service principal (page 14) for each mongod.exe and mongos.exe instance.

50
Procedures

Step 1: Start mongod.exe without Kerberos. For the initial addition of Kerberos users, start mongod.exe
without Kerberos support.
If a Kerberos user is already in MongoDB and has the privileges required to create a user, you can start mongod.exe
with Kerberos support.

Step 2: Connect to mongod. Connect via the mongo.exe shell to the mongod.exe instance. If mongod.exe
has --auth enabled, ensure you connect with the privileges required to create a user.

Step 3: Add Kerberos Principal(s) to MongoDB. Add a Kerberos principal, <username>@<KERBEROS


REALM>, to MongoDB in the $external database. Specify the Kerberos realm in all uppercase. The $external
database allows mongod.exe to consult an external source (e.g. Kerberos) to authenticate. To specify the user’s
privileges, assign roles (page 8) to the user.
The following example adds the Kerberos principal [email protected] with read-only access to the
records database:
use $external
db.createUser(
{
user: "[email protected]",
roles: [ { role: "read", db: "records" } ]
}
)

Add additional principals as needed. For every user you want to authenticate using Kerberos, you must
create a corresponding user in MongoDB. For more information about creating and managing users, see
http://docs.mongodb.org/manualreference/command/nav-user-management.

Step 4: Start mongod.exe with Kerberos support. You must start mongod.exe as the service principal ac-
count (page 52).
To start mongod.exe with Kerberos support, set the mongod.exe parameter authenticationMechanisms
to GSSAPI:
mongod.exe --setParameter authenticationMechanisms=GSSAPI <additional mongod.exe options>

For example, the following starts a standalone mongod.exe instance with Kerberos support:
mongod.exe --auth --setParameter authenticationMechanisms=GSSAPI

Modify or include additional mongod.exe options as required for your configuration.

Step 5: Connect mongo.exe shell to mongod.exe and authenticate. Connect the mongo.exe shell client as
the Kerberos principal [email protected].
You can connect and authenticate from the command line.
mongo.exe --authenticationMechanism=GSSAPI --authenticationDatabase='$external' \
--username [email protected]

Or, alternatively, you can first connect mongo.exe to the mongod.exe, and then from the mongo.exe shell, use
the db.auth() method to authenticate in the $external database.

51
use $external
db.auth( { mechanism: "GSSAPI", user: "[email protected]" } )

Additional Considerations

Configure mongos.exe for Kerberos To start mongos.exe with Kerberos support, set the mongos.exe pa-
rameter authenticationMechanisms to GSSAPI. You must start mongos.exe as the service principal ac-
count (page 52).:
mongos.exe --setParameter authenticationMechanisms=GSSAPI <additional mongos options>

For example, the following starts a mongos instance with Kerberos support:
mongos.exe --setParameter authenticationMechanisms=GSSAPI --configdb shard0.example.net, shard1.examp

Modify or include any additional mongos.exe options as required for your configuration. For example, instead of
using --keyFile for for internal authentication of sharded cluster members, you can use x.509 member authentica-
tion (page 42) instead.

Assign Service Principal Name to MongoDB Windows Service Use setspn.exe to assign the service principal
name (SPN) to the account running the mongod.exe and the mongos.exe service:
setspn.exe -A <service>/<fully qualified domain name> <service account name>

For example, if mongod.exe runs as a service named mongodb on testserver.mongodb.com with the ser-
vice account name mongodtest, assign the SPN as follows:
setspn.exe -A mongodb/testserver.mongodb.com mongodtest

Incorporate Additional Authentication Mechanisms Kerberos authentication (GSSAPI) can work alongside
MongoDB’s challenge/response authentication mechanism (MONGODB-CR), MongoDB’s authentication mechanism
for LDAP (PLAIN), and MongoDB’s authentication mechanism for x.509 (MONGODB-X509). Specify the mecha-
nisms, as follows:
--setParameter authenticationMechanisms=GSSAPI,MONGODB-CR

Only add the other mechanisms if in use. This parameter setting does not affect MongoDB’s internal authentication of
cluster members.

Authenticate to a MongoDB Instance or Cluster

Overview

To authenticate to a running mongod or mongos instance, you must have user credentials for a resource on that
instance. When you authenticate to MongoDB, you authenticate either to a database or to a cluster. Your user privileges
determine the resource you can authenticate to.
You authenticate to a resource either by:
• using the authentication options when connecting to the mongod or mongos instance, or
• connecting first and then authenticating to the resource with the authenticate command or the db.auth()
method.

52
This section describes both approaches.
In general, always use a trusted channel (VPN, SSL, trusted wired network) for connecting to a MongoDB instance.

Prerequisites

You must have user credentials on the database or cluster to which you are authenticating.

Procedures

Authenticate When First Connecting to MongoDB

Step 1: Specify your credentials when starting the mongo instance. When using mongo to connect to a mongod
or mongos, enter your username, password, and authenticationDatabase. For example:
mongo --username "prodManager" --password "cleartextPassword" --authenticationDatabase "products"

Step 2: Close the session when your work is complete. To close an authenticated session, use the logout com-
mand.:
db.runCommand( { logout: 1 } )

Authenticate After Connecting to MongoDB

Step 1: Connect to a MongoDB instance. Connect to a mongod or mongos instance.

Step 2: Switch to the database to which to authenticate.


use <database>

Step 3: Authenticate. Use either the authenticate command or the db.auth() method to provide your
username and password to the database. For example:
db.auth( "prodManager", "cleartextPassword" )

Step 4: Close the session when your work is complete. To close an authenticated session, use the logout com-
mand.:
db.runCommand( { logout: 1 } )

Generate a Key File

Overview

This section describes how to generate a key file to store authentication information. After generating a key file,
specify the key file using the keyFile option when starting a mongod or mongos instance.

53
A key’s length must be between 6 and 1024 characters and may only contain characters in the base64 set. The key
file must not have group or world permissions on UNIX systems. Key file permissions are not checked on Windows
systems.
MongoDB strips whitespace characters (e.g. x0d, x09, and x20) for cross-platform convenience. As a result, the
following operations produce identical keys:
echo -e "my secret key" > key1
echo -e "my secret key\n" > key2
echo -e "my secret key" > key3
echo -e "my\r\nsecret\r\nkey\r\n" > key4

Procedure

Step 1: Create a key file. Create the key file your deployment will use to authenticate servers to each other.
To generate pseudo-random data to use for a keyfile, issue the following openssl command:
openssl rand -base64 741 > mongodb-keyfile
chmod 600 mongodb-keyfile

You may generate a key file using any method you choose. Always ensure that the password stored in the key file is
both long and contains a high amount of entropy. Using openssl in this manner helps generate such a key.

Step 2: Specify the key file when starting a MongoDB instance. Specify the path to the key file with the keyFile
option.

Troubleshoot Kerberos Authentication on Linux

New in version 2.4.

Kerberos Configuration Checklist

If you have difficulty starting mongod or mongos with Kerberos (page 14) on Linux systems, ensure that:
• The mongod and the mongos binaries are from MongoDB Enterprise.
• You are not using the HTTP Console36 . MongoDB Enterprise does not support Kerberos authentication over the
HTTP Console interface.
• Either the service principal name (SPN) in the keytab file (page 15) matches the SPN for the mongod or mongos
instance, or the mongod or the mongos instance use the --setParameter saslHostName=<host
name> to match the name in the keytab file.
• The canonical system hostname of the system that runs the mongod or mongos instance is a resolvable, fully
qualified domain for this host. You can test the system hostname resolution with the hostname -f command
at the system prompt.
• Each host that runs a mongod or mongos instance has both the A and PTR DNS records to provide forward
and reverse lookup. The records allow the host to resolve the components of the Kerberos infrastructure.
• Both the Kerberos Key Distribution Center (KDC) and the system running mongod instance or mongos must
be able to resolve each other using DNS. By default, Kerberos attempts to resolve hosts using the content of the
/etc/kerb5.conf before using DNS to resolve hosts.
36 http://docs.mongodb.org/ecosystem/tools/http-interface/#http-console

54
• The time synchronization of the systems running mongod or the mongos instances and the Kerberos infras-
tructure are within the maximum time skew (default is 5 minutes) of each other. Time differences greater than
the maximum time skew will prevent successful authentication.

Debug with More Verbose Logs

If you still encounter problems with Kerberos on Linux, you can start both mongod and mongo (or another client)
with the environment variable KRB5_TRACE set to different files to produce more verbose logging of the Kerberos
process to help further troubleshooting. For example, the following starts a standalone mongod with KRB5_TRACE
set:
env KRB5_KTNAME=/opt/mongodb/mongod.keytab \
KRB5_TRACE=/opt/mongodb/log/mongodb-kerberos.log \
/opt/mongodb/bin/mongod --dbpath /opt/mongodb/data \
--fork --logpath /opt/mongodb/log/mongod.log \
--auth --setParameter authenticationMechanisms=GSSAPI

Common Error Messages

In some situations, MongoDB will return error messages from the GSSAPI interface if there is a problem with the
Kerberos service. Some common error messages are:
GSSAPI error in client while negotiating security context. This error occurs on the
client and reflects insufficient credentials or a malicious attempt to authenticate.
If you receive this error, ensure that you are using the correct credentials and the correct fully qualified domain
name when connecting to the host.
GSSAPI error acquiring credentials. This error occurs during the start of the mongod or mongos
and reflects improper configuration of the system hostname or a missing or incorrectly configured keytab file.
If you encounter this problem, consider the items in the Kerberos Configuration Checklist (page 54), in particu-
lar, whether the SPN in the keytab file (page 15) matches the SPN for the mongod or mongos instance.
To determine whether the SPNs match:
1. Examine the keytab file, with the following command:
klist -k <keytab>

Replace <keytab> with the path to your keytab file.


2. Check the configured hostname for your system, with the following command:
hostname -f

Ensure that this name matches the name in the keytab file, or start mongod or mongos with the
--setParameter saslHostName=<hostname>.
See also:
• Kerberos Authentication (page 14)
• Configure MongoDB with Kerberos Authentication on Linux (page 47)
• Configure MongoDB with Kerberos Authentication on Windows (page 50)

55
Implement Field Level Redaction

The $redact pipeline operator restricts the contents of the documents based on information stored in the documents
themselves.

Figure 1: Diagram of security architecture with middleware and redaction.

To store the access criteria data, add a field to the documents and subdocuments. To allow for multiple combinations
of access levels for the same data, consider setting the access field to an array of arrays. Each array element contains
a required set that allows a user with that set to access the data.
Then, include the $redact stage in the db.collection.aggregate() operation to restrict contents of the
result set based on the access required to view the data.
For more information on the $redact pipeline operator, including its syntax and associated system variables as well
as additional examples, see $redact.

Procedure

For example, a forecasts collection contains documents of the following form where the tags field determines
the access levels required to view the data:
{
_id: 1,
title: "123 Department Report",
tags: [ [ "G" ], [ "FDW" ] ],
year: 2014,
subsections: [

56
{
subtitle: "Section 1: Overview",
tags: [ [ "SI", "G" ], [ "FDW" ] ],
content: "Section 1: This is the content of section 1."
},
{
subtitle: "Section 2: Analysis",
tags: [ [ "STLW" ] ],
content: "Section 2: This is the content of section 2."
},
{
subtitle: "Section 3: Budgeting",
tags: [ [ "TK" ], [ "FDW", "TGE" ] ],
content: {
text: "Section 3: This is the content of section3.",
tags: [ [ "HCS"], [ "FDW", "TGE", "BX" ] ]
}
}
]
}

For each document, the tags field contains various access groupings necessary to view the data. For example, the
value [ [ "G" ], [ "FDW", "TGE" ] ] can specify that a user requires either access level ["G"] or both [
"FDW", "TGE" ] to view the data.
Consider a user who only has access to view information tagged with either "FDW" or "TGE". To run a query on all
documents with year 2014 for this user, include a $redact stage as in the following:
var userAccess = [ "FDW", "TGE" ];
db.forecasts.aggregate(
[
{ $match: { year: 2014 } },
{ $redact:
{
$cond: {
if: { $anyElementTrue:
{
$map: {
input: "$tags" ,
as: "fieldTag",
in: { $setIsSubset: [ "$$fieldTag", userAccess ] }
}
}
},
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
)

The aggregation operation returns the following “redacted” document for the user:
{ "_id" : 1,
"title" : "123 Department Report",
"tags" : [ [ "G" ], [ "FDW" ] ],
"year" : 2014,
"subsections" :

57
[
{
"subtitle" : "Section 1: Overview",
"tags" : [ [ "SI", "G" ], [ "FDW" ] ],
"content" : "Section 1: This is the content of section 1."
},
{
"subtitle" : "Section 3: Budgeting",
"tags" : [ [ "TK" ], [ "FDW", "TGE" ] ]
}
]
}

See also:
$map, $setIsSubset, $anyElementTrue

3.5 User and Role Management Tutorials

The following tutorials provide instructions on how to enable authentication and limit access for users with privilege
roles.
Create a User Administrator (page 58) Create users with special permissions to to create, modify, and remove other
users, as well as administer authentication credentials (e.g. passwords).
Add a User to a Database (page 60) Create non-administrator users using MongoDB’s role-based authentication sys-
tem.
Create an Administrative User with Unrestricted Access (page 62) Create a user with unrestricted access. Create
such a user only in unique situations. In general, all users in the system should have no more access than needed
to perform their required operations.
Create a Role (page 63) Create custom role.
Assign a User a Role (page 64) Assign a user a role. A role grants the user a defined set of privileges. A user can
have multiple roles.
Verify User Privileges (page 66) View a user’s current privileges.
Modify a User’s Access (page 67) Modify the actions available to a user on specific database resources.
View Roles (page 69) View a role’s privileges.
Change a User’s Password (page 70) Only user administrators can edit credentials. This tutorial describes the pro-
cess for editing an existing user’s password.
Change Your Password and Custom Data (page 71) Users with sufficient access can change their own passwords
and modify the optional custom data associated with their user credential.

Create a User Administrator

Overview

User administrators create users and create and assigns roles. A user administrator can grant any privilege in the
database and can create new ones. In a MongoDB deployment, create the user administrator as the first user. Then let
this user create all other users.

58
To provide user administrators, MongoDB has userAdmin (page 79) and userAdminAnyDatabase (page 83)
roles, which grant access to actions (page 90) that support user and role management. Following the policy of least
privilege userAdmin (page 79) and userAdminAnyDatabase (page 83) confer no additional privileges.
Carefully control access to these roles. A user with either of these roles can grant itself unlimited additional privileges.
Specifically, a user with the userAdmin (page 79) role can grant itself any privilege in the database. A user assigned
either the userAdmin (page 79) role on the admin database or the userAdminAnyDatabase (page 83) can
grant itself any privilege in the system.

Prerequisites

You must have the createUser (page 91) action (page 90) on a database to create a new user on that database.
You must have the grantRole (page 91) action (page 90) on a role’s database to grant the role to another user.
If you have the userAdmin (page 79) or userAdminAnyDatabase (page 83) role, or if you are authenticated
using the localhost exception (page 7), you have those actions.

Procedure

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos as a user
with the privileges required in the Prerequisites (page 59) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Create the system user administrator. Add the user with the userAdminAnyDatabase (page 83) role,
and only that role.
The following example creates the user siteUserAdmin user on the admin database:
use admin
db.createUser(
{
user: "siteUserAdmin",
pwd: "password",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}

59
]
}
)

Step 4: Create a user administrator for a single database. Optionally, you may want to create user administrators
that only have access to administer users in a specific database by way of the userAdmin (page 79) role.
The following example creates the user recordsUserAdmin on the records database:
use products
db.createUser(
{
user: "recordsUserAdmin",
pwd: "password",
roles:
[
{
role: "userAdmin",
db: "records"
}
]
}
)

Related Documents

• Authentication (page 5)
• Security Introduction (page 4)
• Enable Client Access Control (page 37)
• Access Control Tutorials (page 36)

Add a User to a Database

Changed in version 2.6.

Overview

Each application and user of a MongoDB system should map to a distinct application or administrator. This access
isolation facilitates access revocation and ongoing user maintenance. At the same time users should have only the
minimal set of privileges required to ensure a system of least privilege.
To create a user, you must define the user’s credentials and assign that user roles (page 8). Credentials verify the user’s
identity to a database, and roles determine the user’s access to database resources and operations.
For an overview of credentials and roles in MongoDB see Security Introduction (page 4).

Considerations

For users that authenticate using external mechanisms, 37 you do not need to provide credentials when creating users.
37
Configure MongoDB with Kerberos Authentication on Linux (page 47), Authenticate Using SASL and LDAP (page 44), and x.509 certificates
provide external authentication mechanisms.

60
For all users, select the roles that have the exact required privileges (page 9). If the correct roles do not exist, create
roles (page 63).
You can create a user without assigning roles, choosing instead to assign the roles later. To do so, create the user with
an empty roles (page 87) array.
When adding a user to multiple databases, use unique username-and-password combinations for each database, see
Password Hashing Insecurity (page 100) for more information.

Prerequisites

To create a user on a system that uses authentication (page 5), you must authenticate as a user administrator. If you
have not yet created a user administrator, do so as described in Create a User Administrator (page 58).
You must have the createUser (page 91) action (page 90) on a database to create a new user on that database.
You must have the grantRole (page 91) action (page 90) on a role’s database to grant the role to another user.
If you have the userAdmin (page 79) or userAdminAnyDatabase (page 83) role, or if you are authenticated
using the localhost exception (page 7), you have those actions.

Procedures

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos with the
privileges required in the Prerequisites (page 61) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Create the new user. Create the user in the database to which the user will belong. Pass a well formed user
document to the db.createUser() method.
The following operation creates a user with the specified name, password, and roles:
db.createUser(
{
user: "reportsUser",
pwd: "12345678",
roles: [ "reportingRole", "readWriteAnyDatabase" ]
}
)

61
Create an Administrative User with Unrestricted Access

Overview

Most users should have only the minimal set of privileges required for their operations, in keeping with the policy of
least privilege. However, some authorization architectures may require a user with unrestricted access. To support
these super users, you can create users with access to all database resources (page 88) and actions (page 90).
For many deployments, you may be able to avoid having any users with unrestricted access by having an administrative
user that with the createUser (page 91) and grantRole (page 91) actions as needed to support operations.
If users truly need unrestricted access to a MongoDB deployment, MongoDB provides a built-in role (page 77) named
root (page 84) that grants the combined privileges of all built-in roles. This document describes how to create an
administrative user with the root (page 84) role.
For descriptions of the access each built-in role provides, see the section on built-in roles (page 77).

Prerequisites

You must have the createUser (page 91) action (page 90) on a database to create a new user on that database.
You must have the grantRole (page 91) action (page 90) on a role’s database to grant the role to another user.
If you have the userAdmin (page 79) or userAdminAnyDatabase (page 83) role, or if you are authenticated
using the localhost exception (page 7), you have those actions.

Procedure

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos as a user
with the privileges required in the Prerequisites (page 62) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Create the administrative user. In the admin database, create a new user using the db.createUser()
method. Give the user the built-in root (page 84) role.
For example:

62
use admin
db.createUser(
{
user: "superuser",
pwd: "12345678",
roles: [ "root" ]
}
)

Authenticate against the admin database to test the new user account. Use db.auth() while using the admin
database or use the mongo shell with the --authenticationDatabase option.

Create a Role

Overview

Roles grant users access to MongoDB resources. By default, MongoDB provides a number of built-in roles (page 77)
that administrators may use to control access to a MongoDB system. However, if these roles cannot describe the
desired privilege set of a particular user type in a deployment, you can define a new, customized role.
A role’s privileges apply to the database where the role is created. The role can inherit privileges from other roles in
its database. A role created on the admin database can include privileges that apply to all databases or to the cluster
(page 89) and can inherit privileges from roles in other databases.
The combination of the database name and the role name uniquely defines a role in MongoDB.

Prerequisites

You must have the createRole (page 91) action (page 90) on a database to create a role on that database.
You must have the grantRole (page 91) action (page 90) on the database that a privilege targets in order to grant
that privilege to a role. If the privilege targets multiple databases or the cluster resource , you must have the
grantRole (page 91) action on the admin database.
You must have the grantRole (page 91) action (page 90) on a role’s database to grant the role to another role.
To view a role’s information, you must be explicitly granted the role or must have the viewRole (page 91) action
(page 90) on the role’s database.

Procedure

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos with the
privileges required in the Prerequisites (page 63) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:

63
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Define the privileges to grant to the role. Decide which resources (page 88) to grant access to and which
actions (page 90) to grant on each resource.
When creating the role, you will enter the resource-action pairings as documents in the privileges array, as in the
following example:
{ db: "products", collection: "electronics" }

Step 4: Check whether an existing role provides the privileges. If an existing role contains the exact set of
privileges (page 9), the new role can inherit (page 9) those privileges.
To view the privileges provided by existing roles, use the rolesInfo command, as in the following:
db.runCommand( { rolesInfo: 1, showPrivileges: 1 } )

Step 5: Create the role. To create the role, use the createRole command. Specify privileges in the
privileges array and inherited roles in the roles array.
The following example creates the myClusterwideAdmin role in the admin database:
use admin
db.createRole(
{
role: "myClusterwideAdmin",
privileges:
[
{ resource: { cluster: true }, actions: [ "addShard" ] },
{ resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert" ] },
{ resource: { db: "users", collection: "usersCollection" }, actions: [ "update" ] },
{ resource: { db: "", collection: "" }, actions: [ "find" ] }
],
roles:
[
{ role: "read", db: "admin" }
],
writeConcern: { w: "majority" , wtimeout: 5000 }
}
)

The operation defines myClusterwideAdmin role’s privileges in the privileges array. In the roles array,
myClusterwideAdmin inherits privileges from the admin database’s read role.

Assign a User a Role

Changed in version 2.6.

64
Overview

A role provides a user privileges to perform a set of actions (page 90) on a resource (page 88). A user can have
multiple roles.
In MongoDB systems with authorization enforced, you must grant a user a role for the user to access a database
resource. To assign a role, first determine the privileges the user needs and then determine the role that grants those
privileges.
For an overview of roles and privileges, see Authorization (page 8). For descriptions of the access each built-in role
provides, see the section on built-in roles (page 77).

Prerequisites

You must have the grantRole (page 91) action (page 90) on a database to grant a role on that database.
To view a role’s information, you must be explicitly granted the role or must have the viewRole (page 91) action
(page 90) on the role’s database.

Procedure

Step 1: Connect with the privilege to grant roles. Connect to the mongod or mongos either through the localhost
exception (page 7) or as a user with the privileges required in the Prerequisites (page 65) section.
The following example operation connects to the MongoDB instance as a user named roleManager:
mongo --port 27017 -u roleManager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Identify the user’s roles and privileges. To display the roles and privileges of the user to be modified, use
the db.getUser() and db.getRole() methods, as described in Verify User Privileges (page 66).
To display the privileges granted by siteRole01 on the current database, issue:
db.getRole( "siteRole01", { showPrivileges: true } )

Step 4: Identify the privileges to grant or revoke. Determine which role contains the privileges and only those
privileges. If such a role does not exist, then to grant the privileges will require creating a new role (page 63) with the
specific set of privileges. To revoke a subset of privileges provided by an existing role: revoke the original role, create
a new role (page 63) that contains the privileges to keep, and then grant that role to the user.

65
Step 5: Grant a role to a user. Grant the user the role using the db.grantRolesToUser() method.
For example:
use admin
db.grantRolesToUser(
"accountAdmin01",
[
{
role: "readWrite", db: "products"
},
{
role: "readAnyDatabase", db:"admin"
}
]
)

Verify User Privileges

Overview

A user’s privileges determine the access the user has to MongoDB resources (page 88) and the actions (page 90) that
user can perform. Users receive privileges through role assignments. A user can have multiple roles, and each role can
have multiple privileges.
For an overview of roles and privileges, see Authorization (page 8).

Prerequisites

To view a role’s information, you must be explicitly granted the role or must have the viewRole (page 91) action
(page 90) on the role’s database.

Procedure

Step 1: Identify the user’s roles. Use the usersInfo command or db.getUser() method to display user
information. The roles (page 87) array specifies the user’s roles.
For example, to view roles for accountUser01 on the accounts database, issue the following:
use accounts
db.getUser("accountUser01")

The roles (page 87) array displays all roles for accountUser01:
"roles" : [
{
"role" : "readWrite",
"db" : "accounts"
},
{
"role" : "siteRole01",
"db" : "records"
}
]

66
Step 2: Identify the privileges granted by the roles. For a given role, use the rolesInfo command or
db.getRole() method, and include the showPrivileges parameter. The resulting role document displays
both privileges granted directly and roles from which this role inherits privileges.
For example, to view the privileges granted by siteRole01 on the records database, use the following operation,
which returns a document with a privileges (page 85) array:
use records
db.getRole( "siteRole01", { showPrivileges: true } )

The returned document includes the roles (page 85) and privileges (page 85) arrays:
"roles" : [
{
"role" : "read",
"db" : "corporate"
}
],
"privileges" : [
{
"resource" : {
"db" : "records",
"collection" : ""
},
"actions" : [
"find",
"insert",
"update"
]
}
]

To view the privileges granted by the read (page 77) role, use db.getRole() again with the appropriate parame-
ters.

Modify a User’s Access

Overview

When a user’s responsibilities change, modify the user’s access to include only those roles the user requires. This
follows the policy of least privilege.
To change a user’s access, first determine the privileges the user needs and then determine the roles that grants those
privileges. Grant and revoke roles using the method:db.grantRolesToUser() and db.revokeRolesFromUser
methods.
For an overview of roles and privileges, see Authorization (page 8). For descriptions of the access each built-in role
provides, see the section on built-in roles (page 77).

Prerequisites

You must have the grantRole (page 91) action (page 90) on a database to grant a role on that database.
You must have the revokeRole (page 91) action (page 90) on a database to revoke a role on that database.
To view a role’s information, you must be explicitly granted the role or must have the viewRole (page 91) action
(page 90) on the role’s database.

67
Procedure

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos either through
the localhost exception (page 7) or as a user with the privileges required in the Prerequisites (page 67) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Identify the user’s roles and privileges. To display the roles and privileges of the user to be modified, use
the db.getUser() and db.getRole() methods, as described in Verify User Privileges (page 66).
To display the privileges granted by siteRole01 on the current database, issue:
db.getRole( "siteRole01", { showPrivileges: true } )

Step 4: Identify the privileges to grant or revoke. Determine which role contains the privileges and only those
privileges. If such a role does not exist, then to grant the privileges will require creating a new role (page 63) with the
specific set of privileges. To revoke a subset of privileges provided by an existing role: revoke the original role, create
a new role (page 63) that contains the privileges to keep, and then grant that role to the user.

Step 5: Modify the user’s access.

Revoke a Role Revoke a role with the db.revokeRolesFromUser() method. Access revocations apply as
soon as the user tries to run a command. On a mongos revocations are instant on the mongos on which the command
ran, but there is up to a 10-delay before the user cache is updated on the other mongos instances in the cluster.
The following example operation removes the readWrite (page 77) role on the accounts database from the
accountUser01 user’s existing roles:
use accounts
db.revokeRolesFromUser(
"accountUser01",
[
{ role: "readWrite", db: "accounts" }
]
)

68
Grant a Role Grant a role using the db.grantRolesToUser() method. For example, the following operation
grants the accountUser01 user the read (page 77) role on the records database:
use accounts
db.grantRolesToUser(
"accountUser01",
[
{ role: "read", db: "records" }
]
)

View Roles

Overview

A role (page 8) grants privileges to the users who are assigned the role. Each role is scoped to a particular database,
but MongoDB stores all role information in the admin.system.roles collection in the admin database.

Prerequisites

To view a role’s information, you must be explicitly granted the role or must have the viewRole (page 91) action
(page 90) on the role’s database.

Procedures

The following procedures use the rolesInfo command. You also can use the methods db.getRole() (singular)
and db.getRoles().

View a Role in the Current Database If the role is in the current database, you can refer to the role by name, as for
the role dataEntry on the current database:
db.runCommand({ rolesInfo: "dataEntry" })

View a Role in a Different Database If the role is in a different database, specify the role as a document. Use the
following form:
{ role: "<role name>", db: "<role db>" }

To view the custom appWriter role in the orders database, issue the following command from the mongo shell:
db.runCommand({ rolesInfo: { role: "appWriter", db: "orders" } })

View Multiple Roles To view information for multiple roles, specify each role as a document or string in an array.
To view the custom appWriter and clientWriter roles in the orders database, as well as the dataEntry
role on the current database, use the following command from the mongo shell:
db.runCommand( { rolesInfo: [ { role: "appWriter", db: "orders" },
{ role: "clientWriter", db: "orders" },
"dataEntry" ]
} )

69
View All Custom Roles To view the all custom roles, query admin.system.roles (page 84) collection directly, for
example:
db = db.getSiblingDB('admin')
db.system.roles.find()

Change a User’s Password

Changed in version 2.6.

Overview

Strong passwords help prevent unauthorized access, and all users should have strong passwords. You can use the
openssl program to generate unique strings for use in passwords, as in the following command:
openssl rand -base64 48

Prerequisites

You must have the changeAnyPassword action (page 90) on a database to modify the password of any user on
that database.
You must have the changeOwnPassword (page 90) action (page 90) on your database to change your own pass-
word.

Procedure

Step 1: Connect to MongoDB with the appropriate privileges. Connect to the mongod or mongos with the
privileges required in the Prerequisites (page 70) section.
The following example operation connects to MongoDB as an authenticated user named manager:
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. Use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

Step 3: Change the password. Pass the user’s username and the new password to the
db.changeUserPassword() method.
The following operation changes the reporting user’s password to SOh3TbYhxuLiW8ypJPxmt1oOfL:

70
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

Change Your Password and Custom Data

Changed in version 2.6.

Overview

Users with appropriate privileges can change their own passwords and custom data. Custom data (page 88) stores
optional user information.

Considerations

To generate a strong password for use in this procedure, you can use the openssl utility’s rand command. For
example, issue openssl rand with the following options to create a base64-encoded string of 48 pseudo-random
bytes:
openssl rand -base64 48

Prerequisites

To modify your own password or custom data, you must have the changeOwnPassword (page 90) and
changeOwnCustomData (page 90) actions (page 90) respectively on the cluster resource.

Procedure

Step 1: Connect with the appropriate privileges. Connect to the mongod or mongos with your username and
current password.
For example, the following operation connects to MongoDB as an authenticated user named manager.
mongo --port 27017 -u manager -p 12345678 --authenticationDatabase admin

Step 2: Verify your privileges. To check that you have the privileges specified in the Prerequisites (page 71) section,
use the usersInfo command with the showPrivileges option.
The following example operation checks privileges for a user connected as manager:
db.runCommand(
{
usersInfo:"manager",
showPrivileges:true
}
)

The resulting users document displays the privileges granted to manager.

71
Step 2: View your custom data. Connect to the mongod or mongos with your username and current password.
For example, the following operation returns information for the manager user:
db.runCommand( { usersInfo: "manager" } )

Step 3: Change your password and custom data. Pass your username, new password, and new custom data to the
updateUser command.
For example, the following operation changes a user’s password to KNlZmiaNUp0B and custom data to { title:
"Senior Manager" }:
db.runCommand(
{ updateUser: "manager",
pwd: "KNlZmiaNUp0B",
customData: { title: "Senior Manager" }
}
)

3.6 Configure System Events Auditing

New in version 2.6.


MongoDB Enterprise supports auditing (page 13) of various operations. A complete auditing solution must involve
all mongod server and mongos router processes.
The audit facility can write audit events to the console, the syslog (option is unavailable on Windows), a JSON file,
or a BSON file. For details on the audited operations and the audit log messages, see System Event Audit Messages
(page 95).

Enable and Configure Audit Output

Use the --auditDestination option to enable auditing and specify where to output the audit events.

Output to Syslog

To enable auditing and print audit events to the syslog (option is unavailable on Windows) in JSON format, specify
syslog for the --auditDestination setting. For example:
mongod --dbpath data/db --auditDestination syslog

Warning: The syslog message limit can result in the truncation of the audit messages. The auditing system will
neither detect the truncation nor error upon its occurrence.

You may also specify these options in the configuration file:


dbpath=data/db
auditDestination=syslog

Output to Console

To enable auditing and print the audit events to standard output (i.e. stdout), specify console for the
--auditDestination setting. For example:

72
mongod --dbpath data/db --auditDestination console

You may also specify these options in the configuration file:


dbpath=data/db
auditDestination=console

Output to JSON File

To enable auditing and print audit events to a file in JSON format, specify file for the --auditDestination set-
ting, JSON for the --auditFormat setting, and the output filename for the --auditPath. The --auditPath
option accepts either full path name or relative path name. For example, the following enables auditing and records
audit events to a file with the relative path name of data/db/auditLog.json:
mongod --dbpath data/db --auditDestination file --auditFormat JSON --auditPath data/db/auditLog.json

The audit file rotates at the same time as the server log file.
You may also specify these options in the configuration file:
dbpath=data/db
auditDestination=file
auditFormat=JSON
auditPath=data/db/auditLog.json

Note: Printing audit events to a file in JSON format degrades server performance more than printing to a file in BSON
format.

Output to BSON File

To enable auditing and print audit events to a file in BSON binary format, specify file for the
--auditDestination setting, BSON for the --auditFormat setting, and the output filename for the
--auditPath. The --auditPath option accepts either full path name or relative path name. For ex-
ample, the following enables auditing and records audit events to a BSON file with the relative path name of
data/db/auditLog.bson:
mongod --dbpath data/db --auditDestination file --auditFormat BSON --auditPath data/db/auditLog.bson

The audit file rotates at the same time as the server log file.
You may also specify these options in the configuration file:
dbpath=data/db
auditDestination=file
auditFormat=BSON
auditPath=data/db/auditLog.bson

To view the contents of the file, pass the file to the MongoDB utility bsondump. For example, the following converts
the audit log into a human-readable form and output to the terminal:
bsondump data/db/auditLog.bson

73
Filter Events

By default, the audit facility records all auditable operations (page 96). The audit feature has an --auditFilter
option to determine which events to record. The --auditFilter option takes a document of the form:
{ atype: <expression> }

The <expression> is a query condition expression to match on various actions (page 96) .

Filter for a Single Operation Type

For example, to audit only the createCollection (page 91) action, use the filter { atype:
"createCollection" }:

Tip
To specify the filter as a command-line option, enclose the filter document in single quotes to pass the document as a
string.

mongod --dbpath data/db --auditDestination file --auditFilter '{ atype: "createCollection" }' --audit

Filter for Multiple Operation Types

To match on multiple operations, use the $in operator in the <expression> as in the following:

Tip
To specify the filter as a command-line option, enclose the filter document in single quotes to pass the document as a
string.

mongod --dbpath data/db --auditDestination file --auditFilter '{ atype: { $in: [ "createCollection",

Filter on Authentication Operations on a Single Database

For authentication operations, you can also specify a specific database with the param.db field:
{ atype: <expression>, "param.db": <database> }

For example, to audit only authenticate operations that occur against the test database, use the filter {
atype: "authenticate", "param.db": "test" }:

Tip
To specify the filter as a command-line option, enclose the filter document in single quotes to pass the document as a
string.

mongod --dbpath data/db --auth --auditDestination file --auditFilter '{ atype: "authenticate", "param

To filter on all authenticate operations across databases, use the filter { atype: "authenticate" }.

74
3.7 Create a Vulnerability Report

If you believe you have discovered a vulnerability in MongoDB or have experienced a security incident related to
MongoDB, please report the issue to aid in its resolution.
To report an issue, we strongly suggest filing a ticket in the SECURITY38 project in JIRA. MongoDB, Inc responds to
vulnerability notifications within 48 hours.

Create the Report in JIRA

Submit a ticket in the Security39 project at: <http://jira.mongodb.org/browse>. The ticket number will become the
reference identification for the issue for its lifetime. You can use this identifier for tracking purposes.

Information to Provide

All vulnerability reports should contain as much information as possible so MongoDB’s developers can move quickly
to resolve the issue. In particular, please include the following:
• The name of the product.
• Common Vulnerability information, if applicable, including:
• CVSS (Common Vulnerability Scoring System) Score.
• CVE (Common Vulnerability and Exposures) Identifier.
• Contact information, including an email address and/or phone number, if applicable.

Send the Report via Email

While JIRA is the preferred reporting method, you may also report vulnerabilities via email to secu-
[email protected] .
You may encrypt email using MongoDB’s public key at http://docs.mongodb.org/10gen-security-gpg-key.asc.
MongoDB, Inc. responds to vulnerability reports sent via email with a response email that contains a reference number
for a JIRA ticket posted to the SECURITY41 project.

Evaluation of a Vulnerability Report

MongoDB, Inc. validates all submitted vulnerabilities and uses Jira to track all communications regarding a vulner-
ability, including requests for clarification or additional information. If needed, MongoDB representatives set up a
conference call to exchange information regarding the vulnerability.

Disclosure

MongoDB, Inc. requests that you do not publicly disclose any information regarding the vulnerability or exploit the
issue until it has had the opportunity to analyze the vulnerability, to respond to the notification, and to notify key users,
customers, and partners.
38 https://jira.mongodb.org/browse/SECURITY
39 https://jira.mongodb.org/browse/SECURITY
40 [email protected]
41 https://jira.mongodb.org/browse/SECURITY

75
The amount of time required to validate a reported vulnerability depends on the complexity and severity of the issue.
MongoDB, Inc. takes all required vulnerabilities very seriously and will always ensure that there is a clear and open
channel of communication with the reporter.
After validating an issue, MongoDB, Inc. coordinates public disclosure of the issue with the reporter in a mutually
agreed timeframe and format. If required or requested, the reporter of a vulnerability will receive credit in the published
security bulletin.

4 Security Reference

4.1 Security Methods in the mongo Shell

Name Description
db.auth() Authenticates a user to a database.

User Management Methods

Name Description
db.createUser() Creates a new user.
db.addUser() Deprecated. Adds a user to a database, and allows administrators to configure the
user’s privileges.
db.updateUser() Updates user data.
Changes an existing user’s password.
db.changeUserPassword()
db.removeUser() Deprecated. Removes a user from a database.
db.dropAllUsers() Deletes all users associated with a database.
db.dropUser() Removes a single user.
db.grantRolesToUser() Grants a role and its privileges to a user.
Removes a role from a user.
db.revokeRolesFromUser()
db.getUser() Returns information about the specified user.
db.getUsers() Returns information about all users associated with a database.

Role Management Methods

Name Description
db.createRole() Creates a role and specifies its privileges.
db.updateRole() Updates a user-defined role.
db.dropRole() Deletes a user-defined role.
db.dropAllRoles() Deletes all user-defined roles associated with a database.
db.grantPrivilegesToRole() Assigns privileges to a user-defined role.
db.revokePrivilegesFromRole() Removes the specified privileges from a user-defined role.
db.grantRolesToRole() Specifies roles from which a user-defined role inherits privileges.
db.revokeRolesFromRole() Removes a role from a user.
db.getRole() Returns information for the specified role.
db.getRoles() Returns information for all the user-defined roles in a database.

4.2 Security Reference Documentation

Built-In Roles (page 77) Reference on MongoDB provided roles and corresponding access.
system.roles Collection (page 84) Describes the content of the collection that stores user-defined roles.

76
system.users Collection (page 87) Describes the content of the collection that stores users’ credentials and role as-
signments.
Resource Document (page 88) Describes the resource document for roles.
Privilege Actions (page 90) List of the actions available for privileges.
Default MongoDB Port (page 95) List of default ports used by MongoDB.
System Event Audit Messages (page 95) Reference on system event audit messages.

Built-In Roles

MongoDB grants access to data and commands through role-based authorization (page 8) and provides built-in roles
that provide the different levels of access commonly needed in a database system. You can additionally create user-
defined roles (page 9).
A role grants privileges to perform sets of actions (page 90) on defined resources (page 88). A given role applies to
the database on which it is defined and can grant access down to a collection level of granularity.
Each of MongoDB’s built-in roles defines access at the database level for all non-system collections in the role’s
database and at the collection level for all system collections.
MongoDB provides the built-in database user (page 77) and database administration (page 78) roles on every
database. MongoDB provides all other built-in roles only on the admin database.
This section describes the privileges for each built-in role. You can also view the privileges for a built-in role at any
time by issuing the rolesInfo command with the showPrivileges and showBuiltinRoles fields both set
to true.

Database User Roles

Every database includes the following client roles:


read
Provides the ability to read data on all non-system collections and on the following system collections:
system.indexes, system.js, and system.namespaces collections. The role provides read access
by granting the following actions (page 90):
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
readWrite
Provides all the privileges of the read (page 77) role plus ability to modify data on all non-system collections
and the system.js collection. The role provides the following actions on those collections:
•collStats (page 94)
•convertToCapped (page 93)
•createCollection (page 91)
•dbHash (page 94)
•dbStats (page 94)

77
•dropCollection (page 91)
•createIndex (page 91)
•dropIndex (page 93)
•emptycapped (page 91)
•find (page 90)
•insert (page 90)
•killCursors (page 91)
•remove (page 90)
•renameCollectionSameDB (page 94)
•update (page 90)

Database Administration Roles

Every database includes the following database administration roles:


dbAdmin
Provides the following actions (page 90) on the database’s system.indexes, system.namespaces, and
system.profile collections:
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
•dropCollection (page 91) on system.profile only
Provides the following actions on all non-system collections. This role does not include full read access on
non-system collections:
•collMod (page 93)
•collStats (page 94)
•compact (page 93)
•convertToCapped (page 93)
•createCollection (page 91)
•createIndex (page 91)
•dbStats (page 94)
•dropCollection (page 91)
•dropDatabase (page 93)
•dropIndex (page 93)
•enableProfiler (page 91)
•indexStats (page 94)
•reIndex (page 93)

78
•renameCollectionSameDB (page 94)
•repairDatabase (page 94)
•storageDetails (page 92)
•validate (page 95)
dbOwner
The database owner can perform any administrative action on the database. This role combines the privileges
granted by the readWrite (page 77), dbAdmin (page 78) and userAdmin (page 79) roles.
userAdmin
Provides the ability to create and modify roles and users on the current database. This role also indirectly
provides superuser (page 83) access to either the database or, if scoped to the admin database, the cluster. The
userAdmin (page 79) role allows users to grant any user any privilege, including themselves.
The userAdmin (page 79) role explicitly provides the following actions:
•changeCustomData (page 90)
•changePassword (page 90)
•createRole (page 91)
•createUser (page 91)
•dropRole (page 91)
•dropUser (page 91)
•grantRole (page 91)
•revokeRole (page 91)
•viewRole (page 91)
•viewUser (page 91)

Cluster Administration Roles

The admin database includes the following roles for administering the whole system rather than just a single database.
These roles include but are not limited to replica set and sharded cluster administrative functions.
clusterAdmin
Provides the greatest cluster-management access. This role combines the privileges granted by the
clusterManager (page 79), clusterMonitor (page 80), and hostManager (page 81) roles. Addi-
tionally, the role provides the dropDatabase (page 93) action.
clusterManager
Provides management and monitoring actions on the cluster. A user with this role can access the config and
local databases, which are used in sharding and replication, respectively.
Provides the following actions on the cluster as a whole:
•addShard (page 92)
•applicationMessage (page 93)
•cleanupOrphaned (page 92)
•flushRouterConfig (page 92)
•listShards (page 93)

79
•removeShard (page 93)
•replSetConfigure (page 92)
•replSetGetStatus (page 92)
•replSetStateChange (page 92)
•resync (page 92)
Provides the following actions on all databases in the cluster:
•enableSharding (page 92)
•moveChunk (page 93)
•splitChunk (page 93)
•splitVector (page 93)
On the config database, provides the following actions on the settings collection:
•insert (page 90)
•remove (page 90)
•update (page 90)
On the config database, provides the following actions on all configuration collections and on the
system.indexes, system.js, and system.namespaces collections:
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
On the local database, provides the following actions on the replset collection:
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
clusterMonitor
Provides read-only access to monitoring tools, such as the MongoDB Management Service (MMS)42 monitoring
agent.
Provides the following actions on the cluster as a whole:
•connPoolStats (page 94)
•cursorInfo (page 94)
•getCmdLineOpts (page 94)
•getLog (page 94)
•getParameter (page 93)
42 http://mms.mongodb.com/help/

80
•getShardMap (page 92)
•hostInfo (page 93)
•inprog (page 92)
•listDatabases (page 94)
•listShards (page 93)
•netstat (page 94)
•replSetGetStatus (page 92)
•serverStatus (page 94)
•shardingState (page 93)
•top (page 95)
Provides the following actions on all databases in the cluster:
•collStats (page 94)
•dbStats (page 94)
•getShardVersion (page 93)
Provides the find (page 90) action on all system.profile collections in the cluster.
Provides the following actions on the config database’s configuration collections and system.indexes,
system.js, and system.namespaces collections:
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
hostManager
Provides the ability to monitor and manager servers.
Provides the following actions on the cluster as a whole:
•applicationMessage (page 93)
•closeAllDatabases (page 93)
•connPoolSync (page 93)
•cpuProfiler (page 92)
•diagLogging (page 94)
•flushRouterConfig (page 92)
•fsync (page 93)
•invalidateUserCache (page 92)
•killop (page 92)
•logRotate (page 93)
•resync (page 92)
•setParameter (page 94)

81
•shutdown (page 94)
•touch (page 94)
•unlock (page 91)
Provides the following actions on all databases in the cluster:
•killCursors (page 91)
•repairDatabase (page 94)

Backup and Restoration Roles

The admin database includes the following roles for backing up and restoring data:
backup
Provides minimal privileges needed for backing up data. This role provides sufficient privileges to use the
MongoDB Management Service (MMS)43 backup agent, or to use mongodump to back up an entire mongod
instance.
Provides the following actions (page 90) on the mms.backup collection in the admin database:
•insert (page 90)
•update (page 90)
Provides the listDatabases (page 94) action on the cluster as a whole.
Provides the find (page 90) action on the following:
•all non-system collections in the cluster
•all the following system collections in the cluster: system.indexes, system.namespaces, and
system.js
•the admin.system.users and admin.system.roles collections
•legacy system.users collections from versions of MongoDB prior to 2.6
restore
Provides minimal privileges needed for restoring data from backups. This role provides sufficient privileges to
use the mongorestore tool to restore an entire mongod instance.
Provides the following actions on all non-system collections and system.js collections in the cluster; on the
admin.system.users and admin.system.roles collections in the admin database; and on legacy
system.users collections from versions of MongoDB prior to 2.6:
•collMod (page 93)
•createCollection (page 91)
•createIndex (page 91)
•dropCollection (page 91)
•insert (page 90)
Provides the following additional actions on admin.system.users and legacy system.users collec-
tions:
•find (page 90)
•remove (page 90)
43 http://mms.mongodb.com/help/

82
•update (page 90)
Provides the find (page 90) action on all the system.namespaces collections in the cluster.
Although, restore (page 82) includes the ability to modify the documents in the admin.system.users
collection using normal modification operations, only modify these data using the user management methods.

All-Database Roles

The admin database provides the following roles that apply to all databases in a mongod instance and are roughly
equivalent to their single-database equivalents:
readAnyDatabase
Provides the same read-only permissions as read (page 77), except it applies to all databases in the cluster.
The role also provides the listDatabases (page 94) action on the cluster as a whole.
readWriteAnyDatabase
Provides the same read and write permissions as readWrite (page 77), except it applies to all databases in
the cluster. The role also provides the listDatabases (page 94) action on the cluster as a whole.
userAdminAnyDatabase
Provides the same access to user administration operations as userAdmin (page 79), except it applies to all
databases in the cluster. The role also provides the following actions on the cluster as a whole:
•authSchemaUpgrade (page 91)
•invalidateUserCache (page 92)
•listDatabases (page 94)
The role also provides the following actions on the admin.system.users and admin.system.roles
collections on the admin database, and on legacy system.users collections from versions of MongoDB
prior to 2.6:
•collStats (page 94)
•dbHash (page 94)
•dbStats (page 94)
•find (page 90)
•killCursors (page 91)
•planCacheRead (page 92)
The userAdminAnyDatabase (page 83) role does not restrict the permissions that a user can grant. As
a result, userAdminAnyDatabase (page 83) users can grant themselves privileges in excess of their cur-
rent privileges and even can grant themselves all privileges, even though the role does not explicitly authorize
privileges beyond user administration. This role is effectively a MongoDB system superuser (page 83).
dbAdminAnyDatabase
Provides the same access to database administration operations as dbAdmin (page 78), except it applies to
all databases in the cluster. The role also provides the listDatabases (page 94) action on the cluster as a
whole.

Superuser Roles

Several roles provide either indirect or direct system-wide superuser access.

83
The following roles provide the ability to assign any user any privilege on any database, which means that users with
one of these roles can assign themselves any privilege on any database:
• dbOwner (page 79) role, when scoped to the admin database
• userAdmin (page 79) role, when scoped to the admin database
• userAdminAnyDatabase (page 83) role
The following role provides full privileges on all resources:
root
Provides access to the operations and all the resources of the readWriteAnyDatabase (page 83),
dbAdminAnyDatabase (page 83), userAdminAnyDatabase (page 83) and clusterAdmin (page 79)
roles combined.
:auth:‘root‘ does not include the ability to insert data directly into the system.users and system.roles
collections in the admin database. Therefore, root (page 84) is not suitable for restoring data that have
these collections with mongorestore. To perform these kinds of restore operations, provision users with the
restore (page 82) role.

Internal Role

__system
MongoDB assigns this role to user objects that represent cluster members, such as replica set members and
mongos instances. The role entitles its holder to take any action against any object in the database.
Do not assign this role to user objects representing applications or human administrators, other than in excep-
tional circumstances.
If you need access to all actions on all resources, for example to run the eval or applyOps commands, do
not assign this role. Instead,:ref:create a user-defined role <define-roles> that grants anyAction (page 95) on
anyResource (page 90) and ensure that only the users who needs access to these operations has this access.

system.roles Collection

New in version 2.6.


The system.roles collection in the admin database stores the user-defined roles. To create and manage these
user-defined roles, MongoDB provides role management commands.

system.roles Schema

The documents in the system.roles collection have the following schema:


{
_id: <system-defined id>,
role: "<role name>",
db: "<database>",
privileges:
[
{
resource: { <resource> },
actions: [ "<action>", ... ]
},
...
],

84
roles:
[
{ role: "<role name>", db: "<database>" },
...
]
}

A system.roles document has the following fields:


admin.system.roles.role
The role (page 85) field is a string that specifies the name of the role.
admin.system.roles.db
The db (page 85) field is a string that specifies the database to which the role belongs. MongoDB uniquely
identifies each role by the pairing of its name (i.e. role (page 85)) and its database.
admin.system.roles.privileges
The privileges (page 85) array contains the privilege documents that define the privileges (page 9) for the
role.
A privilege document has the following syntax:
{
resource: { <resource> },
actions: [ "<action>", ... ]
}

Each privilege document has the following fields:


admin.system.roles.privileges[n].resource
A document that specifies the resources upon which the privilege actions (page 85) apply. The docu-
ment has one of the following form:
{ db: <database>, collection: <collection> }

or
{ cluster : true }

See Resource Document (page 88) for more details.


admin.system.roles.privileges[n].actions
An array of actions permitted on the resource. For a list of actions, see Privilege Actions (page 90).
admin.system.roles.roles
The roles (page 85) array contains role documents that specify the roles from which this role inherits (page 9)
privileges.
A role document has the following syntax:
{ role: "<role name>", db: "<database>" }

A role document has the following fields:


admin.system.roles.roles[n].role
The name of the role. A role can be a built-in role (page 77) provided by MongoDB or a user-defined role
(page 9).
admin.system.roles.roles[n].db
The name of the database where the role is defined.

85
Examples

Consider the following sample documents found in system.roles collection of the admin database.

A User-Defined Role Specifies Privileges The following is a sample document for a user-defined role appUser
defined for the myApp database:
{
_id: "myApp.appUser",
role: "appUser",
db: "myApp",
privileges: [
{ resource: { db: "myApp" , collection: "" },
actions: [ "find", "createCollection", "dbStats", "collStats" ] },
{ resource: { db: "myApp", collection: "logs" },
actions: [ "insert" ] },
{ resource: { db: "myApp", collection: "data" },
actions: [ "insert", "update", "remove", "compact" ] },
{ resource: { db: "myApp", collection: "system.indexes" },
actions: [ "find" ] },
{ resource: { db: "myApp", collection: "system.namespaces" },
actions: [ "find" ] },
],
roles: []
}

The privileges array lists the five privileges that the appUser role specifies:
• The first privilege permits its actions ( "find", "createCollection", "dbStats", "collStats") on
all the collections in the myApp database excluding its system collections. See Specify a Database as Resource
(page 89).
• The next two privileges permits additional actions on specific collections, logs and data, in the myApp
database. See Specify a Collection of a Database as Resource (page 88).
• The last two privileges permits actions on two system collections in the myApp database. While the
first privilege gives database-wide permission for the find action, the action does not apply to myApp‘s system
collections. To give access to a system collection, a privilege must explicitly specify the collection. See Resource
Document (page 88).
As indicated by the empty roles array, appUser inherits no additional privileges from other roles.

User-Defined Role Inherits from Other Roles The following is a sample document for a user-defined role
appAdmin defined for the myApp database: The document shows that the appAdmin role specifies privileges
as well as inherits privileges from other roles:
{
_id: "myApp.appAdmin",
role: "appAdmin",
db: "myApp",
privileges: [
{
resource: { db: "myApp", collection: "" },
actions: [ "insert", "dbStats", "collStats", "compact", "repairDatabase" ]
}
],
roles: [

86
{ role: "appUser", db: "myApp" }
]
}

The privileges array lists the privileges that the appAdmin role specifies. This role has a single privilege that
permits its actions ( "insert", "dbStats", "collStats", "compact", "repairDatabase") on all the
collections in the myApp database excluding its system collections. See Specify a Database as Resource (page 89).
The roles array lists the roles, identified by the role names and databases, from which the role appAdmin inherits
privileges.

system.users Collection

Changed in version 2.6.


The system.users collection in the admin database stores user authentication (page 5) and authorization (page 8)
information. To manage data in this collection, MongoDB provides user management commands.

system.users Schema

The documents in the system.users collection have the following schema:


{
_id: <system defined id>,
user: "<name>",
db: "<database>",
credentials: { <authentication credentials> },
roles: [
{ role: "<role name>", db: "<database>" },
...
],
customData: <custom information>
}

Each system.users document has the following fields:


admin.system.users.user
The user (page 87) field is a string that identifies the user. A user exists in the context of a single logical
database but can have access to other databases through roles specified in the roles (page 87) array.
admin.system.users.db
The db (page 87) field specifies the database associated with the user. The user’s privileges are not necessarily
limited to this database. The user can have privileges in additional databases through the roles (page 87)
array.
admin.system.users.credentials
The credentials (page 87) field contains the user’s authentication information. For users with externally
stored authentication credentials, such as users that use Kerberos (page 47) or x.509 certificates for authentica-
tion, the system.users document for that user does not contain the credentials (page 87) field.
admin.system.users.roles
The roles (page 87) array contains role documents that specify the roles granted to the user. The array contains
both built-in roles (page 77) and user-defined role (page 9).
A role document has the following syntax:

87
{ role: "<role name>", db: "<database>" }

A role document has the following fields:


admin.system.users.roles[n].role
The name of a role. A role can be a built-in role (page 77) provided by MongoDB or a custom user-defined
role (page 9).
admin.system.users.roles[n].db
The name of the database where role is defined.
When specifying a role using the role management or user management commands, you can specify the role
name alone (e.g. "readWrite") if the role that exists on the database on which the command is run.
admin.system.users.customData
The customData (page 88) field contains optional custom information about the user.

Example

Consider the following document in the system.users collection:


{
_id: "home.Kari",
user: "Kari",
db: "home",
credentials: { "MONGODB-CR" :"<hashed password>" },
roles : [
{ role: "read", db: "home" },
{ role: "readWrite", db: "test" },
{ role: "appUser", db: "myApp" }
],
customData: { zipCode: "64157" }
}

The document shows that a user Kari is associated with the home database. Kari has the read (page 77) role
in the home database, the readWrite (page 77) role in the test database, and the appUser role in the myApp
database.

Resource Document

The resource document specifies the resources upon which a privilege permits actions.

Database and/or Collection Resource

To specify databases and/or collections, use the following syntax:


{ db: <database>, collection: <collection> }

Specify a Collection of a Database as Resource If the resource document species both the db an collection
fields as non-empty strings, the resource is the specified collection in the specified database. For example, the following
document specifies a resource of the inventory collection in the products database:
{ db: "products", collection: "inventory" }

88
For a user-defined role scoped for a non-admin database, the resource specification for its privileges must specify the
same database as the role. User-defined roles scoped for the admin database can specify other databases.

Specify a Database as Resource If only the collection field is an empty string (""), the resource is the speci-
fied database, excluding the system collections. For example, the following resource document specifies the
resource of the test database, excluding the system collections:
{ db: "test", collection: "" }

For a user-defined role scoped for a non-admin database, the resource specification for its privileges must specify the
same database as the role. User-defined roles scoped for the admin database can specify other databases.

Note: When you specify a database as the resource, the system collections are excluded, unless you name them
explicitly, as in the following:
{ db: "test", collection: "system.namespaces" }

System collections include but are not limited to the following:


• <database>.system.profile
• <database>.system.namespaces
• <database>.system.indexes
• <database>.system.js
• local.system.replset
• system.users Collection (page 87) in the admin database
• system.roles Collection (page 84) in the admin database

Specify Collections Across Databases as Resource If only the db field is an empty string (""), the resource is all
collections with the specified name across all databases. For example, the following document specifies the resource
of all the accounts collections across all the databases:
{ db: "", collection: "accounts" }

For user-defined roles, only roles scoped for the admin database can have this resource specification for their privi-
leges.

Specify All Non-System Collections in All Databases If both the db and collection fields are empty strings
(""), the resource is all collections, excluding the system collections, in all the databases:
{ db: "", collection: "" }

For user-defined roles, only roles scoped for the admin database can have this resource specification for their privi-
leges.

Cluster Resource

To specify the cluster as the resource, use the following syntax:


{ cluster : true }

89
Use the cluster resource for actions that affect the state of the system rather than act on specific set of databases
or collections. Examples of such actions are shutdown, replSetReconfig, and addShard. For example, the
following document grants the action shutdown on the cluster.
{ resource: { cluster : true }, actions: [ "shutdown" ] }

For user-defined roles, only roles scoped for the admin database can have this resource specification for their privi-
leges.

anyResource

The internal resource anyResource gives access to every resource in the system and is intended for internal use.
Do not use this resource, other than in exceptional circumstances. The syntax for this resource is { anyResource:
true }.

Privilege Actions

New in version 2.6.


Privilege actions define the operations a user can perform on a resource (page 88). A MongoDB privilege (page 9)
comprises a resource (page 88) and the permitted actions. This page lists available actions grouped by common
purpose.
MongoDB provides built-in roles with pre-defined pairings of resources and permitted actions. For lists of the actions
granted, see Built-In Roles (page 77). To define custom roles, see Create a Role (page 63).

Query and Write Actions

find
User can perform the db.collection.find() method. Apply this action to database or collection re-
sources.
insert
User can perform the insert command. Apply this action to database or collection resources.
remove
User can perform the db.collection.remove() method. Apply this action to database or collection
resources.
update
User can perform the update command. Apply this action to database or collection resources.

Database Management Actions

changeCustomData
User can change the custom information of any user in the given database. Apply this action to database or
collection resources.
changeOwnCustomData
Users can change their own custom information. Apply this action to database or collection resources.
changeOwnPassword
Users can change their own passwords. Apply this action to database or collection resources.

90
changePassword
User can change the password of any user in the given database. Apply this action to database or collection
resources.
createCollection
User can perform the db.createCollection() method. Apply this action to database or collection re-
sources.
createIndex
Provides access to the db.collection.createIndex() method and the createIndexes command.
Apply this action to database or collection resources.
createRole
User can create new roles in the given database. Apply this action to database or collection resources.
createUser
User can create new users in the given database. Apply this action to database or collection resources.
dropCollection
User can perform the db.collection.drop() method. Apply this action to database or collection re-
sources.
dropRole
User can delete any role from the given database. Apply this action to database or collection resources.
dropUser
User can remove any user from the given database. Apply this action to database or collection resources.
emptycapped
User can perform the emptycapped command. Apply this action to database or collection resources.
enableProfiler
User can perform the db.setProfilingLevel() method. Apply this action to database or collection
resources.
grantRole
User can grant any role in the database to any user from any database in the system. Apply this action to database
or collection resources.
killCursors
User can kill cursors on the target collection.
revokeRole
User can remove any role from any user from any database in the system. Apply this action to database or
collection resources.
unlock
User can perform the db.fsyncUnlock() method. Apply this action to the cluster resource.
viewRole
User can view information about any role in the given database. Apply this action to database or collection
resources.
viewUser
User can view the information of any user in the given database. Apply this action to database or collection
resources.

Deployment Management Actions

authSchemaUpgrade
User can perform the authSchemaUpgrade command. Apply this action to the cluster resource.

91
cleanupOrphaned
User can perform the cleanupOrphaned command. Apply this action to the cluster resource.
cpuProfiler
User can enable and use the CPU profiler. Apply this action to the cluster resource.
inprog
User can use the db.currentOp() method to return pending and active operations. Apply this action to the
cluster resource.
invalidateUserCache
Provides access to the invalidateUserCache command. Apply this action to the cluster resource.
killop
User can perform the db.killOp() method. Apply this action to the cluster resource.
planCacheRead
User can perform the planCacheListPlans and planCacheListQueryShapes commands and the
PlanCache.getPlansByQuery() and PlanCache.listQueryShapes() methods. Apply this ac-
tion to database or collection resources.
planCacheWrite
User can perform the planCacheClear command and the PlanCache.clear() and
PlanCache.clearPlansByQuery() methods. Apply this action to database or collection resources.
storageDetails
User can perform the storageDetails command. Apply this action to database or collection resources.

Replication Actions

appendOplogNote
User can append notes to the oplog. Apply this action to the cluster resource.
replSetConfigure
User can configure a replica set. Apply this action to the cluster resource.
replSetGetStatus
User can perform the replSetGetStatus command. Apply this action to the cluster resource.
replSetHeartbeat
User can perform the replSetHeartbeat command. Apply this action to the cluster resource.
replSetStateChange
User can change the state of a replica set through the replSetFreeze, replSetMaintenance,
replSetStepDown, and replSetSyncFrom commands. Apply this action to the cluster resource.
resync
User can perform the resync command. Apply this action to the cluster resource.

Sharding Actions

addShard
User can perform the addShard command. Apply this action to the cluster resource.
enableSharding
User can perform the enableSharding command. Apply this action to the cluster resource.
flushRouterConfig
User can perform the flushRouterConfig command. Apply this action to the cluster resource.

92
getShardMap
User can perform the getShardMap command. Apply this action to the cluster resource.
getShardVersion
User can perform the getShardVersion command. Apply this action to database or collection resources.
listShards
User can perform the listShards command. Apply this action to the cluster resource.
moveChunk
User can perform the moveChunk command. Apply this action to the cluster resource.
removeShard
User can perform the removeShard command. Apply this action to the cluster resource.
shardingState
User can perform the shardingState command. Apply this action to the cluster resource.
splitChunk
User can perform the splitChunk command. Apply this action to the cluster resource.
splitVector
User can perform the splitVector command. Apply this action to the cluster resource.

Server Administration Actions

applicationMessage
User can perform the logApplicationMessage command. Apply this action to the cluster resource.
closeAllDatabases
User can perform the closeAllDatabases command. Apply this action to the cluster resource.
collMod
User can perform the collMod command. Apply this action to database or collection resources.
compact
User can perform the compact command. Apply this action to database or collection resources.
connPoolSync
User can perform the connPoolSync command. Apply this action to the cluster resource.
convertToCapped
User can perform the convertToCapped command. Apply this action to database or collection resources.
dropDatabase
User can perform the dropDatabase command. Apply this action to database or collection resources.
dropIndex
User can perform the dropIndexes command. Apply this action to database or collection resources.
fsync
User can perform the fsync command. Apply this action to the cluster resource.
getParameter
User can perform the getParameter command. Apply this action to the cluster resource.
hostInfo
Provides information about the server the MongoDB instance runs on. Apply this action to the cluster
resource.
logRotate
User can perform the logRotate command. Apply this action to the cluster resource.

93
reIndex
User can perform the reIndex command. Apply this action to database or collection resources.
renameCollectionSameDB
Allows the user to rename collections on the current database using the renameCollection command.
Apply this action to database resources.
Additionally, the user must either have find (page 90) on the source collection or not have find (page 90) on
the destination collection.
If a collection with the new name already exists, the user must also have the dropCollection (page 91)
action on the destination collection.
repairDatabase
User can perform the repairDatabase command. Apply this action to database or collection resources.
setParameter
User can perform the setParameter command. Apply this action to the cluster resource.
shutdown
User can perform the shutdown command. Apply this action to the cluster resource.
touch
User can perform the touch command. Apply this action to the cluster resource.

Diagnostic Actions

collStats
User can perform the collStats command. Apply this action to database or collection resources.
connPoolStats
User can perform the connPoolStats and shardConnPoolStats commands. Apply this action to the
cluster resource.
cursorInfo
User can perform the cursorInfo command. Apply this action to the cluster resource.
dbHash
User can perform the dbHash command. Apply this action to database or collection resources.
dbStats
User can perform the dbStats command. Apply this action to database or collection resources.
diagLogging
User can perform the diagLogging command. Apply this action to the cluster resource.
getCmdLineOpts
User can perform the getCmdLineOpts command. Apply this action to the cluster resource.
getLog
User can perform the getLog command. Apply this action to the cluster resource.
indexStats
User can perform the indexStats command. Apply this action to database or collection resources.
listDatabases
User can perform the listDatabases command. Apply this action to the cluster resource.
netstat
User can perform the netstat command. Apply this action to the cluster resource.

94
serverStatus
User can perform the serverStatus command. Apply this action to the cluster resource.
validate
User can perform the validate command. Apply this action to database or collection resources.
top
User can perform the top command. Apply this action to the cluster resource.

Internal Actions

anyAction
Allows any action on a resource. Do not assign this action except for exceptional circumstances.
internal
Allows internal actions. Do not assign this action except for exceptional circumstances.

Default MongoDB Port

The following table lists the default ports used by MongoDB:


Default Description
Port
27017 The default port for mongod and mongos instances. You can change this port with port or
--port.
27018 The default port when running with --shardsvr runtime operation or the shardsvr value for the
clusterRole setting in a configuration file.
27019 The default port when running with --configsvr runtime operation or the configsvr value for
the clusterRole setting in a configuration file.
28017 The default port for the web status page. The web status page is always accessible at a port number
that is 1000 greater than the port determined by port.

System Event Audit Messages

Note: The audit system (page 13) is available only in MongoDB Enterprise44 .

The event auditing feature (page 13) can record events in JSON format. The recorded JSON messages have the
following syntax:
{
atype: <String>,
ts : { "$date": <timestamp> },
local: { ip: <String>, port: <int> },
remote: { ip: <String>, port: <int> },
users : [ { user: <String>, db: String> }, ... ],
params: <document>,
result: <int>
}

field String atype Action type. See Event Actions, Details, and Results (page 96).
field document ts Document that contains the date and UTC time of the event, in ISO 8601 format.
44 http://www.mongodb.com/products/mongodb-enterprise

95
field document local Document that contains the local ip address and the port number of the running
instance.
field document remote Document that contains the remote ip address and the port number of the
incoming connection associated with the event.
field array users Array of user identification documents. Because MongoDB allows a session to log in
with different user per database, this array can have more than one user. Each document contains a
user field for the username and a db field for the authentication database for that user.
field document params Specific details for the event. See Event Actions, Details, and Results (page 96).
field integer result Error code. See Event Actions, Details, and Results (page 96).

Event Actions, Details, and Results

The following table lists for each atype or action type, the associated params details and the result values, if
any.

atype params result Notes


authenticate 0 - Success
{ 18 - Authentication Failed
user: <user name>,
db: <database>,
mechanism: <mechanism>
}

authCheck 0 - Success The auditing system logs


{ 13 - Unauthorized to per- only authorization failures.
command: <name>, form the operation. ns field is optional.
ns: <database>.<collection>, args field may be
args: <command object> redacted.
}

createCollection 0 - Success
(page 91) { ns: <database>.<collection> }

createDatabase 0 - Success
{ ns: <database> }

createIndex (page 91) 0 - Success


{
ns: <database>.<collection>,
indexName: <index name>,
indexSpec: <full index specification>
}

renameCollection 0 - Success
{
old: <database>.<collection>,
new: <database>.<collection>
}

Continued on next page

96
Table 1 – continued from previous page
atype params result Notes
dropCollection 0 - Success
(page 91) { ns: <database>.<collection> }

dropDatabase 0 - Success
(page 93) { ns: <database> }

dropIndex (page 93) 0 - Success


{
ns: <database>.<collection>,
indexName: <index name>
}

createUser (page 91) 0 - Success customData field is op-


{ tional.
user: <user name>,
db: <database>,
customData: <document>,
roles: [ <role1>, ... ]
}

dropUser (page 91) 0 - Success


{
user: <user name>,
db: <database>
}

dropAllUsersFromDatabase 0 - Success
{ db: <database> }

updateUser 0 - Success customData field is op-


{ tional.
user: <user name>,
db: <database>,
passwordChanged: <boolean>,
customData: <document>,
roles: [ <role1>, ... ]
}

grantRolesToUser 0 - Success The roles array contains


{ role documents. See role
user: <user name>, Document (page 99).
db: <database>,
roles: [ <role1>, ... ]
}

Continued on next page

97
Table 1 – continued from previous page
atype params result Notes
revokeRolesFromUser 0 - Success The roles array contains
{ role documents. See role
user: <user name>, Document (page 99).
db: <database>,
roles: [ <role1>, ... ]
}

createRole (page 91) 0 - Success Either roles or the


{ privileges field can be
role: <role name>, optional.
db: <database>, The roles array contains
roles: [ <role1>, ... ], role documents. See role
privileges: [ <privilege1>, ... ] Document (page 99).
} The privileges array
contains privilege doc-
uments. See privilege
Document (page 100).
updateRole 0 - Success Either roles or the
{ privileges field can be
role: <role name>, optional.
db: <database>, The roles array contains
roles: [ <role1>, ... ], role documents. See role
privileges: [ <privilege1>, ... ] Document (page 99).
} The privileges array
contains privilege doc-
uments. See privilege
Document (page 100).
dropRole (page 91) 0 - Success
{
role: <role name>,
db: <database>
}

dropAllRolesFromDatabase 0 - Success
{ db: <database> }

grantRolesToRole 0 - Success The roles array contains


{ role documents. See role
role: <role name>, Document (page 99).
db: <database>,
roles: [ <role1>, ... ]
}

revokeRolesFromRole 0 - Success The roles array contains


{ role documents. See role
role: <role name>, Document (page 99).
db: <database>,
roles: [ <role1>, ... ]
}

Continued on next page

98
Table 1 – continued from previous page
atype params result Notes
grantPrivilegesToRole 0 - Success The privileges array
{ contains privilege doc-
role: <role name>, uments. See privilege
db: <database>, Document (page 100).
privileges: [ <privilege1>, ... ]
}

revokePrivilegesFromRole 0 - Success The privileges array


{ contains privilege doc-
role: <role name>, uments. See privilege
db: <database name>, Document (page 100).
privileges: [ <privilege1>, ... ]
}

replSetReconfig 0 - Success
{
old: <configuration>,
new: <configuration>
}

enableSharding 0 - Success
(page 92) { ns: <database> }

shardCollection 0 - Success
{
ns: <database>.<collection>,
key: <shard key pattern>,
options: { unique: <boolean> }
}

addShard (page 92) 0 - Success When a shard is


{ a replica set, the
shard: <shard name>, connectionString
connectionString: <hostname>:<port>, includes the replica set
maxSize: <maxSize> name and can include other
} members of the replica set.

removeShard (page 93) 0 - Success


{ shard: <shard name> }

shutdown (page 94) 0 - Success Indicates commencement


{ } of database shutdown.

applicationMessage 0 - Success See


(page 93) { msg: <custom message string> } logApplicationMessage.

Additional Information

role Document The <role> document in the roles array has the following form:

99
{
role: <role name>,
db: <database>
}

privilege Document The <privilege> document in the privilege array has the following form:
{
resource: <resource document> ,
actions: [ <action>, ... ]
}

See Resource Document (page 88) for details on the resource document. For a list of actions, see Privilege Actions
(page 90).

4.3 Security Release Notes Alerts

Security Release Notes (page 100) Security vulnerability for password.

Security Release Notes

Access to system.users Collection

Changed in version 2.4.


In 2.4, only users with the userAdmin role have access to the system.users collection.
In version 2.2 and earlier, the read-write users of a database all have access to the system.users collection, which
contains the user names and user password hashes. 45

Password Hashing Insecurity

If a user has the same password for multiple databases, the hash will be the same. A malicious user could exploit this
to gain access on a second database using a different user’s credentials.
As a result, always use unique username and password combinations for each database.
Thanks to Will Urbanski, from Dell SecureWorks, for identifying this issue.

45 Read-only users do not have access to the system.users collection.

100
Index
Symbols collStats (user action), 94
__system (user role), 84 compact (user action), 93
connPoolStats (user action), 94
A connPoolSync (user action), 93
convertToCapped (user action), 93
addShard (user action), 92
cpuProfiler (user action), 92
admin.system.roles.db (MongoDB reporting output), 85
createCollection (user action), 91
admin.system.roles.privileges (MongoDB reporting out-
createIndex (user action), 91
put), 85
createRole (user action), 91
admin.system.roles.privileges[n].actions (MongoDB re-
createUser (user action), 91
porting output), 85
cursorInfo (user action), 94
admin.system.roles.privileges[n].resource (MongoDB re-
porting output), 85
admin.system.roles.role (MongoDB reporting output), 85
D
admin.system.roles.roles (MongoDB reporting output), dbAdmin (user role), 78
85 dbAdminAnyDatabase (user role), 83
admin.system.roles.roles[n].db (MongoDB reporting out- dbHash (user action), 94
put), 85 dbOwner (user role), 79
admin.system.roles.roles[n].role (MongoDB reporting dbStats (user action), 94
output), 85 diagLogging (user action), 94
admin.system.users.credentials (MongoDB reporting out- dropCollection (user action), 91
put), 87 dropDatabase (user action), 93
admin.system.users.customData (MongoDB reporting dropIndex (user action), 93
output), 88 dropRole (user action), 91
admin.system.users.db (MongoDB reporting output), 87 dropUser (user action), 91
admin.system.users.roles (MongoDB reporting output),
87
E
admin.system.users.roles[n].db (MongoDB reporting out- emptycapped (user action), 91
put), 88 enableProfiler (user action), 91
admin.system.users.roles[n].role (MongoDB reporting enableSharding (user action), 92
output), 88
admin.system.users.user (MongoDB reporting output), 87 F
anyAction (user action), 95 find (user action), 90
appendOplogNote (user action), 92 flushRouterConfig (user action), 92
applicationMessage (user action), 93 fsync (user action), 93
authSchemaUpgrade (user action), 91
G
B getCmdLineOpts (user action), 94
backup (user role), 82 getLog (user action), 94
getParameter (user action), 93
C getShardMap (user action), 92
changeCustomData (user action), 90 getShardVersion (user action), 93
changeOwnCustomData (user action), 90 grantRole (user action), 91
changeOwnPassword (user action), 90
changePassword (user action), 90 H
cleanupOrphaned (user action), 92 hostInfo (user action), 93
closeAllDatabases (user action), 93 hostManager (user role), 81
clusterAdmin (user role), 79
clusterManager (user role), 79 I
clusterMonitor (user role), 80 indexStats (user action), 94
collMod (user action), 93 inprog (user action), 92

101
insert (user action), 90 T
internal (user action), 95 top (user action), 95
invalidateUserCache (user action), 92 touch (user action), 94
K U
killCursors (user action), 91 unlock (user action), 91
killop (user action), 92 update (user action), 90
userAdmin (user role), 79
L userAdminAnyDatabase (user role), 83
listDatabases (user action), 94
listShards (user action), 93 V
logRotate (user action), 93 validate (user action), 95
viewRole (user action), 91
M viewUser (user action), 91
moveChunk (user action), 93

N
netstat (user action), 94

P
planCacheRead (user action), 92
planCacheWrite (user action), 92

R
read (user role), 77
readAnyDatabase (user role), 83
readWrite (user role), 77
readWriteAnyDatabase (user role), 83
reIndex (user action), 93
remove (user action), 90
removeShard (user action), 93
renameCollectionSameDB (user action), 94
repairDatabase (user action), 94
replSetConfigure (user action), 92
replSetGetStatus (user action), 92
replSetHeartbeat (user action), 92
replSetStateChange (user action), 92
restore (user role), 82
resync (user action), 92
revokeRole (user action), 91
root (user role), 84

S
serverStatus (user action), 94
setParameter (user action), 94
sharding
localhost, 8
shardingState (user action), 93
shutdown (user action), 94
splitChunk (user action), 93
splitVector (user action), 93
storageDetails (user action), 92

102

You might also like