Защита MongoDB в Ubuntu 20.04

MongoDB (или просто Mongo) – это свободная и открытая документная база данных, которая используется преимущественно в современных веб-приложениях. Она относится к базам NoSQL, потому что она не использует традиционную табличную структуру, как в реляционных базах данных.

Читайте также: Модели и системы управления базами данных NoSQL

В MongoDB по умолчанию не включена аутентификация, а это означает, что добавлять и удалять данные может абсолютно любой пользователь, имеющий доступ к серверу, на котором установлена БД. Чтобы устранить эту уязвимость, мы расскажем, как создать администратора и включить аутентификацию. Затем мы убедимся, что только администратор имеет доступ к базе данных.

Требования

  • Сервер Ubuntu 20.04 с брандмауэром UFW и пользователем sudo. Инструкции по настройке вы найдете здесь.
  • Установка MongoDB. В работе мы использовали версию 4.4, но в целом этот мануал подходит и на более старых версиях. Установить Mongo вам поможет этот мануал.

1: Создание администратора

Начиная с версии 3.0, демон MongoDB по умолчанию принимает подключения только из локального сокета Unix и автоматически не открывается для широкого доступа в интернете. Однако аутентификация по-прежнему отключена по умолчанию. А это значит, что все пользователи, имеющие доступ к серверу, на котором установлена БД MongoDB, также имеют полный доступ к данным.

Чтобы защитить данные, для начала создайте пользователя с правами администратора. Позже мы включим аутентификацию и подключимся к БД как этот администратор.

Чтобы добавить пользователя с правами администратора, подключитесь к оболочке Mongo. Поскольку аутентификация отключена, достаточно ввести:

mongo

Вы попадете в командную строку Mongo. В выводе вы увидите предупреждение, что контроль доступа отсутствует, то есть доступ к базе данных и конфигурациям ничем не ограничен. Оно появляется потому, что вы еще не включили аутентификацию.

MongoDB shell version v4.4.0
. . .
2020-06-09T13:26:51.391+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-06-09T13:26:51.391+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
. . .
>

Эти предупреждения исчезнут после того, как вы включите аутентификацию. А пока это не так, они сообщают вам, что любой, кто имеет доступ к вашему серверу Ubuntu, также может получить доступ к вашей базе данных.

Для примера запустите команду Mongo show dbs:

show dbs

Эта команда возвращает список всех баз данных на сервере. Но когда аутентификация включена, список меняется в зависимости от роли пользователя Mongo или его уровня доступа. Поскольку сейчас аутентификация отключена, команда выведет на экран все без исключения базы данных, находящиеся в системе:

admin   0.000GB
config  0.000GB
local   0.000GB

В выводе для этого примера отображаются только стандартные базы данных. Однако, если в вашей системе есть БД, содержащие конфиденциальные данные, любой пользователь сможет найти их с помощью этой команды.

Для устранения этой уязвимости мы добавим пользователя с правами администратора. Для этого необходимо сначала подключиться к базе данных admin. Здесь хранится информация о пользователях (их имена, пароли и роли):

use admin
switched to db admin

Вместе с MongoDB поставляется ряд методов оболочки на основе JavaScript, которые вы можете использовать для управления своей базой данных. Один из них, метод db.createUser, используется для создания новых пользователей в той БД, в которой выполняется метод.

Запустите метод db.createUser:

db.createUser(

Этот метод требует, чтобы вы указали имя и пароль пользователя, а также любые роли, которые он сможет использовать. Напомним, что MongoDB хранит свои данные в JSON-подобных документах. То есть, чтобы создать нового пользователя, все, вам нужно создать документ, где в виде отдельных полей будут храниться соответствующие данные.

Как и объекты в JSON, документы в MongoDB помещаются между фигурными скобками (это символы { и }). Чтобы добавить пользователя, введите открывающую фигурную скобку:

{

Примечание: Mongo не распознает метод db.createUser как завершенный, пока вы не введете закрывающую скобку. Пока вы этого не сделаете, командная строка вместо знака «больше» (>) будет содержать многоточие (…).

Затем введите поле user: и в двойных кавычках укажите имя пользователя, за которым поставьте запятую. В нашем примере мы используем имя Admin8host, но вы можете ввести любое имя пользователя, которое вам нравится:

user: "Admin8host",

Затем введите поле pwd, а в качестве его значения укажите метод passwordPrompt(). При выполнении метода db.createUser метод passwordPrompt() предлагает вам ввести пароль. Это безопаснее, чем просто ввести пароль в открытом виде, как имя пользователя.

Примечание: Метод passwordPrompt() совместим только с MongoDB версий 4.2+. Если вы используете старую версию Mongo, вам придется ввести свой пароль открытым текстом, так же, как вы вводили имя пользователя:

pwd: "password",

Не забудьте поставить запятую в этом поле:

pwd: passwordPrompt(),

Затем введите роли, которые должен иметь ваш администратор. Поскольку вы создаете пользователя с правами администратора, вы должны как минимум предоставить ему роль userAdminAnyDatabase для БД admin. Это позволит данному пользователю создавать и изменять новых пользователей и роли. Поскольку администратор имеет эту роль в БД admin, это также предоставит ему доступ суперпользователя ко всему кластеру.

Кроме того, мы также предоставим администратору readWriteAnyDatabase. Это даст ему возможность читать и изменять данные в любой БД в кластере, за исключением баз данных config и local, которые в основном предназначены для внутреннего использования:

roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]

Затем введите закрывающую фигурную скобку, чтобы обозначить конец документа:

}

После этого нужно ввести закрывающую круглую скобку, чтобы завершить метод db.createUser:

)

В итоге метод db.createUser должен выглядеть так:

> db.createUser(
... {
... user: "Admin8host",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )

Если синтаксис метода правильный, метод будет выполнен, и вам будет предложено ввести пароль:

Enter password:

Введите надежный пароль. Затем вы получите подтверждение того, что пользователь добавлен:

Successfully added user: {
"user" : "Admin8host",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}

После этого вы можете выйти из MongoDB:

exit

На этом этапе вашему пользователю будет разрешено вводить учетные данные. Конечно, они не потребуются, пока вы не включите аутентификацию и не перезапустите демон MongoDB.

2: Включение аутентификации

Аутентификация настраивается в файле mongod.conf. После настройки нужно перезагрузить mongod, и тогда пользователи должны будут предоставить имя и пароль, чтобы получить возможность взаимодействовать с данными.

Откройте этот конфигурационный файл:

sudo nano /etc/mongod.conf

Найдите закомментированный раздел #security:

. . .
#security:
#operationProfiling:
. . .

Удалите # в начале строки, чтобы активировать настройки.

. . .
security:
#operationProfiling:
. . .

Затем нужно добавить параметр authorization и присвоить ему значение «enabled»:

. . .
security:
authorization: "enabled"
. . .

Важно! В начале строки security нет пробелов, но в начале строки authorization должно быть два пробела.

Сохраните и закройте файл (Ctrl + X, Y, затем Enter).

Теперь перезапустите демон:

sudo systemctl restart mongod

Утилита systemctl не отображает вывод некоторых команд; чтобы убедиться, что демон запустился, используйте команду status:

sudo systemctl status mongod

Если команда restart выполнена успешно, вы получите такой вывод со строкой Active: active (running).

mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-06-09 22:06:20 UTC; 7s ago
Docs: https://docs.mongodb.org/manual
Main PID: 15370 (mongod)
Memory: 170.1M
CGroup: /system.slice/mongod.service
└─15370 /usr/bin/mongod --config /etc/mongod.conf
Jun 09 22:06:20 your_host systemd[1]: Started MongoDB Database Server.

Убедившись, что демон успешно перезапущен, вы можете проверить, как работают ваши настройки аутентификации.

3: Тестирование аутентификации

Чтобы начать проверку аутентификации, которую вы включили на предыдущем шаге, попробуйте подключиться без указания учетных данных – если все работает, у вас это не получится.

mongo

Обратите внимание: теперь, когда вы включили аутентификацию, в командной строке больше нет предупреждений, с которыми вы сталкивались ранее:

MongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") }
MongoDB server version: 4.4.0
>

Теперь попробуйте запустить какую-нибудь команду, например show dbs:

show dbs

Помните, до включения аутентификации эта команда показывала, что на сервере есть по крайней мере несколько стандартных баз данных? На этот раз команда не выводит данные, потому что вы не прошли аутентификацию и по сути не имеете никакого доступа.

Поскольку эта команда не возвращает никакой информации, можно с уверенностью сказать, что настройка аутентификации работает должным образом. Без предварительной аутентификации вы также не сможете создавать пользователей или выполнять другие задачи, требующие привилегий.

Закройте оболочку MongoDB:

exit

Примечание: Альтернативный способ закрыть оболочку — просто нажать Ctrl + C.

Затем убедитесь, что ваш администратор может пройти аутентификацию, выполнив следующую команду mongo для подключения от имени этого пользователя. Эта команда включает флаг -u, который позволяет задать имя пользователя. Обязательно замените Admin8host именем вашего администратора. Команда также включает флаг -p, который запрашивает пароль пользователя, и указывает admin в качестве базы данных, в которой был создан указанный пользователь:

mongo -u Admin8host -p --authenticationDatabase admin

При появлении запроса введите пароль, после чего вы попадете в оболочку. Оказавшись там, попробуйте снова ввести команду show dbs:

show dbs

На этот раз вы прошли аутентификацию, и поэтому команда вернет список баз данных, находящихся в данный момент на сервере:

admin   0.000GB
config  0.000GB
local   0.000GB

Как видите, аутентификация успешно работает.

Заключение

Итак, теперь у вас есть администратор MongoDB, который может создавать и изменять пользователей и роли, а также управлять самой базой данных MongoDB.

Читайте также: Документация MongoDB

Tags: , , ,

Добавить комментарий