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

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

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

Вступление

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И опционально настроить авторизацию:

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

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

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

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

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

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

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

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

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

Вы с таким успехом можете написать «новости» про Redis, Memcache, ElasticSearch и прочие вещи, которые по умолчанию слушают какой-то порт.

Любой опытный админ не допустит такого с рабочими инструментами. Ну, а для неопытного да, такое письмо от Hetzner-а может стать новостью.

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.

На самом деле, этой проблеме лет 20, наверное. Бывает, что выходит какая-то БД, или какой-то сервис, который по умолчанию слушает на 0.0.0.0. Спасают мир от дурацких ошибок maintainer'ы пакетов, которые причесывают конфиг перед сборкой пакета и отправкой в репозиторий. Со временем разработчики сервиса узнают, что слушать на 0.0.0.0 — плохая практика и меняют конфиг в сырцах. А потом выходит новая БД, разработчики которой предлагают что-то «новое революционное», но не имеют опыта в таких моментах. И для них процесс танцев на граблях начинается с начала.

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

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

Мопед не мой, товарищ попросил посмотреть свою виртуалку.

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

А чем плоха сборка из исходников?

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

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

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

Время указано в том часовом поясе, который установлен на Вашем устройстве.

📎📎📎📎📎📎📎📎📎📎