Пользователь
0,0
рейтинг
29 апреля 2014 в 09:45

Разработка → Hello MongoDB (открытый удаленный доступ)

Доброго времени суток.

Прошелся по поиску хабра, но не нашел поста о такой проблеме, хотя пару раз комментарии посвященных людей всплывали.

У нас несколько VPS'ок, где используем MongoDB, ОС обычно дебиан 6/убунту, практически все ставим из пакетов, благо всего хватает. На днях, проверяя старые сервера, обнаружил


Для меня конечно было шоком! Попытка получить удаленный доступ увенчалась успехом


Залез в /etc/mongodb.conf, думая что кто-то из коллег мог себе открыть доступ, но ни слова об этом не было. Надеясь, что тот же коллега просто удалил подобную запись, залез в конфиг на локальной машине (дебиан 6) и тоже не обнаружил ничего про удаленный доступ. Пробежался по всем известным сайтам с монгоДБ и везде смог авторизоваться.

Сразу начал гуглить проблему и наконец нашел на офф. сайте net.bindIp
net.bindIp
Type: string

Default: All interfaces.… versionchanged:: 2.6.0 The deb and rpm packages include a default configuration file that sets {{role}} to 127.0.0.1.

Specifies the IP address that mongos or mongod binds to in order to listen for connections from applications. You may attach mongos or mongod to any interface. When attaching mongos or mongod to a publicly accessible interface, ensure that you have implemented proper authentication and firewall restrictions to protect the integrity of your database.

To bind to multiple IP addresses, enter a list of comma separated values.

Прошелся по всем серверам, в /etc/mongodb.conf добавил строчку
bind_ip = 127.0.0.1

Перегрузил mongoDB
/etc/init.d/mongodb restart

После чего удаленный доступ был закрыт

Разбор полетов

Решил разобраться как же так получилось, конечно сразу вспомнил про mysql, у которого по-умолчанию удаленный доступ закрыт, и конечно для многих, в том числе и меня, было разумно думать, что и монгоДБ здесь особых изяществ не изобретала. Поднял с нуля debian 7.4.0 (последний стабильный), и из пакета поставил монгоДБ, в конфигах уже обнаружил
bind_ip = 127.0.0.1

На память вспоминаю, что ставили из репозитария от монгоДБ по статье на офф сайте Install MongoDB on Debian, так как хостеры давали VPS только на базе Debian 6, с очень старой версией МонгоДБ. После установки из их репозитария в конфигах опять же ничего не обнаружил про удаленный доступ. В самой статье тоже ничего не пишут по этому поводу, что было очень даже обидно.

Проверка соседей

Недолго думая, решил проверить соседей по IP-адресу.
Набросал быстренький скрипт на PHP
<?php

set_time_limit(600);

$ipSt = '*.*.*.'; // 11.22.33.

for($a = 0, $b = 255; $a <= $b; $a++)  {

    $ip = $ipSt . $a;

    echo $ip.': ';

    ob_start();
    $fp = fsockopen($ip, 27017, $errno, $errstr, 0.1); 
    ob_get_contents();
    ob_clean();

    if (!$fp) {
        echo '---';
        }
    else {
        echo 'OK';
        fclose($fp);
        }

    echo '<br />';
    }



На что обнаружил очень приличный список открытых баз данных МонгоДБ, некоторые конечно были на авторизации, некоторые просто для бэкапа, но все же открыты.

Взлом?

Так что можно натворить с таким доступом? Начал тестировать на своем проекте, как минимум:
  • получил список пользователей с e-mail адресами
  • смог править статьи – изменять текст, ставить картинки и js-скрипты
  • через mongofiles смог загрузить файлы в БД, но вот сохранить на жесткий ума не хватило


Итоги

Конечно кто-то говорит, что это все для скорости, что системный администратор по-умолчанию должен сам за всем следить. Но вот только VPS'ки очень даже доступны, кучу статей где хвалят новые базы данных и другой софт, на что многие простые программисты соглашаются на работу с VPS, не имея большого административного опыта. От разработчиков монгоДБ я хотя бы ожидал закомментированную памятку в конфигах, раз не хотят по-умолчанию закрыть удаленный доступ
# bind_ip = 127.0.0.1

Похожие статьи, но уже по memcached: Как я нашел уязвимость на phpclub.ru, 1% всех сайтов рунета держит свой memcached открытым для мира. Немного статистики
Arman @Arik
карма
4,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (28)

  • +5
    На всякий случай — посмотреть все открытые порты можно так:
    sudo netstat -nlp
    

    Поискать среди них нужный порт:
    sudo netstat -nlp | grep 27017
    

    Можно и без sudo, но тогда не будут показаны имена сервисов.
    • +2
      Netstat устарел, вместо него следует использовать ss.
      sudo ss -nlpt
      • 0
        Почему, чем он лучше?

        Читается, на мой взгляд, похуже:
        • +3
          Почему

          Потому, что net-tools не обновляются и объявлен deprecated. В некоторых дистрибутивах его уже нет по умолчанию.
          dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/
          • 0
            О как. Спасибо за информацию.
          • +1
            Нифига подобного, они продолжают развиваться.
        • 0
          Почему, чем он лучше?

          При больших объемах трафика он заметно шустрее:

          # time (netstat -an|grep ":80\ "|wc -l)
          42537
          real	0m7.001s
          user	0m0.388s
          sys	0m6.720s
          
          # time (ss -an|grep ":80\ "|wc -l)
          41403
          real	0m0.139s
          user	0m0.168s
          sys	0m0.068s
          

      • 0
        фря рулит, только netstat -Lan
    • –1
      На случай обнаружения чего-то странного:
      Выключить: service name stop
      Удалить из автозагрузки:
      1) ubuntu 14.04 (upstart): # echo «manual» > /etc/init/name.override
      2) centos 6 (upstart): chkconfig name off
      3) * (System V): sysv-rc-conf | update-rc.d
      4) * (systemd): systemctl disable name
      Привентивная защита: настроить firewall
  • 0
    да, именно в той статье про мемкешд я предлагал проверить монго :)
  • +3
    Давно известная вещь же.
    • 0
      В Ubuntu надо добавить строку в /etc/default/mongod:

      DAEMON_OPTS="$DAEMON_OPTS --bind_ip 127.0.0.1"
  • +9
    Иметь настроенный firewall на серверах уже давно стало правилом хорошего тона.
  • +4
    Откройте для себя волшебный мир *nix — по умолчанию большинство сетевых служб слушают все интерфейсы.
  • +2
    Проблема, к сожалению, глубже, чем просто закрыть порты. Безопасность — вещь комплексная и приемлемого её уровня нельзя достичь, просто посадив в одной комнате программера, а в другой — админа.
    Ну ок, файрволл админ закроет. А настраивать веб-сервер — так, чтобы и приложение не сломалось, и надёжно было? А озаботиться, чтобы директории, где проходит пользовательский аплоад, не были доступны через веб? И так далее, и так далее.
    Лично моё глубокое убеждение — что в каждую комнату, где сидят разработчики, надо сажать по админу с металлической линейкой, чтоб бил по пальцам. Но при этом — в большинстве веб-студий, с которыми приходилось сталкиваться, выделенный админ, следящий за безопасностью разработок, отсутствовал напрочь.
  • 0
    Ну, вообще-то, по хорошему, должно быть
    iptables -P INPUT DROP

    За исключением случаев, когда функционал сервиса какой-то сильно уж специфичный.
    • 0
      Так и программеры в студиях обычно весьма так себе
  • +4
    Нда… Сколько же надо еще набить шишек, чтобы народ вдруг осознал, что МонгоДеБе это вовсе не такой «другой майэскуель»…

    Советую поглядеть в документацию более внимательно, так как модель использования монги довольно сильно отличается от привычного начинающим LAMP'а. В доках однозначно сказано, что безопасность должна обеспечиваться при помощи трастед окружения в первую очередь. И там еще много подобных моментов.
  • –4
    Видимо дело в том, что любой программно-аппаратный комплекс не расчитан на глупых юзеров. Для этого даже выделилась отдельная «IT» сфера, включающая помимо прочих: программистов, системных и DB администраторов e.t.c
    Я конечно очень рад вашему посту про то что в mongo не написаны порты или строчка в конфиге репозитория N закомментирована.
    Не нравится — форкни и допили. Ну или если таланта не хватает просто не используй. Ныть то зачем?
  • +2
    Наличие на рынке дешёвых VPS с предустановленным «софтом для стартапа» не отменяет необходимости читать документацию на используемые приложения. В документации на MongoDB написано:

    IMPORTANT
    Make sure that your mongod and mongos instances are only accessible on trusted networks. If your system has more than one network interface, bind MongoDB programs to the private or internal network interface.

    Судя по всему, там, где вы работаете, не все ещё алфавит освоили.
    • 0
      Судя по всему, там, где вы работаете, у парней хватило бы опыта открыть документацию и разрешить удаленный доступ по необходимости, как я думаю, они поступают с тем же MySQL. На примере того же амазана, который по-умолчанию закрывает все порты и по необходимости сам открываешь. Я не говорю, что разработчики монгоДБ плохие, я говорю что малоопытных всегда будет хватать везде.

      Не думаю что хабр это то место, где добивают лежачих и действует правило: выживает сильнейший. В первую очередь тут делятся опытом. Ведь все совершают ошибки, даже ведущие программисты крупных компаний. Самому не часто удается прочитать всю документацию того или иного софта, чтоб что-то поправить по мелоче в коде чужого проекта. Проекты не всегда крупные с большой посещаемостью, некоторые просто не работают до твоего вмешательства за Спасибо.
      • 0
        Описанное здесь не ошибка, а банальная халатность, которая часто бывает от лени подумать пять минут и хотя бы одним глазом заглянуть в документацию. Плохой тут только тот, кто эти VPS изначально настраивал и отсутствие опыта не оправдание.
  • +1
    указанное автором поведение Монго задумано не просто так — Монга в принципе задумана так, что работает для удалённых серверов, а не только локалхоста. Криворукость разрабов не является основанием отменять устоявшиеся хорошие практики.
    • 0
      С другой стороны в каждом учебнике по программированию рекомендуют «Default deny» правила.
      • +1
        я первый раз такое читаю. По моим наблюдениям далеко не в каждом учебнике программирования вопросы безопасности вообще рассмотрены.
  • 0
    В 2.6 bind_ip указан по умолчанию
  • 0
    в мире nosql народ делает распределённые системы и ценит каждую долю секунды, логично, что авторизация, это лишнее действие, жрущее время. Тем более, когда надо показать всем конкурентам, что у тебя самая быстрая nosql.
    В своё время с открытой монги утянул 300 гигов whois инфы всех доменов, с серверов сеоквейка.

    php скрипт круто ) но зачем? )))
    nmap -v -p27017 11.22.33.1/24 --open
    даст тот же профит, только быстрее. Ну и для психов:
    zmap.io/
    • +1
      Сканировать надо так ;-)
      zmap -p 27017 -n 100 -i wlan0 -o ips.txt;
      nmap -iL ips.txt -p27017  -sV -Pn -n -v
      

      -sV чтобы определять версию монги, если определилась значит можно подключиться.

      Еще есть в shodan 99429 хостов, но бесплатно доступны только первые 10: www.shodanhq.com/search?q=port%3A27017

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.