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

Вступление

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

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

Предпосылки

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

Когда это произойдет, вы будете готовы следовать.

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

[[step-1 -—- add-the-mongodb-repository]] == Шаг 1. Добавление репозитория 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 " imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

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

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.

[[step-2 -—- install-mongodb]] == Шаг 2 - Установка 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

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

OutputCreated 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. Он не открывается автоматически в Интернете.

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

[[step-1 -—- add-an-administrator-user]] == Шаг 1. Добавление пользователя с правами администратора

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

mongo

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

OutputMongoDB 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 SecurityAuthentication.

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

use admin
db.createUser(
  {
    user: "AdminSammy",
    pwd: "AdminSammy'sSecurePassword",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Когда мы запускаем команду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"
                }
        ]
}

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

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

[[step-2 -—- enable-authentication]] == Шаг 2 - Включение аутентификации

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

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

sudo nano /etc/mongod.conf

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

mongodb.conf

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

Обратите внимание, что строка «security» в начале не имеет пробелов, а строка «authorization» должна иметь два пробела

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

sudo systemctl restart mongod

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

sudo systemctl status mongod

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

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

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

[[step-3 -—- verifying-that-unauthenticated-users-are-limited]] == Шаг 3 - Подтверждение ограничений для неаутентифицированных пользователей

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

mongo

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

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

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

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

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

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

exit

Затем мы убедимся, что у нашего пользователя с правами администратораdoes есть доступ.

[[step-4 -—- verifying-the-administrator-user-39-s-access]] == Шаг 4. Подтверждение доступа пользователя с правами администратора

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

mongo -u AdminSammy -p --authenticationDatabase admin

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

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

>

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

show dbs
Outputadmin  0.000GB
local  0.000GB

Введитеexit или нажмитеCTRL+C для выхода.

См. Документацию MongoDB, чтобы узнать больше оAuthentication,Role-Based Access Control иUsers and Roles.

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

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

[[step-1 -—- enable-ufw]] == Шаг 1. Включение UFW

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

sudo ufw status

[.Примечание]##

Note: Если вывод указывает, что межсетевой экранinactive, активируйте его с помощью:

sudo ufw enable

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

sudo ufw allow OpenSSH

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

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

sudo ufw allow from client_ip_address to any port 27017

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

sudo ufw status
OutputTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)

[.note] #Note: Если вы новичок в UFW, вы можете узнать больше в руководствеUFW Essentials: Common Firewall Rules and Commands.
#

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

[[step-2 -—- configuring-a-public-bindip]] == Шаг 2. Настройка публичного bindIP

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

sudo nano /etc/mongod.conf

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

Выдержка из /etc/mongod.conf

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

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

sudo systemctl restart mongod

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

sudo systemctl status mongod

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

[[step-3 -—- testing-the-remote-connection]] == Шаг 3 - Проверка удаленного подключения

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

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 наTransport Encryption.

Заключение

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

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

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

  • Чтобы зашифровать данные при передаче, см. Документацию по безопасности MongoDB наTransport Encryption

  • Узнайте больше об использовании и администрировании MongoDB вthese DigitalOcean community articles.

Related