СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Ставили MongoDB с дефолтными настройками? Поздравляем, она абсолютно открыта всем в черновиках Из песочницы

image

Все, наверное, слышали про NoSQL базы, в частности, про MongoDB. Может даже быть кто-то ставил эту базу на свой сервер. Возможно, с дефолтными настройками. Если это так, пора срочно нырнуть под кат. Потому что MongoDB с дефолтными настройками абсолютно открыта извне всем и каждому.

Вступление

Итак, все началось с письма от весьма недурственного хостинга Hetzner. Вот как оно выглядело:

image

Коротко суть в следующем:

MongoDB — это популярная база в вебе, но вот беда — она во многих местах ну абсолютно открыта всем. Это неправильно, поэтому вот рекомендации по безопасности. Ну, вы получили это письмо, потому что у вас она открыта тоже. Будете подобные письма и впредь, пока не закроете.

Я удивился. Блин, да я очень удивился.

Решил проверить, насколько же она открыта. Я, просто несказанно удивился результатам, understatement.

А результаты таковы: лучшего троянского коня мир просто не знал.

Ну, а теперь конкретика.

Проверяем доступность извне

Это просто. Пробуем открыть сайт в браузере по порту 28017. Набираем — ваш_домен_ру:28017

И, вуаля:

image

Ну, да, да. Пока особого криминала пока нет, но как минимум неприятно, что служебная информация доступна всем.

Проверяем дальше.

Пробуем подключиться снаружи mongo-клиентом. Набираем в консоле на ноутбуке:
mongo ваш_домен.зона:27017


И, снова вуаля:

image

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

Набираем в shell MongoDB команду ls():

image

Ну и на закуску cat("/etc/passwd"):

image

Дальше ковыряться не стал. Мне хватило.

Смотрим настройки на сервере: less /etc/mongodb.conf. И вот что мы видим:
image

Настройки авторизации по дефолту выключены.

Ну и по дефолту слушаем все интерфейсы:

image

Что нужно сделать, чтобы починить?

Как минимум добавить строчки в конфиг:
bind_ip = 127.0.0.1


И опционально настроить авторизацию:
# Turn on/off security. Off is currently the default
#noauth = true
auth = true


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

Немного лирики и статитики

Статистика удручает. Только в Германии студенты, с которых все началось, обнаружили десятки тысяч открытых баз. Картина в мировых масштабах может быть в десятки, а то и сотни раз хуже.

Не буду задавать риторические вопросы, а впрочем, какого черта? Задам.

1) Зачем делать такие дефолтные настройки?
2) Зачем в Mongo shell встраивать доступ к файловой системе?

Понятно, что сам виноват, RTFM. Но зачем такие настройки?

Поневоле закрадывается мысль: «такая „странная логика“ встречается только в дефолтных настройках или, может, еще где нибудь, например, в ядре?»

Выводы: хотите кого-то взломать? Посоветуйте установить ему дефолтную MongoDB.

комментарии (26)

+11
+12 –1
aperechnev ,  
[sarcasm]Вот так новость[/sarcasm]
–3
+2 –5
mrvol ,  
Ну возможно. Искал — не нашел. Решил предупредить оставшихся несколько десятков тысяч, вдруг они не знают.
+6
alexac ,  
Вовсе не новость, известный факт. Вот, к примеру пост годичной давности: habrahabr.ru/post/221221/
–1
+3 –4
mrvol ,   * (был изменён)
Нда, теперь вижу. Но, с другой стороны, этот то пост свежий www.securityweek.com/thousands-mongodb-databases-found-exposed-internet И данные в нем тоже, а в нём говорится, что 40 тысяч открытых баз только в Германии. Значит проблема актуальна и сейчас. Хотя..., они же не читают Хабр.
+1
+2 –1
IamKarlson ,  
Ой да ладно свежий, вот есть еще немного «свежее» документ http://cispa.saarland/wp-content/uploads/2015/02/MongoDB_documentation.pdf
а еще новость на не очень качественном ресурсе
+7
mrThe ,  
image
+8
Borz ,  
Набираем — ваш_домен_ру:28017

А правило «в firewall закрыто всё, для чего не нужен доступ извне» уже не действует?
0
disc ,  
А как бороться с запуском
cat("/etc/passwd")
даже при включенной авторизации?
0
mrvol ,  
Лучше всего запускать сервис MongoDB от отдельного пользователя, который не имеет права просматривать системные файлы.
+1
artch ,  
Для чего вообще эта авторизация? Гораздо правильнее открыть только локальный порт и пробросить SSH-туннель, если нужен доступ откуда-то извне локальной подсети.
0
mrvol ,  
Насколько я понимаю, авторизация нужна с целью разделения доступа между базами.
+8
vitalybaev ,  
Вы с таким успехом можете написать «новости» про Redis, Memcache, ElasticSearch и прочие вещи, которые по умолчанию слушают какой-то порт.

Любой опытный админ не допустит такого с рабочими инструментами. Ну, а для неопытного да, такое письмо от Hetzner-а может стать новостью.
–3
mrvol ,  
Все не совсем так. Все перечисленные вами сервисы слушают по дефолту ТОЛЬКО localhost. А вот mongodb, слушает по дефолту 0.0.0.0 и этой строчке в конфиге нет, она неявно указано. То есть просматривая конф файл нельзя догадаться, что открыто все. Это описано только в документации.
0
robert_ayrapetyan ,   * (был изменён)
Вовсе нет, redis, например, по дефолту также слушает 0.0.0.0 (и этой строчки нет в конфиге). Это обычная (хотя и сомнительная) практика.
0
mrvol ,  
Ваша правда. И про интерфейс и про редис.
+6
artch ,  
Когда устанавливаете любой сетевой сервис на сервер в продакшн, всегда смотрите его сетевые настройки (в частности, какой сокет он слушает). Если для вас это простое правило еще не очевидно, то, возможно, вам не стоит самостоятельно заниматься администрированием системы.
+2
lega ,  
Зачем брать версию 2.4 когда уже давно есть 2.6 в которой по умолчанию `bind_ip = 127.0.0.1` (сейчас проверил). Вообщем статья не актуальна.
0
mrvol ,   * (был изменён)
Не совсем верно. В пакетах deb и rpm изменено значение bind_ip по умолчанию на 127.0.0.1. Пруф habrahabr.ru/post/251925/#comment_8308925
Об этом ниже пишет lexore
0
lexore ,  
Не совсем верно.
Я как раз и указал на комментарий lega «когда уже давно есть 2.6 в которой по умолчанию `bind_ip = 127.0.0.1`».
Вы наверное не увидели «версии 2.6.» на следующей строке.
Да и мой комментарий нельзя считать пруфом :)
Пруф — ссылка на исходник.
0
mrvol ,  
Пруф съел парсер. Еще попытка docs.mongodb.org/manual/reference/configuration-options/#net.bindIp
0
lexore ,  
В версии 2.4 «Default: All interfaces.»
docs.mongodb.org/v2.4/reference/configuration-options/#bind_ip
0
mrvol ,  
MONGODB MANUAL 2.6 (current)

net.bindIp
Type: string

Default: All interfaces.

Changed in version 2.6.0: The deb and rpm packages include a default configuration file that sets net.bindIp to 127.0.0.1.
0
lexore ,  
Да, но когда в «deb and rpm packages» стали ставить 127.0.0.1, там не написано.
В документации для версии 2.4 такой строчки вообще нет.
Так что можно предположить, что во время выпуска 2.4 такой практики ещё не было.
Хотя точно узнать можно, если пройтись по версиям на laucnhpad.
0
lexore ,  
На самом деле, этой проблеме лет 20, наверное.
Бывает, что выходит какая-то БД, или какой-то сервис, который по умолчанию слушает на 0.0.0.0.
Спасают мир от дурацких ошибок maintainer'ы пакетов, которые причесывают конфиг перед сборкой пакета и отправкой в репозиторий.
Со временем разработчики сервиса узнают, что слушать на 0.0.0.0 — плохая практика и меняют конфиг в сырцах.
А потом выходит новая БД, разработчики которой предлагают что-то «новое революционное», но не имеют опыта в таких моментах.
И для них процесс танцев на граблях начинается с начала.

MongoDB пошла по этому пути.
И то ли maintaner'ы проглядели, то ли автор топика собирал монгу из make install, но косяк-таки прокрался в его конфиг.
Как выше написали, разработчики MongoDB набрались опыта (или получили feedback) и уже прописали в дефолтном конфиге правильный bind в версии 2.6.

Автор топика, вы можете написать версию mongo и название вашего дистрибутива, чтобы знать, где именно такой косяк по дефолту.
Я надеюсь, вы не собирали mongo через make install? :)
0
mrvol ,   * (был изменён)
Мопед не мой, товарищ попросил посмотреть свою виртуалку.

Дистрибутив Linux version 2.6.32-5-amd64 (Debian 2.6.32-39squeeze1)
ii mongodb-10gen 2.4.8 amd64 An object/document-oriented database
Говорит ставил около года назад, для экспериментов. Забыл бы уже, да письмо пришло.

А чем плоха сборка из исходников?
+1
Evengard ,   * (был изменён)
Вы перед тем как панику на тему shell-доступа поднимать, читали документацию?
docs.mongodb.org/manual/reference/method/ls/
This function returns with output relative to the current shell session, and does not impact the server.

Ещё раз — это список ЛОКАЛЬНЫХ файлов, НЕ серверных! Проверьте сами, собственно!
docs.mongodb.org/manual/reference/method/cat/ — вот про cat, то же самое. Вы читали СВОИ СОБСТВЕННЫЕ файлы этими функциями. Своего ноутбука. Не сервера.
И да.
Пробуем подключиться снаружи mongo-клиентом. Набираем в консоле на ноутбуке:

mongo ваш_домен.зона:27017

Он точно так же подключится, если вы наберёте эту команду на подключение к защищённому серверу. Просто он не позволит там что-то делать, выплёвывая ошибку об отсутствии авторизации. Один факт подключения НЕ означает дыру!

В остальном, как остальные и сказали, это давно не новость. Первое что я сделал впервые увидев Монгу — это разобрался именно с безопасностью, как она там работает. В своё время очень удивился, что по дефолту её нет, и сразу же настроил.