Защищаем свой 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/ и т.д. будет запрошен пароль. Это не значит, что его нельзя подобрать, но это не критично.
сентября 13, 2007 в 18:24
chown www:www /usr/local/etc/apache/passwd/non-site.passwd
chmod 640 /usr/local/etc/apache/passwd/non-site.passwd
А зачем апачу разрешать писать в этот файл? 400 прав будет вполне достаточно.
сентября 13, 2007 в 21:12
Скорее всего да, просто это из дока по апачу.
июля 16, 2008 в 11:43
Эх, страшно мне VDS брать, даже под родной Убунту. Дома все входящие закрыл и по барабану всё, а вот сервак... страшно :)