Mr.KTO blog

Защищаем свой VDS-сервер

Поскольку я только что переехал с FirstVDS на miniVDS (по сути - с VDS в России на сервер в Америке), то хочу рассказать об одном способе, который позволяет снизить угрозу взлома сервера.

Параллельно я расскажу об основных командах FreeBSD (многие аналогичны командам Linux/Unix).

Итак, через пару минут после оплаты VDS, мы получаем ip и пароль сервера, а также ссылки на панель IPS-manager (https://ваш_ip/manager/) и VDS-manager (напр. для переустановки VDS).

Заходим в IPS-manager, нас просят настроить часовой пояс, поменять root-пароль (меняем).
Пока больше здесь можно ничего не делать.

Терерь берём SecureCRT (или ваш любимый ssh-клиент) и соединяемся по ssh2, используя полученные ip и пароль.
В меню: Options\Session\Terminal\Emulation\Emacs\ отмечаем "Use ALT as meta key" - это нужно для эмуляции нажатий F1-F10 через нажания Alt+0 - Alt+9.

Видим приглашение

root@mrkto:/root#

Основы:

man man      главная справка
man команда  справка по команде
exit         выход из системы

Shift+Ins    вставить
Ctrl+C       выход из любой программы

мышкой выделять, правой кнопкой копировать и вставлять

Теперь давайте включим файервол.

Но сначала разберёмся как работать в текстовом редакторе vi:

---vi

i       в режим вставки
Esc     из режима вставки
x       удалить символ под курсором (аналогия Del)
dd      удалить строку
:w      сохранить файл
:q!     выйти без сохранения
:wq     сохранить и выйти

G       в конец файла
Y       копировать строку в буфер
p       вставить из буфера
nG      к строке n
ndd     удалить n строк

/текст  поиск
/       поиск дальше
?текст  поиск назад
?       поиск назад дальше

Итак, чтобы включить модуль файервола (курсивом - то, что нужно добавить в конец файла):

---файервол

touch /etc/firewall.conf

vi /etc/rc.conf

firewall_enable="YES"
firewall_type="/etc/firewall.conf"

reboot

Первой командой мы создали пустой файл /etc/firewall.conf. Потом отредактировали /etc/rc.conf с помощью VIM-а, добавив туда 2 строчки. И наконец - перезагрузка.
Теперь можем войти в панель (ISPmanager) и увидеть, что появилась ссылка на брандмауэр.

Теперь защита, о которой я говорил.

Дело в том, что после установки VDS в стандартной конфигурации, становятся доступны некоторые предустановленные скрипты. Это и панелька (https://host/manager/), и вэб-почта (http://host/webmail/). Если в этих скриптах есть/найдутся дыры, то через них (дыры) можно будет получить доступ к вашему серверу. И даже если никто не знает о существовании вашего VDS, то серверные черви способны находить новые сервера и заражать их через дыры в вэб-приложениях.

Я предлагаю использовать Basic Auch Apache-а, чтобы закрыть доступ к стандартным скриптам HTTP-авторизацией.

Если посмотреть /usr/local/etc/apache/httpd.conf и /usr/local/ispmgr/etc/ispmgr.inc (он Include-ится), то видно, что все скрипты, которые мы видим благодаря Alias-ам (на /manager/, /webmail/, ...) находятся где-то в /usr/local/.

Также, если вы уже добавили пользователя в панели (а значит создали сайт), то по адресу http://host/webstat/ будет хранится статистика Webalizer (которой мы делится не хотим). По умолчанию эта директория уже закрыта HTTP-авторизацией... с нашим именем пользователя и паролем. Как говорится, "хотели как лучше...".
Дело в том, что HTTP-авторизация подвержена брутфорсу. Чтобы подобрать пароль к статистике, а значит к сайту достаточно чего-то вроде:

$req = new qrl;
$req->only_status = true; // получать только одну строку хидера
foreach(file("dictionary.txt") as $pas) {
    $req->submit_request("http://mrkto:".trim($pas)."@mrkto.com/webstat/");
    if ($req->p_code == 200) exit("YAAAAAARRRRRRRR: mrkto.com password = $pas");
}

Но это мы тоже исправим.

UPDATE: Через некоторое время после написания этой статьи в Wordpress обнаружили несколько критических уязвимостей, что породило целую эпидемию взломов блогов на базе этого движка.
Вот где мой способ оказался бы полезен - достаточно добавить в строку с «<Directory» альтернативу «/wp-admin/»

Итак:

---deny access to non-site web area

mkdir /usr/local/etc/apache/passwd
htpasswd -c /usr/local/etc/apache/passwd/non-site.passwd nonweb
chown www:www /usr/local/etc/apache/passwd/non-site.passwd
chmod 640 /usr/local/etc/apache/passwd/non-site.passwd

vi /usr/local/etc/apache/httpd.conf

#deny access to non-site web area
<Directory ~ "^/usr/local/|^/home/[^/]+/data/www/[^/]+/webstat/|/wp-admin/">
    AuthType Basic
    AuthName "protected area"
    AuthUserFile /usr/local/etc/apache/passwd/non-site.passwd
    Require valid-user
</Directory>
<Directory /usr/local/www/icons>
    Allow from all
    Satisfy Any
</Directory>

apachectl restart

Первыми командами мы:
- создаём папку /usr/local/etc/apache/passwd;
- в ней создаём файл паролей (имя пользователя - nonweb, пароль вводится после запуска htpasswd);
- меняем владельца и группу на соответствующие владельцу и группе веб-сервера (посмотреть можно командой top, процесс httpd);
- меняем права доступа.
Далее - добавляем в конец конфига апача, что надо запрашивать пароль для /usr/local/* и папок webstat в корневой директории сайтов;
последний фикс (для иконок листинга директории) только из-за того, что регулярки апача не поддерживают смотрящих вперёд утверждений ( ^/usr/local/(?!www/icons/) ).
И наконец - перезапускаем веб-сервер (апач).

Всё. Теперь при заходе по адресу http://host/webstat/, http://host/manager/, http://host/wp-admin/ и т.д. будет запрошен пароль. Это не значит, что его нельзя подобрать, но это не критично.

Понравился пост? – Поделитесь ссылкой:

Комментарии (3) на “Защищаем свой VDS-сервер”

  1. Читатель пишет:

    chown www:www /usr/local/etc/apache/passwd/non-site.passwd
    chmod 640 /usr/local/etc/apache/passwd/non-site.passwd

    А зачем апачу разрешать писать в этот файл? 400 прав будет вполне достаточно.

  2. mrkto пишет:

    Скорее всего да, просто это из дока по апачу.

  3. VolCh пишет:

    Эх, страшно мне VDS брать, даже под родной Убунту. Дома все входящие закрыл и по барабану всё, а вот сервак... страшно :)

Оставить комментарий