Установка и настройка MongoDB на CentOS

Используемые термины: MongoDB, CentOS, Rocky Linux.
В данной инструкции мы рассмотрим процесс установки MongoDB на Linux CentOS (Rocky Linux). Также будут приведены примеры настройки подключения по сети, защита соединения с помощью шифрования и аутентификации.
Установка
На странице MongoDB Community Downloads смотрим стабильные версии программного продукта. На момент обновления инструкции это была 6.0.4.
С версии 5.0 для работы mongo требуется, как минимум, процессоры с кодовыми названиями:
- Intel — Sandy Bridge (второе поколение Core i3, i5, i7) или Tiger Lake (поздние Celeron и Pentium). Выпускаются с 2009 года.
- AMD — Bulldozer (линейка FX и Opteron). Выпускаются с 2011 года.
При попытке запустить MongoDB на компьютерах, процессоры которых не соответствуют данным требованиям мы получим ошибку trap invalid opcode.
Если мы столкнулись с данной проблемой, устанавливаем Mongo версии 4.4 или меняем процессор.
Создаем файл для настройки репозитория:
vi /etc/yum.repos.d/mongodb-org.repo
Добавляем строки:
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
* обратите внимание, что в зависимости от устанавливаемой версии mongodb мы должны указать ее версию в директивах baseurl и gpgkey.
Устанавливаем MongoDB:
yum install mongodb-org
Стартуем сервис и разрешаем его автозапуск:
systemctl start mongod
systemctl enable mongod
Для подключения к СУБД вводим команду:
mongo
Можно для проверки ввести команду, которая покажет созданные базы данных:
> show databases;
После первой установки мы должны увидеть следующее:
admin 0.000GB
config 0.000GB
local 0.000GB
В качестве примера работы мы можем попробовать создать новую базу данных и коллекцию. Объекты в MongoDB создаются автоматически при первом к ним обращении.
Для создания базы просто обращается к ней:
> use newDB
* в данном примере будут создана база newDB.
Для создания коллекции, выполняем команду на вставку данных:
> db.newCollection.insertOne( { x: 1 } )
Выходим из оболочки SQL:
> exit
Установка завершена.
Доступ по сети
По умолчанию к установленной базе можно подключиться только с локального компьютера. Рассмотрим процесс настройки сетевого доступа.
Для начала, откроем порт в брандмауэре:
firewall-cmd --add-port=27017/tcp
firewall-cmd --add-port=27017/tcp --permanent
* по умолчанию, MongoDB работает на TCP-порту 27017.
Открываем конфигурационный файл СУБД:
vi /etc/mongod.conf
Находим директиву net и в ней опцию bindIp — добавляем IP-адрес, на котором наш сервер должен принимать запросы для MongoDB:
net:
port: 27017
bindIp: 127.0.0.1,192.168.1.15
* в нашем примере мы добавили к 127.0.0.1 адрес 192.168.1.15 — это сетевой адрес нашего сервера, на котором он должен принимать запросы.
Перезапускаем сервис mongod:
systemctl restart mongod
Чтобы проверить подключение, на другом компьютере должен быть установлен клиент для подключения к Mongo. Процесс его установки схож с установкой сервера. Рассмотрим пример для CentOS.
Сначала настраиваем репозиторий, как было рассказано выше.
И устанавливаем клиентскую часть:
yum install mongodb-org-shell
Теперь можно подключиться к нашему серверу:
mongo "mongodb://192.168.1.15:27017"
* в данном примере мы подключаемся к серверу MongoDB 192.168.1.15.
Также мы можем использовать MongoDB Compass — это приложение под Windows, Linux и macOS для работы с базой Mongo в графическом интерфейсе. Скачать его можно на странице официального сайта.
Аутентификация
По умолчанию, мы можем подключиться к СУБД без авторизации. Если нам необходимо повысить безопасность работы с базой, можно требовать ввода логина и пароля.
Заходим в командную оболочку Mongo:
mongo
Подключаемся к базе admin:
> use admin
Создаем пользователя, под которым будем авторизовываться:
> db.createUser({user:"root", pwd:passwordPrompt(), roles:[{role:"userAdminAnyDatabase", db:"admin"}, "readWriteAnyDatabase"]})
* в данном примере мы создадим пользователя с административными правами. Логин root, пароль будет запрошен после ввода.
Придумываем и вводим пароль
Enter password:
После создания пользователя мы должны увидеть, примерно, следующую картину:
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
Чтобы создать пользователя с доступом к определенной базе, подключаемся к ней:
> use newDB
И используем команду:
> db.createUser({user:"dmosk", pwd:passwordPrompt(), roles:[{role:"readWrite", db:"newDB"}]})
* мы создадим пользователя dmosk с полными правами на базу newDB.
Для просмотра списка созданных пользователей нужно подключиться к базе admin и выполнить запрос find:
> use admin
> db.system.users.find()
Выходим из командной оболочки:
> exit
Открываем конфигурационный файл:
vi /etc/mongod.conf
Находим директиву security и задаем параметр authorization:
security:
authorization: enabled
Перезапускаем сервис mongod:
systemctl restart mongod
Теперь пробуем подключиться к mongo. Мы можем авторизоваться несколькими способами.
а) Авторизация при подключении:
mongo --authenticationDatabase "admin" -u "root" -p
* в данном примере мы подключимся к базе под пользователем root. Пароль будет запрошен системой после ввода команды.
б) Авторизация после подключения:
> use admin
> db.auth("root", passwordPrompt())
SSL
Теперь усилим безопасность, зашифровав передачу данных. Для этого нам понадобиться сертификат. В нашем примере, мы будем использовать самоподписанный сертификат, но в продуктивной среде, лучше его купить или запросить у Let's Encrypt.
Создаем каталог, в котором разместим наши сертификаты:
mkdir -p /etc/ssl/mongodb
Сгенерируем самоподписанный сертификат:
openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mongodb/cert.pem -keyout /etc/ssl/mongodb/cert.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=mongo.dmosk.local/CN=mongo"
Выставим в качестве владельца на файлы сертификата пользователя mongodb:
chown mongodb:mongodb /etc/ssl/mongodb/cert.pem
Открываем конфигурационный файл СУБД:
vi /etc/mongod.conf
В директиву net дописываем опции TLS:
net:
...
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb/cert.pem
* в данном примере мы указали необходимость шифрования данных при передаче, а также путь до сгенерированного нами сертификата.
Перезапускаем сервис mongod:
systemctl restart mongod
Для подключения к базе с использованием шифрования используем команду:
mongo --tls --tlsAllowInvalidCertificates
* в данном примере мы указываем при подключении использовать шифрование с использованием TLS. Опция tlsAllowInvalidCertificates говорит, что клиент должен принять неправильный сертификат (так как у нас он самоподписанный).
Так как у нас еще настроена аутентификация, для подключения введем такую команду:
mongo --tls --tlsAllowInvalidCertificates --authenticationDatabase "admin" -u "root" -p
Для подключения к нашему серверу по сети, полная команда будет такой:
mongo "mongodb://192.168.1.15:27017" --tls --tlsAllowInvalidCertificates --authenticationDatabase "admin" -u "root" -p