Установка и защита MongoDB в Ubuntu 16.04
MongoDB – это свободная и открытая документо-ориентированная база данных. MongoDB относится к базам данных NoSQL, поскольку использует не традиционную реляционную структуру, а JSON-подобные документы с динамическими схемами. В отличие от реляционных баз данных, MongoDB не требует заранее определить схему данных. Напротив, вы можете изменить схему в любой момент, и вам не придётся устанавливать новую БД с обновленной схемой.
Данное руководство поможет установить последнюю доступную версию MongoDB, настроить аутентификацию пользователей и защитить удалённые подключения к БД.
Требования
- Сервер Ubuntu 16.04.
- Пользователь с доступом к sudo (вся работа выполняется в его сессии).
- Настроенный брандмауэр.
Всю необходимую информацию вы найдёте в руководстве по начальной настройке сервера.
1: Установка MongoDB
Репозиторий MongoDB
База данных MongoDB включена в репозиторий пакетов Ubuntu, но официальный репозиторий MongoDB предлагает более актуальную версию. Итак, для начала нужно добавить официальный репозиторий.
Ubuntu проверяет подлинность пакетов программного обеспечения с помощью ключей GPG. Импортируйте ключ официального репозитория MongoDB.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
Ключ успешно импортирован, если на экране вы видите:
Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
Теперь нужно добавить репозиторий MongoDB, чтобы пакетный менеджер apt мог загружать из него пакеты. Введите:
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
Обновите список пакетов:
sudo apt-get update
Установка MongoDB
Установите метапакет mongodb-org, который включает в себя демон, конфигурационные сценарии и сценарии инициализации, оболочку и инструменты управления.
sudo apt-get install mongodb-org
По запросу нажмите Enter или Y. После установки запустите демон Mongo:
sudo systemctl start mongod
Поскольку systemctl не выводит результат этой команды, нужно запросить состояние демона, чтобы убедиться, что он запущен.
sudo systemctl status mongod
mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
Docs: https://docs.mongodb.org/manual
Main PID: 2811 (mongod)
Tasks: 17
Memory: 56.8M
CPU: 7.294s
CGroup: /system.slice/mongod.service
└─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf
Чтобы выйти, нажмите q. Теперь нужно настроить автозапуск демона при загрузке сервера:
sudo systemctl enable mongod
Если команда выполнена успешно, вы увидите:
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.
2: Безопасность MongoDB
Более ранние версии MongoDB были уязвимы к автоматизированным атакам, поскольку по умолчанию для взаимодействия с БД не нужна была аутентификация. Любой пользователь мог создать или удалить БД, читать и изменять данные. Кроме того, демон MongoDB по умолчанию прослушивал все интерфейсы, что позволяло вредоносным ботам обнаружить все экземпляры MongoDB, не защищенные брандмауэром, и получить полный доступ к данным, если не требовалась аутентификация.
Эти уязвимости были частично устранены в релизе 3.х (и некоторых более ранних версиях, предоставленных менеджерами пакетов). Теперь демон привязан к локальному интерфейсу (127.0.0.1), а значит, он принимает соединения только на Unix-сокет, который не имеет автоматического доступа в Интернет.
Однако аутентификация по умолчанию все ещё отключена, и все пользователи локальной системы имеют полный доступ к базам данных. Чтобы устранить эту уязвимость, создайте пользователя с правами администратора и включите аутентификацию.
Создание администратора
Чтобы добавить пользователя, подключитесь к оболочке Mongo.
mongo
В выводе вы увидите предупреждение, что контроль доступа отсутствует, то есть доступ к базе данных и конфигурациям ничем не ограничен.
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
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:
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
>
На данном этапе вы можете выбрать имя администратора (уровень привилегий изменится после присвоения роли userAdminAnyDatabase). База данных admin определяет, где хранятся учетные данные.
Примечание: Узнать больше об аутентификации MongoDB можно в документации проекта.
Выберите имя администратора и надёжный пароль:
use admin
db.createUser(
{
user: "Admin8host",
pwd: "Admin8host'sSecurePassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
Примечание: Замените Admin8host и Admin8host’sSecurePassword именем и паролем вашего администратора.
При выполнении команды db.createUser оболочка будет добавлять три точки в каждую строку, пока команда не будет выполнена. После этого вы получите примерно такой вывод:
> use admin
switched to db admin
> db.createUser(
... {
... user: "Admin8host",
... pwd: "Admin8host'sSecurePassword",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "Admin8host",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
Чтобы закончить работу с клиентом, введите exit и нажмите ENTER или CTRL+C.
На данный момент у вас есть пользователь, который имеет учётные данные. Но пока что MongoDB не запрашивает учётных данных. Теперь нужно настроить аутентификацию и перезапустить демон MongoDB.
Настройка аутентификации
Аутентификация настраивается в файле mongod.conf. После настройки нужно перезагрузить mongod, и тогда пользователи должны будут предоставить имя и пароль, чтобы получить возможность взаимодействовать с данными.
Откройте конфигурационный файл:
sudo nano /etc/mongod.conf
Найдите раздел #security и удалите # в начале строки, чтобы активировать настройки. Затем нужно добавить параметры аутентификации, которые выглядят следующим образом:
. . .
security:
authorization: "enabled"
. . .
Важно! В начале строки security нет пробелов, но в начале строки authorization должно быть два пробела.
Сохраните и закройте файл. Перезапустите демон:
sudo systemctl restart mongod
Если в конфигурации была допущена ошибка, демон не сможет запуститься. Утиилита systemctl не отображает вывод некоторых команд; чтобы убедиться, что демон запустился, используйте команду status:
sudo systemctl status mongodb
Если в выводе вы видите строку Active: active (running), значит, демон перезапустился успешно.
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.
Тестирование аутентификации
Попробуйте подключиться к БД без учётных данных.
mongo
После включения аутентификации все предупреждения исчезают:
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Вы подключились к БД test. Теперь попробуйте запустить какую-нибудь команду:
show dbs
2017-02-21T19:20:42.919+0000 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
. . .
Вы не сможете создать пользователя или запустить задачу без аутентификации. Теперь нужно протестировать администратора.
Проверка доступа администратора
Чтобы открыть сессию администратора, используйте опцию –u (задает имя пользователя) и –p (задаёт пароль). Также нужно добавить –authenticationDatabase, чтобы указать БД, в которой хранятся учётные данные.
mongo -u Admin8host -p --authenticationDatabase admin
По запросу программы предоставьте пароль. После этого вы попадёте в оболочку, в которой можно запустить команду:
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
>
Эта команда выведет доступные базы данных:
show dbs
admin 0.000GB
local 0.000GB
Чтобы выйти, введите exit или нажмите CTRL+C.
Читайте также:
3: Удалённый доступ к MongoDB (опционально)
В идеале базу данных MongoDB нужно блокировать внешним брандмауэром, который, в свою очередь, защищён с помощью виртуальной частной сети (VPN) или хоста-бастиона. Мы используем менее сложную настройку: настроим брандмауэр и разблокируем доступ к БД для заведомо безопасных хостов.
Включение UFW
Если вы следовали руководству по начальной настройке, вы уже включили брандмауэр UFW, который на данный момент поддерживает только соединения SSH. Прежде чем открыть порт для клиентов, проверьте состояние брандмауэра:
sudo ufw status
Примечание: Если по какой-либо причине брандмауэр не включен (inactive), запустите команду:
sudo ufw enable
Снова запросите состояние. При необходимости разблокируйте SSH.
sudo ufw allow OpenSSH
Команда sudo ufw status должна вернуть примерно следующее:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Разблокируйте стандартный порт MongoDB, 27017, но ограничьте доступ по ip, чтобы разрешить доступ только заведомо безопасным клиентам.
sudo ufw allow from client_ip_address to any port 27017
Чтобы добавить другие клиенты, запустите эту команду повторно, указав ip клиента. Чтобы убедиться, что доступ разблокирован, проверьте состояние брандмауэра:
sudo ufw status
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW client_ip_address
OpenSSH (v6) ALLOW Anywhere (v6)
Читайте также: Основы UFW: общие правила и команды фаервола
Настройка bindIP
Чтобы разрешить удаленные подключения, добавьте внешний IP-адрес хоста в файл mongod.conf .
sudo nano /etc/mongod.conf
В разделе net найдите строку bindIp и добавьте в неё IP хоста Mongo.
. . .
net:
port: 27017
bindIp: 127.0.0.1,IP_of_MongoHost
. . .
Сохраните и закройте файл.
Перезапустите демон:
sudo systemctl restart mongod
Убедитесь, что демон перезапустился без ошибок:
sudo systemctl status mongodb
Если всё прошло успешно, в выводе будет строка Active: active (running).
Тестирование удалённых подключений
Теперь нужно убедиться, что Mongo прослушивает открытый интерфейс. Для этого нужно добавить флаг –host и указать IP-адрес из файла mongodb.conf.
mongo -u Admin8Host -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2
Если вы получили доступ к этой строке, демон прослушивает внешний IP. На данный момент все транзакции между удалённым сервером и хостом MongoDB не зашифрованы. Чтобы исправить это, обратитесь к документации MongoDB.
Заключение
Теперь вы умеете устанавливать MongoDB, обеспечивать безопасность данных и настраивать поддержку удалённых соединений.
Другие статьи о MongoDB вы найдёте в специальном разделе нашего Информатория.
Tags: MongoDB, NoSQL, Ubuntu 16.04, UFW
1 комментарий
Спасибо.