Установка и подключение к MongoDB


Используемые термины: MongoDB, Ubuntu.
В данной инструкции мы рассмотрим процесс установки MongoDB на Linux Ubuntu (Debian). Также будут приведены примеры настройки подключения по сети, защита соединения с помощью шифрования и аутентификации.
Установка и запуск
Подключение по сети
Требования ввода логина и пароля
Включение шифрования
Работа с Mongo в скриптах
На PHP
На Python
Удаление СУБД из системы
Запуск в Docker
Читайте также
Установка
На странице MongoDB Community Downloads смотрим стабильные версии программного продукта. На момент обновления инструкции это была 4.4.
Обратите внимание, установка MongoDB возможна на большое число популярных операционных систем — Amazon, Debian, Ubuntu, macOS, CentOS, Red Hat, Windows и другие.
Переходим на страницу загрузки ключей для проверки подлинности репозитория. Копируем ссылку для версии MongoDB, которую мы планируем установить:
* в данном примере мы скопировали ссылку на ключ для версии 4.4. Обратите внимание, что также есть возможность загрузки ключей для более свежих и менее стабильных версий.
С помощью скопированной ссылки скачиваем и устанавливаем ключ:
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
Создаем файл для настройки репозитория Ubuntu:
vi /etc/apt/sources.list.d/mongodb-org.list
Добавляем строку:
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse
* focal — название релиза Ubuntu. В данном примере, версия 20.04. На данный момент возможны варианты:
- jammy: 22.04.
- focal: 20.04.
- bionic: 18.04.
- xenial: 16.04.
Посмотреть кодовое название для вашей системы можно командой:
cat /etc/os-release
Обновляем список пакетов:
apt update
Устанавливаем MongoDB:
apt 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
Установка завершена.
Доступ по сети
По умолчанию к установленной базе можно подключиться только с локального компьютера. Рассмотрим процесс настройки сетевого доступа.
Для начала, откроем порт в брандмауэре:
iptables -I INPUT -p tcp --dport 27017 -j ACCEPT
* по умолчанию, MongoDB работает на TCP-порту 27017.
В системах на базе Ubuntu и Debian брандмауэр работает по принципу разрешения. Если мы не меняли данной настройки, то нам не обязательно создавать разрешающее правило для Mongo.
Открываем конфигурационный файл СУБД:
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. Процесс его установки схож с установкой сервера. Рассмотрим пример для Ubuntu.
Устанавливаем ключ для репозитория:
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
Добавляем репозиторий:
vi /etc/apt/sources.list.d/mongodb-org.list
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse
* как в случае с сервером, focal — название релиза Ubuntu. В данном примере, версия 20.04. Другие варианты: bionic: 18.04, xenial: 16.04.
Обновляем список пакетов:
apt update
Устанавливаем клиентскую часть:
apt 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"
]
}
Выходим из командной оболочки:
> 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
Примеры подключения из языков программирования
Рассмотрим небольшие примеры для подключения к MongoDB из языков программирования PHP и Python.
PHP
Для возможности работы PHP с Mongo необходимо установить соответствующее расширение. Выполняем пошагово следующие действия:
apt install php-pear php-dev
pecl channel-update pecl.php.net
pecl install mongodb
Для каждого возможного варианта использования PHP необходимо создать отдельный конфигурационной файл. В данном примере, под php 7.4 для cli, php-fpm, apache.
В системах на базе RPM (например, CentOS или Red Hat), нет разделения php на версии. Таким образом, нам нужно будет создать только один файл (как правило, в каталоге /etc/php.d).
а) CLI
vi /etc/php/7.4/cli/conf.d/20-mongodb.ini
extension=mongodb.so
б) PHP-FPM
vi /etc/php/7.4/fpm/conf.d/20-mongodb.ini
extension=mongodb.so
Для применения настройки в php7.4-fpm перезапускаем его:
systemctl restart php7.4-fpm
в) APACHE
vi /etc/php/7.4/apache/conf.d/20-mongodb.ini
extension=mongodb.so
Для применения настройки в apache перезапускаем его:
systemctl restart apache2
Проверяем, что в php появился новый модуль:
php -m | grep mongodb
Мы должны увидеть:
mongodb
Создаем каталог для нашего скрипта:
mkdir /scripts
Создаем сам скрипт:
vi /scripts/test_mongo.php
- <?php
- $options['tls'] = true;
- $options['tlsAllowInvalidCertificates'] = true;
- $connection = new MongoDB\Driver\Manager("mongodb://root:test123@localhost", $options);
- $command = new MongoDB\Driver\Command(['ping' => 1]);
- $cursor = $connection->executeCommand('admin', $command);
- $result = $cursor->toArray();
- print_r($result);
- ?>
* в данном примере мы подключаемся к локальному серверу MongoDB, авторизовываемся под пользователем root с паролем test123. Также мы применяем шифрование для нашего подключения. В качестве примера мы выполняем запрос ping — для проверки подключения.
Запускаем скрипт на выполнение:
php /scripts/test_mongo.php
Мы должны получить такой вывод:
Array
(
[0] => stdClass Object
(
[ok] => 1
)
)
Python
Устанавливаем дополнительный компонент pymongo:
pip3 install pymongo
Создаем каталог для размещения нашего скрипта:
mkdir /scripts
Создаем сам скрипт:
vi /scripts/test_mongo.py
- #!/usr/bin/env python3
- # -*- encoding: utf-8 -*-
- from pymongo import MongoClient
- connection = MongoClient('mongodb://root:test123@localhost:27017/?tls=true&tlsAllowInvalidCertificates=true')
- result = connection.admin.command('ping')
- print(result)
* в данном примере мы подключаемся к локальному серверу MongoDB, авторизовываемся под пользователем root с паролем test123. Также мы применяем шифрование для нашего подключения. В качестве примера мы выполняем запрос ping — для проверки подключения.
Разрешаем запуск нашего файла на выполнение:
chmod +x /scripts/test_mongo.py
Запускаем наш скрипт:
/scripts/test_mongo.py
Получаем такой вывод:
{'ok': 1.0}
Удаление MongoDB с компьютера Ubuntu
Если необходимо удалить MongoDB с компьютера Ubuntu, выполняем пошагово следующие действия.
Останавливаем сервис:
systemctl stop mongod
Запрещаем его автозапуск:
systemctl disable mongod
Удаляем СУБД с компьютера:
apt remove mongodb-org*
При необходимости удалить данные, вводим:
rm -rf /var/lib/mongodb
rm -rf /var/log/mongodb
Docker
В данной инструкции мы не будем рассматривать процесс работы с MongoDB в докер, а просто опишем несколько простых команд для его запуска в контейнере.
Для начала, необходимо установить сам Docker. После можно скачать образ mongodb:
docker pull mongo
Для простого запуска используем команду:
docker run --name mongo-server -d mongo
* в данном примере мы поднимем контейнер из образа mongo с именем mongo-server.
Чтобы подключиться к консоли монго в докере, вводим команду:
docker exec -it mongo-server mongo