为网络访问配置 MongoDB 服务
此步骤是可选的。
如果我们打算通过网络访问 MongoDB 数据库,那么我们必须执行以下配置。
默认情况下,MongoDB 服务在 localhost 接口上运行。
因此,为了使其可从网络访问,我们需要在所有接口上运行 MongoDB 服务。
使用 vim 编辑器编辑 MongoDB 配置文件
[root@mongodb-01 ~]# vi /etc/mongod.conf
在此文件中找到 bindIp 指令并将其设置为。
bindIp: 0.0.0.0
重新启动 MongoDB 服务使更改生效。
[root@mongodb-01 ~]# systemctl restart mongod.service
我们还需要在 Linux 防火墙中允许传入流量到 MongoDB 服务。
[root@mongodb-01 ~]# firewall-cmd --permanent --add-service=mongodb success [root@mongodb-01 ~]# firewall-cmd --reload success
我们现在可以从网络访问 MongoDB 数据库服务。
在 CentOS 8 中为 MongoDB 设置资源限制
我们需要根据 MongoDB 软件的要求在 CentOS 8 服务器中设置资源限制。
为此,为 MongoDB 创建一个资源限制配置文件,如下所示。
[root@mongodb-01 ~]# vi /etc/security/limits.d/mongod.conf
并其中添加以下资源限制。
mongod soft nproc 64000 mongod hard nproc 64000 mongod soft nofile 64000 mongod hard nofile 64000
在 CentOS 8 中安装 MongoDB Yum 存储库
我们可以从 MongoDB 下载页面下载我们需要的安装包。
https://mongodb.org/download
在这里,我们可以选择所需的 MongoDB 版本和目标操作系统,网站将为我们提供相应安装包的下载链接。
然后,我们可以使用 dnf 命令下载该 RPM 包并将其安装在 CentOS 8 服务器上。
但是,在 CentOS 8 服务器上安装 MongoDB 有更好的方法,例如:在 CentOS 8 中安装 MongoDB 官方 yum 存储库,然后使用 dnf 命令安装 MongoDB,我们在本安装教程中使用相同的方法。
使用 ssh 客户端以 root 用户身份登录到服务器 mongodb-01.onitroad.com 。
在 /etc/yum.repo.d 目录中创建一个 repo 文件,以在 CentOS 8 服务器中安装 MongoDB yum 存储库。
[root@mongodb-01 ~]# vi /etc/yum.repos.d/mongodb-org-4.2.repo
并在此文件中添加以下配置。
[mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
为 MongoDB yum 存储库构建缓存。
[root@mongodb-01 ~]# yum makecache CentOS-8 - AppStream 6.0 kB/s | 4.3 kB 00:00 CentOS-8 - Base 5.7 kB/s | 3.8 kB 00:00 CentOS-8 - Extras 2.9 kB/s | 1.5 kB 00:00 MongoDB Repository 4.7 kB/s | 6.6 kB 00:01 Metadata cache created.
我们已经在 CentOS 8 服务器中安装了 MongoDB yum 存储库。
MongoDB 数据和日志目录
以下是对 MongoDB 数据库管理员非常重要的两个目录。
- /var/lib/mongo - 数据目录(默认)
- /var/log/mongodb - 日志目录(默认)
我们可以通过在 /etc/mongodb.conf 文件中设置以下参数来自定义上述目录。
- storage.dbPath - 指定新的数据目录路径
- systemLog.path - 指定新的日志文件路径
在 MongoDB 服务器中启用访问控制
最初,MongoDB 服务器中禁用了访问控制。
因此,任何对 CentOS 8 服务器具有操作系统级别访问权限的用户都可以连接到 MongoDB 实例并对数据库执行管理操作。
这就是为什么我们能够在上一步中创建一个没有任何身份验证的管理员用户。
要为 MongoDB 服务器启用访问控制,我们需要编辑 mongod.service 的 systemd 单元文件。
[root@mongodb-01 ~]# vi /usr/lib/systemd/system/mongod.service
在此文件中找到以下行。
Environment="OPTIONS=-f /etc/mongod.conf"
并用以下行替换它。
Environment="OPTIONS=--auth -f /etc/mongod.conf"
我们已经使用文本编辑器显式编辑了 systemd 单元文件。
因此,我们需要执行以下命令来通知 systemd 此更改。
[root@mongodb-01 ~]# systemctl daemon-reload
重新启动 MongoDB 服务使更改生效。
[root@mongodb-01 ~]# systemctl restart mongod.service
要检查访问控制,请连接 MongoDB shell 并执行一些管理命令。
[root@mongodb-01 ~]# mongo MongoDB shell version v4.2.5 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("3526a97b-a0a1-47d2-91b1-0c15ef9f21e9") } MongoDB server version: 4.2.5 > use admin switched to db admin > show users 2020-04-13T15:11:54.161+0500 E QUERY [js] uncaught exception: Error: command usersInfo requires authentication : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.getUsers@src/mongo/shell/db.js:1638:15 shellHelper.show@src/mongo/shell/utils.js:883:9 shellHelper@src/mongo/shell/utils.js:790:15 @(shellhelp2):1:1
这次“show user”命令引发了身份验证错误,它确认我们的 MongoDB 服务器中已启用访问控制。
现在,以管理员用户身份连接。
> db.auth("admin",passwordPrompt()) Enter password: 1
现在,执行相同的命令,检查它是否正常工作。
> show users { "_id" : "admin.admin", "userId" : UUID("cefd30bd-2e83-4959-a47a-087a423806a0"), "user" : "admin", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }
已使用特权用户成功执行命令“show users”。
MongoDB 数据库的访问控制已启用。
在 CentOS 8 上安装 MongoDB 数据库
现在,我们可以从新添加的 yum 存储库在 CentOS 8 服务器上安装 MongoDB。
我们正在使用以下 dnf 命令安装 MongoDB 服务器的最新稳定版本。
[root@mongodb-01 ~]# dnf install -y mongodb-org
启用并启动 MongoDB 数据库服务。
[root@mongodb-01 ~]# systemctl enable --now mongod.service
成功启动后,检查 MongoDB 的状态是否有任何可能的错误。
[root@mongodb-01 ~]# systemctl status mongod.service
MongoDB 是一个开源的面向文档的 NoSQL 数据库管理系统。
MongoDB 是一个 NoSQL (Not Only SQL) 数据库软件。
MongoDB 使用 JSON(JavaScript Object Notation),就像带有架构的文档。
在本文中,我们将学习如何在 CentOS 8 服务器上安装 MongoDB。
在 CentOS 8 上为 MongoDB 创建 SELinux 策略
根据 MongoDB 文档,如果我们已将 SELinux 配置为强制模式,则必须为 MongoDB 创建 SELinux 策略。
检查当前的 SELinux 模式。
[root@mongodb-01 ~]# getenforce Enforcing
我们需要 checkpolicy 命令来验证自定义 SELinux 策略,因此我们使用 dnf 命令安装 checkpolicy 包。
[root@mongodb-01 ~]# dnf install -y checkpolicy
创建自定义 SELinux 策略文件。
[root@mongodb-01 ~]# vi mongodb_cgroup_memory.te
并其中添加以下指令。
module mongodb_cgroup_memory 1.0; require { type cgroup_t; type mongod_t; class dir search; class file { getattr open read }; } #============= mongod_t ============== allow mongod_t cgroup_t:dir search; allow mongod_t cgroup_t:file { getattr open read };
编译并应用此 SELinux 策略。
[root@mongodb-01 ~]# checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te [root@mongodb-01 ~]# semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod [root@mongodb-01 ~]# semodule -i mongodb_cgroup_memory.pp
在 MongoDB 中创建一个管理员用户
默认情况下,MongoDB 服务器中未启用访问控制,因此任何人都可以访问 MongoDB 服务器并执行管理操作。
因此,我们创建一个管理员用户并在我们的 MongoDB 服务器中启用访问控制非常重要。
如下连接 MongoDB shell。
[root@mongodb-01 ~]# mongo MongoDB shell version v4.2.5 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("195cc9ab-b18a-4edc-9fb0-1266e4d961af") } MongoDB server version: 4.2.5 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] 2020-04-13T12:38:08.219+0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2020-04-13T12:38:08.220+0500 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2020-04-13T12:38:08.220+0500 I CONTROL [initandlisten] -- Enable MongoDB's free cloud-based monitoring service, which will then receive and display metrics about your deployment (disk utilization, CPU, operation statistics, etc). The monitoring data will be available on a MongoDB website with a unique URL accessible to you and anyone you share the URL with. MongoDB may use this information to make product improvements and to suggest MongoDB products and deployment options to you. To enable free monitoring, run the following command: db.enableFreeMonitoring() To permanently disable this reminder, run the following command: db.disableFreeMonitoring() -- >
与管理数据库连接。
> use admin; switched to db admin
如下创建管理员用户。
> db.createUser( ... { ... user: "admin", ... pwd: "123", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
列出 MongoDB 数据库中的所有用户。
> show users { "_id" : "admin.admin", "userId" : UUID("cefd30bd-2e83-4959-a47a-087a423806a0"), "user" : "admin", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }
已成功创建 MongoDB 管理员用户。
退出 MongoDB shell。
> exit bye