MongoDB – документо-ориентированная база данных с открытым исходным кодом, которая классифицируется как база NoSQL. В её основе лежит не традиционная реляционная таблицеобразная структура базы данных. Вместо этого, MongoDB использует JSON-подобные документы с динамическими схемами. В MongoDB аутентификация пользователей не включена изначально. Подразумевается, что любая учётная запись, которая имеет доступ к серверу, может добавить или удалить данные без каких-либо ограничений. Преследуя своей целью защитить эту уязвимость, в данном руководстве мы посмотрим, как производится настройка безопасности MongoDB в Ubuntu 20.04. В частности, мы создадим административную учётную запись, после чего включим пользовательскую аутентификацию. Также, мы увидим, что только наша административная учётная запись имеет доступ к нашей базе данных.
Подключение к оболочке MongoDB
Для настройки будем использовать сервер, работающий под управлением Ubuntu 20.04. На сервере должен быть настроен брандмауэр при помощи UFW. Подключаться к серверу необходимо будет пользователем, имеющим привилегии sudo. Также, на сервере должен быть установлен пакет MongoDB версии 4.4.
Начиная с версии 3.0, служба MongoDB настроена только на приём подключений из локального Unix-сокета. При этом, аутентификация пользователей по умолчанию выключена, и любой пользователь, имеющий доступ к серверу, имеет доступ и к базе данных.
Первым шагом, для того, чтобы закрыть данную уязвимость, мы создадим административного пользователя. После чего, вы сможете включить пользовательскую аутентификацию и подключиться к базе данных под именем этой учётной записи, таким образом, получив доступ к ней.
Чтобы добавить административного пользователя, необходимо подключиться к оболочке Mongo. Так как пользовательская аутентификация отключена, вы можете сделать это используя команду mongo
без каких-либо параметров:
$ mongo
Из-за того, что аутентификация всё ещё отключена, вывод выполнения команды будет содержать сообщения с предупреждением о том, что в Mongo не запущена система контроля доступа к базе данных, и доступ к чтению и записи данных и настроек базы не ограничен:
Эти предупреждения исчезнут, когда вы включите аутентификацию. Пока же следует иметь ввиду, что пользователь, получающий доступ к вашей операционной системе, также получает контроль и над вашими базами данных.
Чтобы увидеть это, в оболочке Mongo запустите следующую команду:
$ show dbs
Эта команда возвращает список всех баз данных Mongo на сервере:
Данный список должен выводится в зависимости от роли или уровня доступа к определённым базам, которые имеет пользователь Mongo, запускающий команду. Но поскольку аутентификация отключена, команда возвращает список всех баз данных без ограничений. Сейчас в этом списке присутствуют только базы, созданные Mongo по умолчанию. Но, если в вашей системе будут находиться базы данных, содержащие какие-либо важные данные, любой пользователь сможет найти их при помощи данной команды.
Добавление административного пользователя
Теперь, когда мы подключились к оболочке Mongo, давайте добавим в систему административного пользователя, в качестве первого шага на пути закрытия данной уязвимости. Для этого необходимо будет подключиться к базе данных admin
. В этой базе хранится информация об учётных записях Mongo, а именно, имена пользователей, их пароли и роли в системе:
> use admin
Установленный MongoDB содержит методы оболочки, основанные на JavaScript. Их вы можете использовать для управления базами данных. Один из них, метод
, предназначен для создания новых пользователей в базе данных, в которой этот метод запущен.db.createUser()
Чтобы запустить метод, наберите в оболочке Mongo:
> db.createUser(
Этот метод требует указания имени учётной записи, её пароля, а также, полномочий, которые вы хотите для неё определить. Как мы уже упоминали ранее, Mongo хранит свои данные в виде JSON-документов. По сути, при создании нового пользователя, вы создаёте документ, где соответствующие пользовательские данные хранятся в виде отдельных полей.
Как и в JSON-объектах, в Mongo содержимое документов оформляется фигурными скобками. Поэтому, чтобы начать добавление учётной записи, откройте фигурную скобку:
... {
Заметка: Mongo не будет считать метод завершённым, пока вы не закроете парные скобки. Поэтому, пока вы не наберёте завершающую метод скобку
)
, оболочка в качестве приглашения будет использовать символы...
, а по окончании набора снова сменит приглашение на>
.
Далее, наберите поле user:
с указанием имени учётной записи, которое вы решили использовать в качестве имени административного пользователя. В нашем примере мы будем использовать имя YourMongoAdmin
:
... user: "YourMongoAdmin",
Теперь наберите поле pwd
с использованием метода passwordPrompt()
в качестве значения. Метод passwordPrompt()
обеспечит вас возможностью ввода пароля для создаваемого пользователя по окончании набора метода db.createUser()
. Использование метода passwordPrompt()
– более безопасно, чем ввод пароля в открытом виде, как вы делали это, вводя имя пользователя.
Заметка: Метод
passwordPrompt()
совместим с версиями MongoDB, начиная с версии 4.2. Поэтому, если вы используете более старую версию, вам придётся набирать пароль в открытом виде, аналогично тому, как вы набирали имя создаваемого пользователя:
... pwd: "p@$$word",
Убедитесь, что ввод поля завершается запятой:
... pwd: passwordPrompt(),
Далее, необходимо ввести роль, которую вы хотите назначить создаваемому пользователю. Так как вы создаёте административную учётную запись, вам нужно назначить ей роль userAdminAnyDatabase
в базе данных admin
. Это позволит административному пользователю создавать и редактировать пользователей и их полномочия.
Дополнительно, в нашем примере, мы назначим создаваемому административному пользователю роль readWriteAnyDatabase
. Это предоставит вашему администратору возможность просматривать и редактировать данные в любых базах данных кластера. Исключения составят базы данных config
и local
, которые в основном предназначены для внутреннего использования:
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Далее, необходимо закрыть фигурную скобку, чтобы обозначить конец документа:
... }
И теперь, закройте простую скобку, что будет означать окончание метода
: db.createUser()
... )
Весь метод
в нашем примере будет выглядеть следующим образом:db.createUser()
> db.createUser(
... {
... user: "YourMongoAdmin",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )
Теперь, нажмите Enter
. Если синтаксис набранных строк корректен, метод запустится на исполнение и предложит вам ввести пароль для создаваемой учётной записи:
Введите придуманный вами пароль и нажмите Enter
. Вывод об успешном добавлении пользователя должен выглядеть примерно так:
Теперь можно выйти оболочки Mongo, для чего наберите команду exit
.
С этого момента вашему только что созданному пользователю будет разрешено вводить и редактировать учётные данные. Но пока, от него не потребуется производить такие действия. Дело в том, что система аутентификации пользователей до сих пор не запущена. Поэтому вам потребуется её включить с перезапуском службы MongoDB.
Включение аутентификации
Чтобы запустить пользовательскую аутентификацию, необходимо внести изменения в конфигурационный файл MongoDB mongod.conf
. Пока вы не сделаете это и не перезапустите службу MongoDB, пользователи будут подключаться к вашим базам данным без аутентификации. Однако, при этом они не смогут просматривать и редактировать данные пока не предоставят корректные имя пользователя и пароль.
Откройте для редактирования конфигурационный файл mongod.conf
, например, при помощи текстового редактора nano
:
$ cd /etc
$ sudo nano mongod.conf
В этом файле найдите строку #security
и раскомментируйте её (удалите в начале строки символ #
).
Следующей строкой добавьте текст:
authorization: enabled
Причём, необходимо убедиться, что в строке security
нет никаких пробелов в её начале. Строка же authorization: enabled
, напротив, имеет два пробела отступа в начале строки. Отредактированный текст должен выглядеть следующим образом:
После завершения редактирования сохраните изменения и закройте файл, для чего нажмите Ctrl X
, затем Y
и Enter
.
Далее, необходимо перезапустить демон MongoDB для того, чтобы применились внесённые в конфигурацию изменения:
$ sudo systemctl restart mongod
Теперь запустите просмотр статуса службы:
$ sudo systemctl status mongod
Если перезапуск демона прошёл успешно, в выводе команды вы увидите, что служба mongod
активна и находится в запущенном состоянии:
Теперь мы можем проверить, работает ли добавленный параметр аутентификации должным образом.
Проверка параметров аутентификации
Теперь попробуем подключиться к оболочке Mongo. Мы сделаем это для того, чтобы протестировать, как работает система пользовательской аутентификации, которая была запущена в предыдущем разделе:
$ mongo
Как видите, при подключении к оболочке система больше не сообщает нам о том, что система контроля доступа к базам данных не запущена. Такие сообщения с предупреждениями вы могли видеть, когда подключались к оболочке в начале работ по настройке безопасности MongoDB. Из этого можно сделать вывод, что аутентификация включена.
Чтобы убедиться, что теперь доступ к базам ограничен, наберите:
$ show dbs
В отличие от того, как было раньше, когда эта команда возвращала список всех баз данных, теперь доступ к базам для вас закрыт, так как вы не авторизовались в Mongo как пользователь с каким-либо привилегиями.
И поскольку, какая-либо информация для вас теперь не доступна, мы можем заключить, что параметры аутентификации работают, как и ожидалось. Вы также не сможете создать пользователя или выполнить другие привилегированные задачи без авторизации в Mongo.
Теперь, отключитесь от оболочки, набрав exit
, либо нажав Ctrl C
.
Следующим шагом, необходимо убедиться, что ваш административный пользователь способен идентифицироваться должным образом с помощью запуска команды mongo
для подключения от имени вашего пользователя. Команда должна содержать флаг -u
, после которого указывается имя пользователя, под которым будет происходить подключение к оболочке. Не забудьте, что вместо YourMongoAdmin
вам необходимо указать имя своего административного пользователя. Также, команда должна содержать флаг -p
, который запросит у вас пароль вашего пользователя. Плюс ко всему, флаг -p
указывает admin
в качестве базы данных проверки подлинности вашей учётной записи.
$ mongo -u YourMongoAdmin -p --authenticationDatabase admin
Теперь наберите пароль вашего пользователя и подключитесь к оболочке:
Ещё раз наберите команду show dbs
. Обратите внимание, что, поскольку ваша авторизация прошла успешно, вы снова можете видеть список всех баз данных Mongo:
Это подтверждает, что пользовательская аутентификация MongoDB запущена успешно.