Как защитить MongoDB на Linux или Unix серверах

MongoDB подвергается различным атакам. Это являются распространенным явлением. Я использую его для хранения данных на моем публичном облачном сервере под управлением Ubuntu Linux. Как защитить и обезопасить сервер MongoDB nosql на операционной системе Linux или Unix?

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

Конфигурации MongoDB

  1. Расположение файла по умолчанию /etc/mongodb.conf
  2. Порт по умолчанию TCP 27017
  3. MongoDB версия сервера: 3.4.1

Ограничение воздействия сети

Отредактируйте /etc/mongodb.conf или /usr/local/etc/mongodb.conf  файл, для этого введите:

$ sudo vi /etc/mongodb.conf

Если ваше веб-приложение и MongoDB (mongod сервер) установлены на одной и той же машине, выставьте IP адрес MongoDB на 127.0.0.1. Это отрезает связь напрямую из интернета:

# network interfaces
net:
port: 27017
bindIp: 127.0.0.1

Тем не менее, возможно, что у вас есть два или более серверов вроде:

Как защитить MongoDB на Linux или Unix серверах
Рис.01: Пример современного веб-приложения и MonoDB, работающих внутри вашей VLAN.

Вам нужно привязать mongod к 192.168.1.7, чтобы к нему можно было получить доступ только через VLAN:

bindIp: 192.168.1.7

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

Изменяем порт по умолчанию

Вы также можете изменить порт по умолчанию, если захотите. В данном примере мы меняем его на 2727:

port: 2727

Сохраните изменения и выйдете их файла. Вам нужно перезапустить MongoDB, для этого введите:

$ sudo systemctl restart mongod

Или если вы используете FreeBSD Unix:

# service mongod restart

Проверьте открытые порты с помощью команды netstat:

$ netstat -tulpn
$ ss -tulpn
$ sockstat #freebsd unix command
$ ss -tulpn | grep 27017
$ netstat -tulpn | grep 27017

Примеры вывода данных:

tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 6818/mongod

Настройка контроля доступа

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

Подключение mongo shell к экземпляру с любым типом аутентификации
Подключение mongo shell к экземпляру с любым типом аутентификации

Подключение к экземпляру DB

$ mongo
## or ##
$ mongo --port 2727
MongoDB shell version: 2.6.10
connecting to: test

Создание пользователя-администратора

Внимание: Создайте пользователя с надежным паролем. Для демонстрационной цели я использую «mySuperSecretePasswordHere», но вы должны использовать сильный пароль.

Вам нужно использовать базу данных администратора. Введите следующую команду в > запрос для создания своего суперпользователя:

> use admin
switched to db admin

Далее создайте пользовательский vivek в admin базе данных с ролью userAdminAnyDatabase:

> db.createUser({user:"vivek",pwd:"mySuperSecretePasswordHere", roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

Примеры вывода данных:

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

Отключите mongo shell с помощью ввода следующей команды:

> exit
bye
$

Перезапустите экземпляр MongoDB

Отредактируйте файл /etc/mongodb.conf or /usr/local/etc/mongodb.conf, для этого введите:

$ sudo vi /etc/mongodb.conf

Включите безопасность:

security:
authorization: enabled

Сохраните изменения и закройте файл. Перезапустите экземпляр MongoDB:

$ sudo systemctl restart mongodb

Или же если вы используете FreeBSD Unix:

# service mongod restart

Чтобы выполнить аутентификацию во время соединения с помощью пользовательского vivek и пароля для базы данных администратора:

$ mongo -u vivek -p mySuperSecretePasswordHere --authenticationDatabase admin

Добавьте дополнительного пользователя в DB. Для начала создайте новую базу данных под названием «nixcraft»:

> use nixcraft
switched to db nixcraft

Создайте пользователя с именем ‘nixdbuser’ и паролем ‘myKoolPassowrd’ для nixcraft db:

db.createUser(
{
USER: "nixdbuser",
pwd: "myKoolPassowrd",
roles: [
{
ROLE: "readWrite", db: "nixcraft"
},
{
ROLE: "read", db: "reporting"
}
]
}
)

Примеры вывода данных:

Successfully added user: {
    "user" : "nixdbuser",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "nixcraft"
        },
        {
            "role" : "read",
            "db" : "reporting"
        }
    ]
}

Теперь вы можете подключиться к nixcraft db следующим образом:

$ mongo --port 27017 -u "nixdbuser" -p "myKoolPassowrd" --authenticationDatabase "nixcraft"

Это гарантирует, что только уполномоченный администратор с именем «vivek» может выполнять команды, или nixdbuser может выполнять операцию чтения / записи на nixcraft db. Вы можете проверить это следующим образом, вставив записи:

> use nixcraft
> db
> db.names.insert({"title":"Mr", "last":"Gite", "First":"Vivek"})
> db.names.find()
> show dbs

Примеры вывода данных:

Включает контроль доступа и обеспечивает аутентификацию
Рис.02: Включает контроль доступа и обеспечивает аутентификацию

Используйте брандмауэр

Используйте брандмауэры, чтобы ограничить доступ других объектов к вашему серверу mongodb. В этом примере разрешите вашим серверам приложений доступ к базе данных с помощью ufw на Ubuntu или Debian Linux

$ sudo ufw allow proto tcp from 192.168.1.5 to 192.168.1.7 port 27017
$ sudo ufw allow proto tcp from 192.168.1.6 to 192.168.1.7 port 27017

Разрешите SSL

Используйте SSL между вашим клиентом MongoDB и сервером при подключении к вашему серверу Mongodb через Интернет. В противном случае ваша сессия может подвергнуться атаке «человек в середине». Моя настройка такова:

mongodb-server: 127.0.0.1
mongodb-client: 127.0.0.1
Common Name (e.g. server FQDN or YOUR name) []: 127.0.0.1
The PEM pass phrase for server: mongodb_server_test_ssl
The password/passphrase for client: mongodb_client_test_ssl

Введите следующую команду – сертификат сервера

$ sudo mkdir /etc/ssl/mongodb/
$ cd /etc/ssl/mongodb/
$ sudo openssl req -new -x509 -days 365 -out mongodb-server-cert.crt -keyout mongodb-server-cert.key

Пример вывода данных:

MongoDB SSL сертификат настройки сервера
Рис.03: MongoDB SSL сертификат настройки сервера

Создайте .pem  файл с ключом и сертификатом:

$ cd /etc/ssl/mongodb/
$ sudo bash -c 'cat mongodb-server-cert.key mongodb-server-cert.crt
> mongodb-server.pem'

Введите следующую команду – сертификат клиента

$ cd /etc/ssl/mongodb/
$ sudo openssl req -new -x509 -days 365 -out mongodb-client-cert.crt -keyout mongodb-client-cert.key

Пример вывода данных:

MongoDB SSL устанавливает сертификат клиента
Рис.04: MongoDB SSL устанавливает сертификат клиента

Создайте клиентский файл .pem с ключом и сертификатом:

$ cd /etc/ssl/mongodb/
$ sudo bash -c 'cat mongodb-client-cert.key mongodb-client-cert.crt
> mongodb-client.pem'

Настройте mongod и mongos для TLS/SSL сервера

Отредактируйте файл /etc/mongodb.conf or /usr/local/etc/mongodb.conf, для этого введите:

$ sudo vi /etc/mongodb.conf

Обновите config файл следующим образом:

# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb/mongodb-server.pem
CAFile: /etc/ssl/mongodb/mongodb-client.pem
PEMKeyPassword: mongodb_server_test_ssl

Сохраните и закройте файл.Перезапустите экземпляр MongoDB :

$ sudo systemctl restart mongodb

Или, если вы используете FreeBSD Unix:

# service mongod restart

Конфигурация TLS / SSL для MongoDB клиентов

Синтаксис интерфейса mongo shell следующий:

$ mongo --ssl --sslCAFile /etc/ssl/mongodb/mongodb-server.pem \
--sslPEMKeyFile /etc/ssl/mongodb/mongodb-client.pem \
--sslPEMKeyPassword mongodb_client_test_ssl \
--host 127.0.0.1 --port 27017 \
--u "nixdbuser" -p "myKoolPassowrd" --authenticationDatabase "nixcraft"

Примеры вывода данных:

Соединение с клиентом MongoDB SSL с использованием SSL-сертификата
Рис.05: Соединение с клиентом MongoDB SSL с использованием SSL-сертификата

Ниже приведен клиент Python для подсоединения к разрешенному SSL MongoDB:

client = pymongo.MongoClient('127.0.0.1', ssl=True)

Или

client = pymongo.MongoClient('127.0.0.1',
ssl=True,
ssl_certfile='/etc/ssl/mongodb/mongodb-client.pem',
ssl_keyfile='/etc/ssl/mongodb/mongodb-server.pem',
ssl_pem_passphrase=mongodb_client_test_ssl)

Установите патч и запустите обновленную версию вашей операционной системы и MongoDB

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

Перевод: Анна Давыдова
Источник: cyberciti.biz

Это интересно:

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *