mongodb 集群启用内部认证

前言

这篇笔记是对英文原文 Enable Internal Authentication 的意译。

概述

在副本集和分片集群上启用认证后,其内部成员之间的访问就必须提供凭证以进行认证。

要为一个副本集或分片集群启用认证机制,就必须分别为每一个成员启用认证。对分片集群来说,这意味着要在每一个 mongos 和 mongod 上启用认证,包括配置服务器(config servers)和一个分片的副本集的每一个成员。

可以使用 keyfile 或 x.509 证书作为内部认证的凭证。本篇只讲 keyfile 认证。

有关使用 x.509 进行认证的细节,猛戳 Use x.509 Certificate for Membership Authentication

要从 keyfile 认证升级到 x.509 证书认证,猛戳 Upgrade from Keyfile Authentication to x.509 Authentication

要考虑的因素

访问控制(access control)

启用了内部认证就启用了访问控制。下面的教程假定在启用内部认证之前系统中还未创建任何用户,在启用访问控制后使用本机例外(Localhost Exception)来添加一个用户管理员( user administrator)。

当然,如果你喜欢,你可以在启用认证前就创建好用户。

分片集群(Sharded Cluster)

对于分片集群来说,Localhost Exception 会应用于每一个分片,除非你创建了管理用户(administrative user)或者在每一个分片上禁用了本地例外。

玩耍起来吧

  1. 创建 keyfile

    创建用于部署成员之间互相认证的 keyfile。使用 openssl 命令生成用作 keyfile 的伪随机(pseudo-random)数据:

    1
    2
    openssl rand -base64 741 > /srv/mongodb/mongodb-keyfile
    chmod 600 mongodb-keyfile

    你可以使用任何你选择的方式生成 keyfile,但必须确保存储在 keyfile 中的密码既长又有很高的随机性。以上面的方式使用 openssl 正有助于生成这样的 key。

  2. 为分片集群或副本集的每一个成员启用认证

    对于副本集中的每一个 mongod 或分片集群中的每一个 mongos 和 mongod(包括所有的配置服务器和分片),通过配置文件或命令行选项指定 keyfile。
    在配置文件中,设置security.keyFile选项:

    1
    2
    security:
    keyFile: /srv/mongodb/keyfile

    或者,启动组件时指定 –keyFile 选项:

    1
    mongod --keyFile /srv/mongodb/mongodb-keyfile --dbpath <path to data>

    至此,内部认证就启用了。

  3. 通过本机例外连接至 MongoDB 实例

    要使用本机例外添加第一个用户,需要

    • 对于副本集,通过 mongo shell 连接至主节点(the primary)
    • 对于分片集群,通过 mongo shell 连接至 mongos 节点
  4. 添加第一个用户

    添加一个角色为 userAdminAnyDatabase 的用户。例如,为 admin 数据库创建一个用户 myUserAdmin:

    1
    2
    3
    4
    5
    6
    7
    8
    use admin
    db.createUser(
    {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
    )

    一旦你创建了用户管理员,对于副本集来说,本机例外就不可用了。而对于分片集群来说,你必须仍然阻止对每个分片的未授权访问。按下述步骤之一对集群中的每一个分片进行设置:

    • 创建管理用户,或者
    • 在启动时禁用 Localhost Exception。要禁用本机例外,请将 enableLocalhostAuthBypass 设置为 0。
  5. 以用户管理员的身份被认证

    要么 连接一个新的 mongo shell 到 MongoDB 实例,使用选项 -u , -p , –authenticationDatabase

    1
    mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

    mongo shell 会在启动过程中执行一些命令。因此,当你以用户管理员身份登录进入时,你可以看到来自一个或多个命令的认证错误。你可以忽略这些错误,这正是我们所期望的,因为userAdminAnyDatabase 角色并没有权限运行某些启动命令(start up commands)。

    要么 连接 mongo shell 时不带认证信息,连接成功后切换至认证数据库(authentication database),使用 db.auth() 进行认证:

    1
    2
    use admin
    db.auth("myUserAdmin", "abc123" )
  6. 根据需要创建额外用户

0%