首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在启用mongod.conf中的安全性后恢复

在启用mongod.conf中的安全性后恢复
EN

Stack Overflow用户
提问于 2019-10-17 15:46:25
回答 1查看 544关注 0票数 0

创建了2个具有3个节点副本集的碎片。

启用mongod.conf文件中的安全性后,每个节点都处于恢复状态。但是,如果禁用/注释掉mongod.conf文件中的节点,则节点是正常的。

所有节点都运行在AWS上。

操作系统: CentOS 7

Mongodb版本: 3.6.2

背景:在启用安全性之前,我创建了一个用户,如下所示。

代码语言:javascript
复制
db.createUser( { user: "cxiroot",
                 pwd: "root",
                  roles: [ { role: "root", db: "admin" }] },
               { w: "majority" , wtimeout: 5000 } );

我可以验证,db.auth("cxiroot","root")

启用安全性和重新启动服务之后,所有节点都处于恢复状态。

基本上,我试图通过启用安全性来实现db.shutdownServer()

日志报告:

代码语言:javascript
复制
2019-10-17T11:40:23.138-0400 I REPL_HB  [replexec-1] Error in heartbeat (requestId: 1934) to 109.99.16.36:27018, response status: Unauthorized: not authorized on admin to execute command { replSetHeartbeat: "shard1rs", configVersion: 4, hbv: 1, from: "109.99.16.112:27018", fromId: 1, term: 128, $replData: 1, $clusterTime: { clusterTime: Timestamp(1571326818, 1), signature: { hash: BinData(0, 466B43AC8CDFBE9B5CBEA8AC4860925560B63296), keyId: 6745513220909301779 } }, $db: "admin" }
2019-10-17T11:40:23.150-0400 I ACCESS   [conn2] Unauthorized: not authorized on admin to execute command { replSetHeartbeat: "shard1rs", configVersion: 4, hbv: 1, from: "109.99.16.137:27018", fromId: 2, term: 128, $replData: 1, $clusterTime: { clusterTime: Timestamp(1571326818, 1), signature: { hash: BinData(0, 466B43AC8CDFBE9B5CBEA8AC4860925560B63296), keyId: 6745513220909301779 } }, $db: "admin" }

mongod.conf

代码语言:javascript
复制
systemLog:
  destination: file
  logAppend: true
  path: /mongodb/data/logs/mongod.log

storage:
  dbPath: /mongodb/data/db
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27018
  bindIp: x.x.x.x

security:
  authorization: 'enabled'

replication:
 replSetName: shard1rs

sharding:
 clusterRole: shardsvr

是什么引起了这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-18 17:38:11

编辑2019-10-22:

OP要求更改端口以反映MongoDB建议。要从MongoDB那里找到任何建议,需要花点时间。对于所有现代版本(即3.6或更高版本),没有推荐的具体端口。但是,回到3.0docs,配置服务器的默认端口被记录为27019。https://docs.mongodb.com/v3.0/tutorial/deploy-shard-cluster/。查看Ops默认部署,我们看到碎片副本集默认为端口27018。

我假设选择这些端口是为了保护那些正在编写连接字符串和使用数据库的开发人员避免意外地直接连接到副本集,并绕过MongoDB路由器MONGOS。好吧,下面我分别换了端口.

下面是在AWS上设置10台主机以运行2片切分集群的说明。这些说明只描述硬件设置,而不描述如何选择适当的碎片键来应用于数据。指令设置硬件,但没有数据。服务器的分类如下..。

1位寄主为MONGOS

3主机的碎片配置服务器副本集-每个主机有一个MONGOD安装。

3主机的shard0副本集-每个主机有一个MONGOD安装。

3主机的shard1副本集-每个主机有一个MONGOD安装。

此设置假定将使用密钥文件进行内部身份验证。密钥文件是存储在所有10台主机上的文件中的共享秘密。当使用keyfile身份验证时,将密钥文件视为密码。它应该受到保护。

生成一个密钥文件:

代码语言:javascript
复制
openssl rand -base64 741 > mykeyfile

为了本教程的考虑,假设生成的密钥文件是..。

代码语言:javascript
复制
bgi+xXyBAHtNXmQnTjDNrSyTa+I9SGQXbBZONHRxHxKw2y/M3kGtpiJCVCyI+bDk
bXKTHnejIGXcyl7Ykc812DHEEngmqw63HfPxsUHFiDZ8FiwU/5X7W/T9lgKk9SoV
ybIL8+EBjSPvWDa9JWgVKrJFYqG0IejSyrO+js9os6n9kq5kneNOYjnovJwS9MgM
euENHfzTJ2XItcMWtcMilMoXd4Pm9VQgkW8i+Cb9hhQcwm1yA/wT7Tr04l6Pgq74
wQgp5MlYXLmlOGMhsTFGgBv4eVfKVR/r3zr2nshLowpBR6CiX098TO/+mZIGIM54
CoULxBlLBxngSXOWH86tvG05YvrjtAOaiDnHFm59fYKmT1+jfecx/NHOT4Cn1bfO
2q4cpGma3Cy2iRHuEdrm8zV1wvx94x0bLIEttiO4qelb32HLZM9MaL+lKodwhfko
A/3Bcx6+c1tTFtCE2sd5xpAngw6oMKau3nfynQgxgvnLrymCW4Hxqj3ew7F1ShYp
OAskY5/qu+ruad0VO9gqM2PHtsPrVHgkO8zBn+twtpYMOvdTE4M4vYMxA14vxkLA
FrELT/TqYmCPSO8pVS8tu12nADEkRUYRK+LqYKXsogl2FolnvYPLsiw4g9psQw4x
2CmJsEVYel1sl3cxq21Sgd+uO9nyWuNEaKBkYOOgLw67xg6xkGWBrLkg3gC840eI
JE0eOJfDLl+EkF1CUubKv8JB7bxK6kwnoTkfd2OGEHqLGQbV/hP6Gpni4gnqoNlp
65meHn2djSUGWu3wS7m5NRjCqICRTbOQs4K/ugM2hVu4e4dZV0RDt/FOF3u+6Anv
G8X5/GqWDvoIJ4WCvPyqVQoAyDG6S5DiSMmhlwCJUaXu0gFn7NuDPEtC8KAzHK75
qOmsTddIhSSs3fjmPm3wKAxyf2r5/6oBIjMq3vN8ahi+NLa+Vz+8VMRa+ajvE4ws
HPAh7P5iar4u9Uu2WE/J0WvGM88p

我使用上面的命令生成了这个结果。它是随机的,只用于本教程。

安装MongoDB:

此示例使用MongoDB企业。此版本需要从MongoDB购买的许可证。若要使用社区版本,请更改回购定义。

本例假设AWS主机是AMI2 Amazon。

在所有10台主机上运行此命令。

代码语言:javascript
复制
echo '[mongodb-enterprise]
name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/amazon/2/mongodb-enterprise/4.0/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc' | sudo tee /etc/yum.repos.d/mongodb-enterprise.repo

sudo yum -y install mongodb-enterprise

将密钥文件分发给所有主机:

在所有10个AWS主机上发出以下命令..。

代码语言:javascript
复制
echo "bgi+xXyBAHtNXmQnTjDNrSyTa+I9SGQXbBZONHRxHxKw2y/M3kGtpiJCVCyI+bDk
bXKTHnejIGXcyl7Ykc812DHEEngmqw63HfPxsUHFiDZ8FiwU/5X7W/T9lgKk9SoV
ybIL8+EBjSPvWDa9JWgVKrJFYqG0IejSyrO+js9os6n9kq5kneNOYjnovJwS9MgM
euENHfzTJ2XItcMWtcMilMoXd4Pm9VQgkW8i+Cb9hhQcwm1yA/wT7Tr04l6Pgq74
wQgp5MlYXLmlOGMhsTFGgBv4eVfKVR/r3zr2nshLowpBR6CiX098TO/+mZIGIM54
CoULxBlLBxngSXOWH86tvG05YvrjtAOaiDnHFm59fYKmT1+jfecx/NHOT4Cn1bfO
2q4cpGma3Cy2iRHuEdrm8zV1wvx94x0bLIEttiO4qelb32HLZM9MaL+lKodwhfko
A/3Bcx6+c1tTFtCE2sd5xpAngw6oMKau3nfynQgxgvnLrymCW4Hxqj3ew7F1ShYp
OAskY5/qu+ruad0VO9gqM2PHtsPrVHgkO8zBn+twtpYMOvdTE4M4vYMxA14vxkLA
FrELT/TqYmCPSO8pVS8tu12nADEkRUYRK+LqYKXsogl2FolnvYPLsiw4g9psQw4x
2CmJsEVYel1sl3cxq21Sgd+uO9nyWuNEaKBkYOOgLw67xg6xkGWBrLkg3gC840eI
JE0eOJfDLl+EkF1CUubKv8JB7bxK6kwnoTkfd2OGEHqLGQbV/hP6Gpni4gnqoNlp
65meHn2djSUGWu3wS7m5NRjCqICRTbOQs4K/ugM2hVu4e4dZV0RDt/FOF3u+6Anv
G8X5/GqWDvoIJ4WCvPyqVQoAyDG6S5DiSMmhlwCJUaXu0gFn7NuDPEtC8KAzHK75
qOmsTddIhSSs3fjmPm3wKAxyf2r5/6oBIjMq3vN8ahi+NLa+Vz+8VMRa+ajvE4ws
HPAh7P5iar4u9Uu2WE/J0WvGM88p" | sudo tee /var/run/mongodb/mykeyfile

sudo chown mongod.mongod /var/run/mongodb/mykeyfile
sudo chmod 400 /var/run/mongodb/mykeyfile

设置Config服务器:

选择3个AWS实例作为配置服务器。在这三台主机上运行以下命令..。

代码语言:javascript
复制
sudo rm /etc/mongod.conf


echo "systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27019
  bindIp: 0.0.0.0

security:
  keyFile: /var/run/mongodb/mykeyfile

replication:
  replSetName: configrs

sharding:
  clusterRole: configsvr
" | sudo tee /etc/mongod.conf


sudo systemctl start mongod

在最终的配置服务器登录到mongo ..。

代码语言:javascript
复制
mongo

并启动复制集。此示例使用我的AWS实例中的主机名。更改主机名以匹配您的主机名。注意,副本集的名称是configrs

代码语言:javascript
复制
rs.initiate(
    {
        _id: "configrs",
        version: 1,
        members: [
            { _id: 0, host: "ip-172-31-27-98.us-west-2.compute.internal:27019" },
            { _id: 1, host: "ip-172-31-17-202.us-west-2.compute.internal:27019" },
            { _id: 2, host: "ip-172-31-19-63.us-west-2.compute.internal:27019" }
        ]
    }
)

添加凭据以允许根级访问管理。如果提示符是'SECONDARY',那么等待大约1分钟。通过发出命令use admin进行测试。继续等待,直到它说'PRIMARY'。如果它从来没有说'PRIMARY',你有问题,不能继续。

代码语言:javascript
复制
use admin
db.createUser({user: "barry", pwd: "mypassword", roles: [{role: "root", db: "admin"}]})
db.auth("barry", "mypassword")

配置Shard0:

为shard0确定另外3台主机。

在所有3台主机上运行以下命令.

代码语言:javascript
复制
sudo rm /etc/mongod.conf

echo "systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27018
  bindIp: 0.0.0.0

security:
  keyFile: /var/run/mongodb/mykeyfile

replication:
  replSetName: shard0

sharding:
  clusterRole: shardsvr
" | sudo tee /etc/mongod.conf


sudo systemctl start mongod

最后的主机登录到芒果壳..。

代码语言:javascript
复制
mongo

启动复制集。注意复制集名称shard0。用你的名字代替主机名..。

代码语言:javascript
复制
rs.initiate(
    {
        _id: "shard0",
        version: 1,
        members: [
            { _id: 0, host: "ip-172-31-21-228.us-west-2.compute.internal:27018" },
            { _id: 1, host: "ip-172-31-17-221.us-west-2.compute.internal:27018" },
            { _id: 2, host: "ip-172-31-17-145.us-west-2.compute.internal:27018" }
        ]
    }
)

..。创建根用户..。

代码语言:javascript
复制
use admin
db.createUser({user: "barry", pwd: "mypassword", roles: [{role: "root", db: "admin"}]})
db.auth("barry", "mypassword")

配置shard1:

为shard1选择3台剩余主机,并将这些设置应用于所有3台.

代码语言:javascript
复制
sudo rm /etc/mongod.conf

echo "systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27018
  bindIp: 0.0.0.0

security:
  keyFile: /var/run/mongodb/mykeyfile

replication:
  replSetName: shard1

sharding:
  clusterRole: shardsvr
" | sudo tee /etc/mongod.conf


sudo systemctl start mongod

在这3的决赛开始芒果壳..。

代码语言:javascript
复制
mongo

..。并初始化副本集。注意复制集名称shard1。用你的名字代替主机名..。

代码语言:javascript
复制
rs.initiate(
    {
        _id: "shard1",
        version: 1,
        members: [
            { _id: 0, host: "ip-172-31-30-65.us-west-2.compute.internal:27018" },
            { _id: 1, host: "ip-172-31-17-88.us-west-2.compute.internal:27018" },
            { _id: 2, host: "ip-172-31-23-140.us-west-2.compute.internal:27018" }
        ]
    }
)

在最后的3创建一个根用户..。

代码语言:javascript
复制
use admin
db.createUser({user: "barry", pwd: "mypassword", roles: [{role: "root", db: "admin"}]})
db.auth("barry", "mypassword")

设置芒果:

在为MONGOS路由器保留的最后主机上,创建MONGOS配置文件。将引用上的主机名更改为配置服务器,以与您的实现匹配。

代码语言:javascript
复制
echo "systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongos.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  bindIp: 0.0.0.0
  port: 27017

sharding:
  configDB: configrs/ip-172-31-27-98.us-west-2.compute.internal:27019,ip-172-31-17-202.us-west-2.compute.internal:27019,ip-172-31-19-63.us-west-2.compute.internal:27019

security:
  keyFile: /var/run/mongodb/mykeyfile
" | sudo tee /etc/mongos.conf

创建systemd脚本,使用用户“mongod”启动MONGOS。

代码语言:javascript
复制
echo '[Unit]
Description=MongoDB Database Server Router
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongos.conf"
EnvironmentFile=-/etc/sysconfig/mongos
ExecStart=/usr/bin/mongos $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongos.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target
' | sudo tee /usr/lib/systemd/system/mongos.service

重新加载systemctl守护进程并启动MONGOS。

代码语言:javascript
复制
sudo systemctl daemon-reload
sudo systemctl start mongos

如果您希望手动启动MONGOS而不是使用systemd脚本,请使用以下命令.这是可选的。

代码语言:javascript
复制
sudo -u mongod mongos -f /etc/mongos.conf 

在主机上登入芒果壳并进行认证.

代码语言:javascript
复制
mongo
use admin
db.auth("barry", "mypassword")

初始化切分。只需要一个主机。蒙戈会发现碎片中的所有其他宿主。更改主机名以匹配您的..。

代码语言:javascript
复制
sh.addShard("shard0/ip-172-31-21-228.us-west-2.compute.internal:27018") 
sh.addShard("shard1/ip-172-31-30-65.us-west-2.compute.internal:27018")

查看切分的状态..。

代码语言:javascript
复制
sh.status()

此时准备分片。没有关于这些主机的数据。没有数据库或集合被要求分解。没有建立碎片钥匙。这些指令仅仅用于使用密钥文件内部身份验证来设置硬件。请参阅MongoDB数据库切分说明

结论:

如果我们使用keyfile内部身份验证,整个集群需要用户授权来执行任务。系统管理员可以选择为用户实现SCRAM-SHA用户名/密码身份验证机制,也可以使用基于x.509证书的身份验证或其他认证。如果您的集群没有使用任何安全性,应用密钥文件内部身份验证可能会引起意外,因为现在需要客户端身份验证。我的测试表明,如果在定义密钥文件时应用authorization: 'enabled',则行为没有任何变化。示例:

代码语言:javascript
复制
security:
  keyFile: /var/run/mongodb/mykeyfile

..。表现得和..。

代码语言:javascript
复制
security:
  keyFile: /var/run/mongodb/mykeyfile
  authorization: 'enabled'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58436363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档