验证 mongodb 副本集

Authenticate mongodb replica set

我有 4 个 mongodb 运行ning(副本集)实例,每个实例都有以下 mongodb.conf 文件:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /root/mongodata/log/mongod.log

# Where and how to store data.
storage:
  dbPath: /root/mongodata/db1 # also have db2 and so on for rest of the instances
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /root/mongodata/db1/mongod.pid  # location of pidfile, different for 4 instances

# network interfaces
net:
  port: 30000 #port different for 4 different instances
  bindIp: 12.123.321.432(example ip, same for all 4 .conf files) 

# security  
security:
  KeyFile: /path to my keyfile location

#  authorization: enabled

#operationProfiling:

replication:
  replSetName: testReplica #have this same for all 4


#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

我还创建了一个用于内部身份验证的密钥文件,如下所示:

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

所有实例都运行ning后我打开mongoShell如下:

mongo --host 12.123.321.432 --port 30000

我可以打开 shell 但是当我尝试创建用户时,出现以下异常:

2016-12-22T20:55:38.396-0500 E QUERY    [thread1] Error: couldn't add user: not authorized on test to execute command { createUser: "root", pwd: "xxx", roles: [ { role: "root", db: "admin" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } :
_getErrorWithCode@src/mongo/shell/utils.js:23:13
DB.prototype.createUser@src/mongo/shell/db.js:1230:11
@(shell):1:1

我试过切换到管理数据库,但仍然说未授权,我也试过 运行 rs.initiate() 命令来定义主数据库和辅助数据库,说未授权。我读过,即使我在禁用身份验证的情况下启动 mongod,通过 keyfile 的内部身份验证也会强制进行基于角色的身份验证。我在这里错过了什么,我将如何解决?提前致谢。

错误信息显示您没有执行该命令的权限。

.conf文件中设置keyfile参数后,mongo需要使用auth用户登录。

所以如果你没有root用户。

  1. 启动 mongod 没有授权配置(不要设置 keyfile 并禁用 security.authorization
  2. 创建使用 root 角色
db.createUser({user:"root",pwd:"rootpassword",roles:[{role:"root",db:"admin"}]})

如果您有 root 用户,您应该使用 db.auth() 或以 root 权限登录 mongo,以执行 rs.conf() 命令。

mongo --port portnumber -u root -p --authenticationDatabase admin

或使用命令登录后 mongo --port portnumber

db.auth("root", "rootpassword")

ps。 KeyFile用于副本集内部通信安全。