Поиск по сайту:

Как установить и защитить MongoDB в Ubuntu 16.04


Введение

MongoDB — это ориентированная на документы база данных, бесплатная и с открытым исходным кодом. Она классифицируется как база данных NoSQL, поскольку не опирается на традиционную табличную структуру реляционной базы данных. Вместо этого он использует JSON-подобные документы с динамическими схемами. В отличие от реляционных баз данных, MongoDB не требует предопределенной схемы перед добавлением данных в базу данных. Вы можете изменить схему в любое время и так часто, как это необходимо, без необходимости настраивать новую базу данных с обновленной схемой.

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

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 16.04, настроенный с пользователем sudo без полномочий root и брандмауэром в соответствии с руководством по первоначальной настройке сервера Ubuntu 16.04.

Когда это на месте, вы готовы следовать за ним.

Часть первая: настройка сервера

Шаг 1 — Добавление репозитория MongoDB

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

Ubuntu гарантирует подлинность программных пакетов, проверяя, что они подписаны ключами GPG, поэтому сначала нам нужно импортировать ключ для официального репозитория MongoDB.

  1. 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 знал, где скачать пакеты. Введите следующую команду, чтобы создать файл списка для MongoDB.

  1. 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

Наконец, мы обновим список пакетов.

  1. sudo apt-get update

Теперь мы готовы установить MongoDB.

Шаг 2 — Установка MongoDB

Мы установим метапакет mongodb-org, который включает в себя демон, сценарии настройки и инициализации, оболочку и инструменты управления на сервере.

  1. sudo apt-get install mongodb-org

Нажмите Enter или введите Y, чтобы продолжить при появлении запроса. После завершения установки мы запустим демон Mongo:

  1. sudo systemctl start mongod

Так как systemctl не предоставляет вывод, мы проверим статус, чтобы убедиться, что служба запущена правильно.

  1. 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, чтобы выйти. Теперь, когда мы вручную запустили демон и убедились, что он работает, мы обеспечим его автоматический перезапуск при загрузке:

  1. sudo systemctl enable mongod

Следующий вывод подтверждает, что команда выполнена успешно:

Output
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /lib/systemd/system/mongod.service.

Далее мы предпримем необходимые шаги для защиты наших баз данных.

Часть вторая: защита MongoDB

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

Ситуация была смягчена в выпуске 3.x, а также в более ранних версиях, предоставляемых некоторыми менеджерами пакетов, потому что демон теперь привязан к 127.0.0.1, поэтому он будет принимать соединения только через сокет Unix. Он не открывается автоматически для Интернета.

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

Шаг 1 — Добавление пользователя-администратора

Чтобы добавить нашего пользователя, мы подключимся к оболочке Mongo:

  1. mongo

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

Output
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 Security Authentication.

Установите имя пользователя по вашему выбору и обязательно выберите свой собственный безопасный пароль и замените его в команде ниже:

  1. use admin
  2. db.createUser(
  3. {
  4. user: "AdminSammy",
  5. pwd: "AdminSammy'sSecurePassword",
  6. roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  7. }
  8. )

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

Output
> use admin switched to db admin > db.createUser( ... { ... user: "AdminSammy", ... pwd: "AdminSammy'sSecurePassword", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Successfully added user: { "user" : "AdminSammy", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

Введите «выход» и нажмите ENTER или используйте CTRL+C, чтобы выйти из клиента.

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

Шаг 2 — Включение аутентификации

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

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

  1. sudo nano /etc/mongod.conf

В разделе #security мы удалим хэш перед security, чтобы активировать строфу. Затем мы добавим настройку авторизации. Когда мы закончим, строки должны выглядеть так, как показано ниже:

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

Обратите внимание, что строка «безопасность» не имеет пробелов в начале, а строка «авторизация» должна иметь отступ в два пробела.

После сохранения и выхода из файла мы перезапустим демон:

  1. sudo systemctl restart mongod

Если мы допустили ошибку в конфигурации, дамеон не запустится. Поскольку systemctl не обеспечивает вывод, мы будем использовать его параметр status, чтобы убедиться, что он это сделал:.

  1. sudo systemctl status mongod

Если мы видим Active: active (running) в выводе, и он заканчивается чем-то вроде текста ниже, мы можем быть уверены, что команда restart выполнена успешно:

Output
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

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

Шаг 3 — Проверка того, что неаутентифицированные пользователи ограничены

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

  1. mongo

Теперь, когда мы включили аутентификацию, все предыдущие предупреждения устранены.

Output
MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2

Мы подключены к базе данных test. Мы проверим, что наш доступ ограничен с помощью команды show dbs:

  1. show dbs
Output
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" . . .

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

Давайте выйдем из оболочки, чтобы продолжить:

  1. exit

Далее мы удостоверимся, что у нашего администратора действительно есть доступ.

Шаг 4 — Проверка доступа администратора

Мы подключимся как наш администратор с опцией -u, чтобы указать имя пользователя, и -p, чтобы получить запрос на ввод пароля. Нам также потребуется указать базу данных, в которой мы сохранили учетные данные пользователя для аутентификации, с опцией --authenticationDatabase.

  1. mongo -u AdminSammy -p --authenticationDatabase admin

Нам будет предложено ввести пароль, поэтому предоставьте его. Как только мы введем правильный пароль, мы попадем в оболочку, где сможем выполнить команду show dbs:

Output
MongoDB shell version v3.4.2 Enter password: connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 >

Вместо отказа в доступе мы должны увидеть доступные базы данных:

  1. show dbs
Output
admin 0.000GB local 0.000GB

Введите exit или нажмите CTRL+C, чтобы выйти.

См. документацию MongoDB, чтобы узнать больше о пользователях и ролях.

Часть третья: Настройка удаленного доступа (необязательно)

Прежде чем мы начнем работать с установкой, которая позволяет удаленные подключения, в идеале у нас должна быть MongoDB за внешним брандмауэром, защищенным виртуальной частной сетью (VPN) или ограниченным хостом-бастионом. Однако по мере того, как мы работаем над этим, мы можем предпринять несколько менее сложный шаг, включив брандмауэр на сервере базы данных и ограничив доступ к определенному хосту или хостам, которые в нем нуждаются.

Шаг 1 — Включение UFW

В исходной настройке сервера с предварительным условием Ubuntu 16.04 мы включили UFW и разрешили только подключения SSH. Прежде чем мы откроем порт для нашей клиентской машины, давайте проверим статус UFW:

  1. sudo ufw status

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

  1. sudo ufw enable

После его включения повторный запуск команды состояния sudo ufw status покажет правила. При необходимости обязательно разрешите SSH.

  1. sudo ufw allow OpenSSH

<$>

Если мы не внесли изменения в предварительные условия, выходные данные должны показывать, что разрешен только OpenSSH:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

Далее мы разрешим доступ к порту MongoDB по умолчанию, 27017, но ограничим этот доступ определенным хостом. Если вы изменили порт по умолчанию, обязательно обновите его в приведенной ниже команде.

  1. sudo ufw allow from client_ip_address to any port 27017

Повторно запустите эту команду, используя IP-адрес для каждого дополнительного клиента, которому требуется доступ. Чтобы перепроверить правило, снова запустим ufw status:

  1. sudo ufw status
Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere 27017 ALLOW client_ip_address OpenSSH (v6) ALLOW Anywhere (v6)

<$>[примечание]

С этим правилом брандмауэра мы готовы настроить MongoDB для прослушивания ее общедоступного интерфейса.

Шаг 2 — Настройка общедоступного IP-адреса

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

  1. sudo nano /etc/mongod.conf

В разделе net добавьте IP-адрес MongoHost в строку bindIp:

 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .

Мы сохраним и закроем файл, затем перезапустим демон:

  1. sudo systemctl restart mongod

Как и ранее, мы подтвердим, что перезапуск прошел успешно:

  1. sudo systemctl status mongod

Вывод должен содержать Active: active (running), и мы можем перейти к нашему последнему тесту. Теперь Mongo прослушивает порт по умолчанию.

Шаг 3 — Проверка удаленного подключения

Мы проверим, прослушивает ли Mongo общедоступный интерфейс, добавив флаг --host с IP-адресом из файла mongodb.conf.

  1. mongo -u AdminSammy -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, добавили пользователя с правами администратора и включили аутентификацию.

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

Следующие шаги:

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