在副本集中实施密钥文件访问控制

在本页面

Overview

对现有的replica set实施访问控制需要配置:

对于本教程,副本集的每个成员都使用相同的内部身份验证机制和设置。

强制执行内部身份验证也会强制执行用户访问控制。要连接到副本集,诸如mongo shell 之类的 Client 端需要使用user account。参见Users

Cloud Manager 和 Ops Manager

如果 Cloud Manager 或 Ops Manager 正在 Management 您的部署,请参阅Cloud Manager 手册Ops Manager 手册以执行访问控制。

Considerations

IP Binding

在版本 3.6 中更改。

从 MongoDB 3.6 开始,MongoDB 二进制文件mongodmongos默认绑定到localhost。从 MongoDB 版本 2.6 到 3.4,默认情况下,只有来自正式 MongoDB RPM(Red Hat,CentOS,Fedora Linux 和衍生产品)和 DEB(Debian,Ubuntu 和衍生产品)软件包的二进制文件会绑定到localhost。要了解有关此更改的更多信息,请参见Localhost 绑定兼容性更改

Operating System

本教程使用mongod程序。 Windows 用户应改用mongod.exe程序。

Keyfile Security

密钥文件是最低限度的安全性形式,最适合于测试或开发环境。对于生产环境,我们建议使用x.509 certificates

Users

本教程介绍了在admin数据库* only *上创建最少数量的 Management 用户。对于用户身份验证,本教程使用默认的SCRAM身份验证机制。质询响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509 certificatesLDAP 代理验证(仅适用于 MongoDB Enterprise)或Kerberos Authentication(仅适用于 MongoDB Enterprise)。

有关为特定身份验证机制创建用户的详细信息,请参阅特定身份验证机制页面。

有关创建和 Management 用户的最佳做法,请参见➤配置基于角色的访问控制

Downtime

以下执行访问控制的过程需要停机。有关不需要停机的过程,请参见在不停机的情况下在副本集中实施密钥文件访问控制

对现有副本集实施密钥文件访问控制

创建密钥文件。

通过keyfile身份验证,副本集中的每个mongod实例都将密钥文件的内容用作共享密码,以对部署中的其他成员进行身份验证。只有具有正确密钥文件的mongod个实例可以加入副本集。

密钥文件的内容长度必须在 6 到 1024 个字符之间,并且副本集的所有成员都必须相同。

Note

在 UNIX 系统上,密钥文件不得具有组或世界权限。在 Windows 系统上,不检查密钥文件权限。

您可以使用任何选择的方法来生成密钥文件。例如,以下操作使用openssl生成用于密钥文件的复杂伪随机 1024 字符串。然后,它使用chmod更改文件权限,以仅为文件所有者提供读取权限:

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

有关使用密钥文件的其他详细信息和要求,请参见Keyfiles

将密钥文件复制到每个副本集成员。

将密钥文件复制到承载副本集成员的每个服务器上。确保运行mongod实例的用户是文件的所有者,并且可以访问密钥文件。

避免将密钥文件存储在易于与托管mongod实例的硬件断开连接的存储介质上,例如 USB 驱动器或网络连接的存储设备。

关闭副本集的所有成员。

secondaries开始,关闭副本集中的每个mongod。continue 直到副本集的所有成员都脱机,包括任何arbitersprimary必须是* last *成员关闭,以避免潜在的回滚。

要关闭mongod,请使用mongo shell 连接每个mongod并在admin数据库上发出db.shutdownServer()

use admin
db.shutdownServer()

在此步骤结束时,副本集的所有成员应处于脱机状态。

强制执行访问控制,重新启动副本集的每个成员。

使用security.keyFile配置文件设置或--keyFile命令行选项重新启动副本集中的* each * mongod。使用--keyFile命令行选项或security.keyFile配置文件设置运行mongod会同时强制Internal Authentication基于角色的访问控制

Configuration File

如果使用配置文件,请设置

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>
net:
   bindIp: localhost,<ip address>

使用配置文件启动mongod

mongod --config <path-to-config-file>

有关配置文件的更多信息,请参见configuration options

Command Line

如果使用命令行选项,请使用以下选项启动mongod

  • --keyFile设置为密钥文件的路径,并且

  • --replSet设置为副本集名称。

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip。有关更多信息,请参见Localhost 绑定兼容性更改

mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> --bind_ip localhost,<ip address of the mongod host>

有关命令行选项的更多信息,请参见mongod参考页。

使用 localhost 接口连接到主数据库。

mongoShell 连接到localhost interface上的mongod实例之一。您必须在与mongod实例相同的物理计算机上运行mongo shell。

使用rs.status()标识primary副本集成员。如果您连接到主服务器,请 continue 执行下一步。如果不是,请通过localhost interfacemongoShell 连接到主 Shell。

Important

您必须先连接到primary,然后才能 continue。

创建用户 Management 员。

Important

创建第一个用户后,localhost exception将不再可用。

第一个用户必须具有创建其他用户(例如具有userAdminAnyDatabase的用户)的特权。这样可以确保您可以在Localhost Exception关闭后创建其他用户。

如果至少一个用户没有创建用户的特权,则在 localhost 异常关闭后,您可能无法使用新特权创建或修改用户,因此无法访问必要的操作。

使用db.createUser()方法添加用户。用户在admin数据库上至少应具有userAdminAnyDatabase角色。

您必须连接到primary才能创建用户。

下面的示例在admin数据库上创建具有userAdminAnyDatabase角色的用户fred

Important

密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "fred",
    pwd: "changeme1",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

有关与数据库 Management 操作有关的内置角色的完整列表,请参见数据库用户角色

以用户 Management 员身份进行身份验证。

验证到admin数据库。

mongo shell 中,使用db.auth()进行身份验证。例如,以下身份验证为用户 Management 员fred

db.getSiblingDB("admin").auth("fred", "changeme1" )

或者,使用-u <username>-p <password>--authenticationDatabase参数将新的mongo shell 连接到主副本集成员。

mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"

创建集群 Management 员(可选)。

群集 Management 员用户具有clusterAdmin角色,该角色授予对复制操作的访问权限。

创建集群 Management 员用户,并在admin数据库中分配clusterAdmin角色:

db.getSiblingDB("admin").createUser(
  {
    "user" : "ravi",
    "pwd" : "changeme2",
    roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  }
)

有关副本集操作的内置角色的完整列表,请参见集群 Management 角色

创建其他用户(可选)。

创建用户以允许 Client 端连接副本集并与副本集进行交互。有关在创建只读和读写用户中使用的基本内置角色,请参见数据库用户角色

您可能还需要其他 Management 用户。有关用户的更多信息,请参见Users

x.509 内部身份验证

有关使用 x.509 进行内部身份验证的详细信息,请参阅使用 x.509 证书进行会员身份验证

要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证