Как создать ftp пользователя через SSH
-
Добавляем нового пользователя: adduser newusername
-
Устанавливаем пароль для него: passwd newusername
-
Привязываем пользователя к папке:
usermod -d /target/directory username
Показывает все локальные подлючения и кто их слушает. Так можно узнать к примеру на каком порту вистя mysql и redis
netstat -nlp
Строго говоря, защититься от грамотной DDOS атаки, на рядовом сервере практически невозможно. Защиты просто нет. Любой хостер или админ разведет руками если Ваш сайт захотят сломать и вывести из строя. Под DDOS атаками падают сервера Пентагона и Google, что говорить про наш VDS сервер за 300 рублей в месяц. Однако, нужно в первую очередь оценить уровень нападающего. Если у Вас блог с посещалкой 500 человек то скорее всего за вас не будут браться профессиональные хакеры. Вас будет взламывать/парсить/спамить школьник или студент, или сосед, которому вы вчера не заняли денег. Он будет делать это без должной сноровки, но проблема в том, что он может! это сделать. Практически любой виртуальный хостинг, или даже выделенный сервер, может "завалить" один компьютер, без серьезного канала.
Есть такая программа LOIC, с помощью нее любой школьник может вывести из строя Ваш сервер, не давая ему подняться
Это что касается DDOS'а. Можно надолго отправить сервер в DOWN на какой-нибудь "тяжелой" CMS просто открыв 10(20,30,1000) вкладок в браузере и запустить автообновление, через каждую секунду. Или написав простейший парсер на php, который будет делать тоже самое. Каждый такой запрос на неподготовленную CMS (без кеширования), c подключением к БД и генерацией страницы, приведет к ожидаемому результату: на виртуальном хостинге ваш сайт попросту заблокируют, а на выделенном он просто перестанет работать. Мой сайт содержит большое число статей про написание парсеров и не удивительно, что в первую очередь работу парсера отрабатывают на нем же.
На нормальном виртуальном хостинге, у конторы, которая следит за своими серверами, есть своя защита от атак. Но чаще хостер просто блокирует сайт, который потребляет слишком много ресурсов. За примером далеко ходить не надо: beget.ru после превышения определенной нагрузки на сайт, выдает место стартовой страницы - заглушку. Если у пользователя нормальный браузер с включенным JavaScript, то заглушка добавляет определенную cookie и перезагружает страницу, если нет, то бот ничего кроме нее не увидит. Очевидная проблема - поисковики. Им нет дела до ваших проблем и они тоже боты. Такая блокировка - отрезает им доступ к сайту и вы вылетаете из всех индексов.
Печальный итог. Другое дело, что от подобных атак можно и нужно защищаться. И сделать это можете вы сами. Далее будет дилетантские советы от непрофессионала - не профессионалам в области защиты сервера. То, что вы можете сделать сами, но не знаете как. Опыт, который получен в результате недавней атаки на этот сайт.
Виртуальный сервер
На виртуальном хостинге за 150 рублей в месяц, сделать вы можете ни много. Но все же кое что можете.
Первое, что нужно сделать - это написать службе поддержки вашего хостинга. Это их сервер и они обязаны поддерживать его работоспособность. В большинстве случаев зловредный ip адрес злоумышленника заблокируют на уровне реального сервера и делать ничего, описанного ниже, Вам не придется. Если этого не произошло, то добро пожаловать под кат.
Для начала нужно узнать IP виновника. Если это атака с одного компьютера, то достаточно заблокировать его IP и дело с концом. Обычно хостер предоставляет log файл. Но если его нет, можно сделать его самим.
На уровне CMS можно начать логировать
function myIP(){ $ipa = explode( ',',@$_SERVER['HTTP_X_FORWARDED_FOR'] ); $ip = isset($_SERVER['HTTP_X_REAL_IP']) ? $_SERVER['HTTP_X_REAL_IP']: (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : (!empty($ipa[0]) ? $ipa[0] : '127.0.0.1')); return preg_match('#^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$#',$ip)?$ip:'127.0.0.1'; } file_put_contents('access.log', myIp().' - '.$_SERVER['REQUEST_URI']."\n", FILE_APPEND);
Получив ip злоумышленника, можно приступить к его блокировке. Выбор у нас небольшой.
Блокируем через htaccess. Достаточно добавить в htaccess одну строку
deny from 83.4.0.0
И данный ip будет проигнорирован apache сервером. Запросы с него не будут обрабатываться не только на php файлы, но и на любую статику (картинки, стили, скрипты). Если нужно заблокировать несколько ip адресов, то добавляем их построчно.
deny from 83.4.0.0 deny from 93.4.1.2 deny from 82.12.33.67 deny from 78.22.1.1
Если у вас не apache или еще какая-то беда, то можно блокировать ip адрес прямо в начале входного php файла. К примеру в Joomla это index.php
in_array(myIp(), array('83.4.0.0','93.4.1.2')) and die;
такая строка не даст запустить тяжелое подключение к БД и обработку пустого запроса, что существенно скажется на быстродействии Вашего сервера. Так можно защититься не только от тупой атаки, и от планомерно брутфорса паролей административной панели вашей CMS
Описанный выше механизм лучше автоматизировать. Считать количество вхождений ip адреса в файл access.log и по превышении определенного значения, блокировать этот ip. Так вы защитите свой магазин от парсера, даже если он будет использовать прокси сервера.
Для улучшения быстродействия, рекомендую использовать не файл, а таблицу в базе с типом Memory. Принцип тот же.
К сожалению - это то немногое, что вы сможете сделать на виртуальном сервере.
Выделенный сервер
На выделенном сервере - служба поддержки скорее всего разведет руками, и отправит Вас читать подобные мануалы по самозащите. Они дают Вам лишь железку. Как вы ею распорядитесь их не интересует. Однако у вас на этот раз гораздо больше возможностей, помимо описанных выше.
Все, что было написано для виртуального сервера, вы можете сделать и для выделенного. На одном из моих сайтов deny from здорово помогло, и ничего больше придумывать не пришлось.
Если же у Вас не получилось заблокировать ip злодея, или это не просто парсер, DDOS атака на весь сервер, то на уровне apache проблему не решить. Тут нужен более низкий уровень - SSH доступ.
Его вы получите в админке хостера. Для работы вам еще потребуется клиент. Я использую Xshell 5 Для домашнего использования он бесплатен, поэтому смело берем и пользуемся.
Как настраивать и использовать консоль я писать не буду. Об этом вы прочитаете в другой статье. Здесь мы предположим, что вы уже подключились по SSH к вашему серверу.
Небольшой ликбез необходимых команд для навигации.
Чтобы перейти в нужную папку вбиваем
cd адрес
к примеру
cd /var/
мы перейдем в папку var в корне сайта. Слэш в начале пути указывает на то, что путь будет полный. Если ввести команду так
cd var/
то это будет означать, что нам нужно перейти из текущей папки а ее подпапку с названием var. Будьте внимательны.
вернуться на одну папку вверх можно так
cd ..
Узнать содержимое папки
ls
Узнать содержимое в виде таблицы с правами на файлы и папки
ls -all
Установить права на файл или папку
chmod 644 index.php
chmod 755 images
Эти команду установят права только для этого файла и этой папки, не затрагивая папки и файлы внутри images. Чтобы установить права на все содержимое директории, необходимо добавить флаг -R (рекурсия)
chmod -R 755 images
Эта команда установит права для всех файлов и папок в images. Но часто бывают нужно установить одни права для файлов и другие для папок.
find -maxdepth 10 -type f -exec chmod 755 {} \;
установит всем файлам внутри текущей директории права 755. Число 10 означает глубину, на какую надо заходить внутрь папки. Буква f означает файл.
Для директорий соответственно будет
find -maxdepth 10 -type d -exec chmod 755 {} \;
Еще часто признаком взлома является стремительно уменьшающееся место на сервере. Узнать какая папка съедает больше всего места можно командой
du -sh ./* | sort -h
Или просто находим все файлы больше определенного размера
find ./* -size +100k
Узнать количество свободного места на диске можно так
df -h
Изменить файл можно при помощи 101-го редактора. Их очень много в составе Linux и у всех разные команды и функционал. Я пользуюсь vi
Открыть файл для редактирования
vi .htaccess
Вам откроется редактор. Но вбивать текст в нем нельзя, пока вы не нажмете клавишу i
. теперь можно редактировать файл. Когда вы закончили нужно вернуться в режим ввода команд. Это делает клавиша esc
Чтобы выйти из файла без сохранения вбиваете :q!
и жмете enter
Чтобы сохранить изменения, вводим :wq!
и жмем enter
Чтобы найти нужный файл можно воспользоваться поиском
find ./ -name "file.conf" find ./ -name "*.conf"
А вот так можно найти файл по регулярному выражению. В примере ищем php файл в котором есть короткая форма записи открывающего тега php
grep --include=\*.php -rnw './' -e '<?[^p=]'
Если вы подозреваете, что в папке JavaScript файлов затесался зловредный php файл, то можно запустить такую команду
find ./ -name '*.php' -exec rm {} \;
Она удалит все файлы в текущей папке с расширением php.
Частая задача: найти зловредный файл, в котором есть выполнения произвольного кода при помощи команды eval
find ./ -type f -exec grep -i -H "eval" {} \;
Найдет, все файлы, содержащие такое слово
Теперь вы умеете ходить по серверу и редактировать права и содержимое файлов. Это поможет Вам при редактировании конфигурационных файлов apache или nginx. Находить их на сервере теперь вы тоже умеете.
Но вернемся к защите от определенного ip адреса
Для начала надо определить - нас точно атакуют! Для этого узнаем сколько подключений сейчас идет на сервер.
netstat -na | grep ":80\ " | wc -l
выведет число подключений. Тут субъективно нужно определить, какое число будет для Вас большим. Для блога с посещением 500 человек в день, это число не должно превышать 100.
Далее узнаем то, что нас больше всего интересует. Самые активные IP адреса
netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more
Выведет список ip с количеством их подключений. Не пугайтесь, если у одного ip адреса будет больше одного подключения. Тут учитываются и статика: изображения, стили и т.п.
Еще на вершине будет ip вашего сервера. Тоже не пугайтесь и будьте внимательны. Блокировать его вам тоже не нужно.
Эта команда не всегда содержит адекватную информацию. на сервер может зайти бот Google или yandex, создавая сотню подключений и его тоже не нужно блокировать.
Еще можно понаблюдать какие запросы сыпятся на apache сервер в реальном времени. Для этого надо найти файл логов apache, обычно он лежит где-то тут
cd /etc/httpd/logs/
И запустить просмотр изменения файла в реальном времени
tail -f путь_к_файлу
тут вам тоже откроется много всего интересного. К примеру я узнал, что пару javascript скриптов с моего сайта как по CDN подключили пара высоконагруженных ресурса. Запрет hotlink'ов решил проблему.
Выяснив ip адрес можно его заблокировать через файрвол
iptables -A INPUT -s IP-ADDRESS -j DROP
Полностью отрежет доступ с IP-ADDRESS на сервер. Будьте очень осторожны. Как сказал один админ с моей работы: эта команда сродни выстрелу в ногу. Вы можете отрезать доступ и себе и SSH доступ тоже будет отрезан. Сделать что-либо сами вы уже не сможете. Только через службу поддержки или с другого компьютера.
Чтобы изменения вступили в силу надо вызвать
service iptables save
Кстати мониторить, кто долбит ваш сайт можно еще и через лог nginx, примерно так:
awk '{print $1 $2 $7}' /var/log/nginx/access.log | sort | uniq -c | sort -n
Дергаем из лога ip адреса и путь по которому долбят сайт. Сортируем, объединяем и вновь сортируем. Лучше удалить текущий лог файл и перезапустить nginx. Чтобы видеть в реальном времени, ip адреса с которых идет атака. Иначе лог может быть уже забит устаревшими данными.
Руками все это дергать то еще удавольствие. Как правило атака идет с сотни адресов и вбивать их каждый очень долго. На вооружение взял такой скрипт (замените у себя POST /api/1.0.0/auth/)
cat /dev/null > /tmp/iptables_ban.sh
awk '{print "iptables -A INPUT -p tcp -s " $2 " -j DROP" }' /tmp/botnet.blacklist | head -n 50 >> /tmp/iptables_ban.sh
# загружаем blacklist
bash /tmp/iptables_ban.sh
cat /dev/null > /var/log/nginx/access.log
Если злоумышленник уже уронил ваш сайт, то просто заблокировав ip вы его не поднимите. Самый простой способ перезагрузить весь сервер
reboot
Но можно точечно перезагрузить apache. Сделать это можно разными способами и на разных операционных системах и конфигурациях они разные.
так
systemctl restart nginx
или так
/etc/rc.d/init.d/httpd restart
или так
sudo /etc/init.d/httpd restart
Если нагрузка на сервер была существенная то скорее всего лежит и СУБД. Перезагрузить mysql можно так
sudo /etc/init.d/mysqld restart
Ну или по аналогии с apache
Backup
Если вы производите какие-то действия с сервером, то не забывайте делать бекап необходимых таблиц. На выделенном сервере - не надо использовать для этого phpmyadmin или какой-нибудь dumper. Делайте дамп через командную строку ssh, так чтобы дамп не был виден через web. Автор статьи на этом как-то погорел.
/usr/bin/mysqldump -u ПОЛЬЗОВАТЕЛЬ -p --opt --comments -v settings >settings.sql
Сделать дамп базы settings в файл settings.sql. Или отдельную таблицу
/usr/bin/mysqldump -u ПОЛЬЗОВАТЕЛЬ -p --opt --comments -v settings users>users.sql
Сохраняем таблицу users из базы settings в файл users.sql
Это все на сегодня. В данном разделе сайта - Защита сайта, будут публиковаться статьи о защите Вашего ресурса в том числе от парсинга и подобных.
Всего доброго! Пусть Ваши сайты не болеют! =)
Комментарии