MongoDB подвергается различным атакам. Это являются распространенным явлением. Я использую его для хранения данных на моем публичном облачном сервере под управлением Ubuntu Linux. Как защитить и обезопасить сервер MongoDB nosql на операционной системе Linux или Unix?
MongoDB — бесплатный сервер баз данных документов NoSQL с открытым исходным кодом. Он используется веб-приложением для хранения данных на общедоступном сервере. Защита MongoDB имеет решающее значение. Крекеры и хакеры получают доступ к небезопасному MongoDB для кражи данных и удаления данных из непроверенных или плохо настроенных баз данных. В этом руководстве вы узнаете, как защитить MongoDB или сервер, работающий с облачным сервером.
Конфигурации MongoDB
- Расположение файла по умолчанию /etc/mongodb.conf
- Порт по умолчанию TCP 27017
- 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
Тем не менее, возможно, что у вас есть два или более серверов вроде:
Вам нужно привязать 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, и это не очень хорошая идея. Например:
Подключение к экземпляру 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
Примеры вывода данных:
Используйте брандмауэр
Используйте брандмауэры, чтобы ограничить доступ других объектов к вашему серверу 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
Пример вывода данных:
Создайте .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
Пример вывода данных:
Создайте клиентский файл .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"
Примеры вывода данных:
Ниже приведен клиент 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
Это интересно: