在分片群集中实施密钥文件访问控制

在本页面

Overview

sharded cluster上执行访问控制需要配置:

对于本教程,分片群集的每个成员必须使用相同的内部身份验证机制和设置。这意味着对群集中的每个mongosmongod强制执行内部身份验证。

以下教程使用keyfile启用内部身份验证。

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

CloudManager 和 OpsManager

如果 Cloud Manager 或 Ops Manager 正在 Management 您的部署,则会自动强制执行内部身份验证。

要在托管部署上配置访问控制,请参阅:Cloud Manager 手册Ops Manager 手册中的Configure Access Control for MongoDB Deployments

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

Access Control

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

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

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

Users

通常,要为分片群集创建用户,请连接到mongos并添加分片群集用户。

但是,某些维护操作需要直接连接到分片群集中的特定分片。要执行这些操作,您必须直接连接到分片并以分片本地 Management 用户身份进行身份验证。

分片本地用户仅存在于特定分片中,并且仅应用于分片特定的维护和配置。您无法使用本地分片用户连接到mongos

有关更多信息,请参见Users安全文档。

Downtime

升级分片群集以实施访问控制需要停机。

Procedures

在现有分片群集部署中强制执行密钥文件内部身份验证

创建密钥文件。

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

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

Note

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

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

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

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

将密钥文件复制到分片群集中的每个组件。

承载分片群集的mongodmongos组件的每个服务器都必须包含密钥文件的副本。

将密钥文件复制到托管分片集群成员的每个服务器。确保运行mongodmongos实例的用户是文件的所有者,并且可以访问密钥文件。

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

禁用平衡器。

mongoShell 连接到mongos

sh.stopBalancer()

如果正在进行迁移,平衡器可能不会立即停止。 sh.stopBalancer()方法阻止 Shell 程序,直到平衡器停止。

使用sh.getBalancerState()验证平衡器已停止。

sh.getBalancerState()

Important

在平衡器停止运行之前,请勿 continue。

有关配置分片群集平衡器行为的教程,请参见Management 分片集群平衡器

关闭分片群集的所有 mongos 实例。

mongoShell 连接到每个mongos并将其关闭。

使用admin数据库上的db.shutdownServer()方法安全关闭mongos

db.getSiblingDB("admin").shutdownServer()

重复该操作,直到群集中的所有mongos实例都脱机。

完成此步骤后,群集中的所有mongos实例都应处于脱机状态。

关闭配置服务器 mongod 实例。

mongoShell 连接到配置服务器部署中的每个mongod并将其关闭。

对于副本集配置服务器部署,最后关闭primary成员。

使用admin数据库上的db.shutdownServer()方法安全关闭mongod

db.getSiblingDB("admin").shutdownServer()

重复直到所有配置服务器都脱机。

关闭分片副本集 mongod 实例。

对于每个分片副本集,将mongo shell 连接到副本集中的每个mongod成员,然后将其关闭。最后关闭primary成员。

使用admin数据库上的db.shutdownServer()方法安全关闭mongod

db.getSiblingDB("admin").shutdownServer()

对每个分片副本集重复此步骤,直到所有分片副本集中的所有mongod实例都脱机。

完成此步骤后,整个分片群集应处于脱机状态。

在配置服务器上强制执行访问控制。

在配置服务器副本集中启动* each * mongod。包括keyFile设置。 keyFile设置同时强制Internal Authentication基于角色的访问控制

您可以通过配置文件或命令行指定mongod设置。

Configuration File

如果对配置服务器副本集使用configuration file,则将security.keyFile设置为密钥文件的路径,将sharding.clusterRole设置为configsvr,并将replication.replSetName设置为配置服务器副本集的名称。

security:
  keyFile: <path-to-keyfile>
sharding:
  clusterRole: configsvr
replication:
  replSetName: <setname>
storage:
   dbpath: <path>

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

启动mongod,指定--config选项和配置文件的路径。

mongod --config <path-to-config>

Command Line

如果使用命令行参数,则对于配置服务器副本集,请使用-keyFile--configsvr--replSet参数启动mongod

mongod --keyFile <path-to-keyfile> --configsvr --replSet <setname> --dbpath <path>

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

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

重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。

对分片群集中的每个分片实施访问控制。

使用keyFile参数运行mongod会同时强制Internal Authentication基于角色的访问控制

使用配置文件或命令行在副本集中启动每个 mongod

Configuration File

如果使用configuration file,请将security.keyFile选项设置为密钥文件的路径,并将replication.replSetName选项设置为副本集的原始名称。

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <setname>
storage:
   dbPath: <path>

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

启动mongod,指定--config选项和配置文件的路径。

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

Command Line

如果使用命令行参数,请启动mongod并指定--keyFile--replSet参数。

mongod --keyfile <path-to-keyfile> --replSet <setname> --dbpath <path>

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

有关启动参数的更多信息,请参见mongod参考页。

重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。

重复此步骤,直到集群中的所有分片都处于联机状态。

创建分片本地用户 Management 员(可选)。

Important

Localhost Exception允许通过 localhost 接口连接的 Client 端在mongod强制访问控制上创建用户。创建第一个用户后,Localhost Exception关闭。

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

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

对于群集中的每个分片副本集,将_Shell 通过localhost interface连接到primary成员。您必须与目标mongod在同一台计算机上运行mongo才能使用 localhost 接口。

admin数据库上创建一个具有userAdminAnyDatabase角色的用户。该用户可以根据需要为分片副本集创建其他用户。创建此用户也会关闭Localhost Exception

下面的示例在admin数据库上创建本地本地用户fred

Important

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

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

对 mongos 服务器执行访问控制。

使用keyFile参数运行mongod会同时强制Internal Authentication基于角色的访问控制

使用配置文件或命令行在副本集中启动每个 mongos

Configuration File

如果使用configuration file,请将security.keyFile设置为密钥文件的路径,并将sharding.configDB设置为副本集的名称,并且副本集的至少一个成员应使用<replSetName>/<host:port>格式。

security:
  keyFile: <path-to-keyfile>
sharding:
  configDB: <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

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

启动mongos,指定--config选项和配置文件的路径。

mongos --config <path-to-config-file>

Command Line

如果使用命令行参数,请启动mongos并指定--keyFile--configdb参数。

mongos --keyFile <path-to-keyfile> --configdb <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

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

此时,整个分片群集都重新联机,并且可以使用指定的密钥文件在内部进行通信。但是,诸如mongo shell 之类的外部程序需要使用正确配置的用户才能读取或写入集群。

通过 localhost 接口连接到 mongos 实例。

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

localhost interface仅由于没有为部署创建用户而可用。 localhost interface在创建第一个用户后关闭。

创建用户 Management 员。

Important

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

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

如果至少一个用户没有创建用户的特权,那么在 localhost 异常关闭后,您将无法创建或修改用户,因此可能无法执行必要的操作。

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

Important

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

下面的示例在admin数据库上创建用户fred

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

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

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

使用db.auth()验证用户 Management 员身份以创建其他用户:

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

或者,使用-u <username>-p <password>--authenticationDatabase "admin"参数将新的mongo shell 连接到目标副本集成员。您必须使用Localhost Exception连接到mongos

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

为群集 Management 创建 Management 用户

集群 Management 员用户对分片集群具有clusterAdmin角色,而对分片本地集群 Management 员则不是。

下面的示例在admin数据库上创建用户ravi

Important

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

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

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

以集群 Management 员身份验证。

要执行分片操作,请使用db.auth()方法或具有usernamepasswordauthenticationDatabase参数的新mongo shell 作为clusterAdmin用户进行身份验证。

Note

这是分片群集的群集 Management 员,不是分片本地群集 Management 员。

启动平衡器。

启动平衡器。

sh.startBalancer()

使用sh.getBalancerState()验证平衡器已启动。

有关分片群集平衡器的教程,请参见Management 分片集群平衡器

创建其他用户(可选)。

创建用户以允许 Client 端连接和访问分片群集。请参阅数据库用户角色以获取可用的内置角色,例如readreadWrite。您可能还需要其他 Management 用户。有关用户的更多信息,请参见Users

要创建其他用户,您必须认证为具有userAdminAnyDatabaseuserAdmin角色的用户。

x.509 内部身份验证

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

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