Невозможно защитить сервер от внешнего доступа раз и навсегда, ведь каждый день обнаруживаются новые уязвимости и появляются новые способы взлома сервера. О защите серверов от несанкционированного доступа мы и расскажем в этой статье.
Сервера любой компании рано или поздно могут стать мишенью для взлома или вирусной атаки. Обычно результатом такой атаки становится потеря данных, репутационный или финансовый ущерб, поэтому вопросам обеспечения безопасности серверов стоит уделить внимание в первую очередь.
Следует понимать, что защита от взлома серверов – это комплекс мер, в том числе подразумевающий постоянный мониторинг работы сервера и работу по совершенствованию защиты. Невозможно защитить сервер от внешнего доступа раз и навсегда, ведь каждый день обнаруживаются новые уязвимости и появляются новые способы взлома сервера.
О защите серверов от несанкционированного доступа мы и расскажем в этой статье.
Способы и методы защиты серверов от несанкционированного доступа
Физическая защита сервера
Физическая защита. Желательно, чтобы сервер находился в защищенном ЦОДе, закрытом и охраняемом помещении, у посторонних не должно быть доступа к серверу.
Установите аутентификацию по SSH
При настройке доступа к серверу используйте аутентификацию по ключам SSH вместо пароля, поскольку такие ключи гораздо сложнее, а иногда и попросту невозможно взломать с помощью перебора вариантов.
Если же считаете, что вам все-таки требуется пароль, обязательно ограничьте число попыток его ввода.
Обратите внимание, если при входе вы видите подобное сообщение:
Last failed login: Tue Sep 28 12:42:35 MSK 2017 from 52.15.194.10 on ssh:notty
There were 8243 failed login attempts since the last successful login.
Оно может свидетельствовать, что ваш сервер пытались взломать. В таком случае для настройки безопасности сервера смените порт SSH, ограничьте список IP, с которых возможен доступ к серверу или установите ПО, автоматически блокирующее чрезмерно частую и подозрительную активность.
Регулярно устанавливайте последние обновления
Для обеспечения защиты сервера вовремя устанавливайте последние патчи и обновления серверного ПО, которое используете – операционной системы, гипервизора, сервера баз данных.
Желательно проверять наличие новых патчей, обновлений и сообщения об обнаруженных ошибках / уязвимостях каждый день, чтобы предотвратить атаки, использующие уязвимости нулевого дня. Для этого подпишитесь на новости от компании-разработчика ПО, следите за ее страницами в соцсетях.
Защищайте пароли
До сих пор одним их самых распространенных способов получить доступ к серверу является взлом пароля сервера. Поэтому придерживайтесь общеизвестных, но тем не менее актуальных рекомендаций, чтобы не оставить сервер без защиты:
- не используйте пароли, которые легко подобрать, такие как название компании;
- если вы до сих пор используете дефолтный пароль для консоли администратора – немедленно измените его;
- пароли на разные сервисы должны быть разными;
- если вам необходимо передать пароль кому-либо, никогда не отправляйте IP-адрес, логин и пароль в одном и том же письме или сообщении в мессенджере;
- для входа в учетную запись администратора можно установить двухэтапную аутентификацию.
Файрвол
- Убедитесь, что на сервере есть , он настроен и он работает все время.
- Защищайте и входящий, и исходящий трафик.
- Следите за тем, какие порты открыты и для каких целей, не открывайте ничего лишнего, чтобы снизить число вероятных уязвимых мест для взлома сервера.
В частности, файрвол очень помогает в защите сервера от ddos атак, т.к. можно быстро создавать запрещающие правила файрвола и вносить в них IP-адреса, с которых идет атака, или блокировать доступ к определенным приложениям, по определенным протоколам.
Мониторинг и обнаружение вторжений
- Ограничьте ПО и службы, работающие у вас на сервере. Периодически проверяйте все, что у вас запущено, и если обнаружатся какие-то незнакомые вам процессы, удаляйте их немедленно и начинайте проверку на вирусы.
- Периодически проверяйте наличие следов взлома. О взломе могут свидетельствовать новые учетные записи пользователей, которые вы не создавали, перемещение или удаление файла /etc/syslog.conf , удаленные файлы /etc/shadow и /etc/passwrd .
- Мониторьте работу вашего сервера, следите за его обычной скоростью и пропускной способностью, так вы сможете заметить отклонения, например, когда нагрузка на сервер стала значительно больше обычного.
Использование VPN и шифрования SSL/TLS
Если необходим удаленный доступ к серверу, он должен быть разрешен только с определенных IP-адресов и происходить по VPN.
Следующим этапом обеспечения безопасности может быть настройка SSL, которая позволит не только шифровать данные, но и проверять идентичность других участников сетевой инфраструктуры, выдавая им соответствующие сертификаты.
Проверка безопасности сервера
Хорошей идеей будет самостоятельная проверка безопасности сервера методом пентеста, т.е. моделирование атаки, чтобы найти потенциальные уязвимости и вовремя их ликвидировать. Желательно привлечь к этому специалистов по информационной безопасности, однако некоторые тесты можно проделать и самостоятельно, используя программы для взлома серверов.
Что еще грозит серверам кроме взлома
Сервер может выйти из строя по ряду других причин, кроме взлома. Например, это может быть заражение вредоносным ПО или просто физическая поломка какого-либо из компонентов.
Поэтому мероприятия по защите сервера должны включать:
- Установку и обновление программ для защиты сервера – антивирусов.
- Регулярные зашифрованные копии данных, по меньшей мере, раз в неделю, поскольку, согласно статистике, жесткие диски сервера на первом месте по частоте поломок. Убедитесь, что резервная копия хранится в физически безопасной среде.
- Обеспечение бесперебойного электропитания серверной.
- Своевременная физическая профилактика серверов, включающая их чистку от пыли и замену термопасты.
Опыт специалистов “Интегруса” говорит нам, что лучшая защита от такого рода угроз – это применение лучших практик в области систем защиты серверов.
Для обеспечения безопасности серверов наших заказчиков мы применяем сочетание инструментов:брандмауэры, антивирусы, технологии безопасности / управления событиями (SIM / SEM), технологии обнаружения вторжений / защиты (IDS / IPS), технологии сетевого поведенческого анализа (NBA), конечно же регулярное профилактическое обслуживание серверов и обустройство защищенных серверных под ключ. Это позволяет свести риски взлома или отказа сервера по другим причинам к минимуму.
Готовы провести аудит безопасности серверов вашей компании, провести консультирование специалистов, выполнить все виды работ по настройке защиты серверного оборудования.
Большинство программ должны взаимодействовать с пользователем посредством ввода определённых данных, будь то ФИО, рост, вес для внесния в базу данных или геометрические размеры какого-то объекта, для которого нужно что-то рассчитать. Все эти данные вводит пользователь - человек, а значит в ответ может придти всё что угодно. Что выдаст программа, если вместо требуемого ей возраста пользователь напишет его словом? Скорее всего программа аварийно завершится или зависнет, но только не в том случае, если в ней предусмотрена "защита от дурака".
Почему программа может завершиться или зависнуть? Программа попытается перевести набор символов в число, что сделать не удастся, а значит дальнейшая работа приложения не определена. Поэтому очень важно организовывать структуру программы так, чтобы при вводе неожиданных для программы данных (некорректных с точки зрения требуемого формата: нужно число, а вводится слово), приложение не "падало", а сообщало пользователю о том, что произошла ошибка и предлагало повторить ввод. Это и есть "защита от дурака".
Реализация защиты от дурака на языке C
Чтобы реализовать хорошую защиту от дурака для ввода различных числовых (int, double...) данных, необходимо считывать не сами числа, а всю вводимую строку и уже потом анализировать ввод. В языке C есть очень хорошая функция sscanf(const char *, const char *, args) , которая работает аналогично функции scanf(const char *, args) , возвращая количество успешно считанных аргументов, только чтение данных происходит не из стандартного потока ввода, а из переданной ей первым аргументом строки.
Рассмотрим несколько примеров функций, которые реализуют проверку на дурака, используя функцию sscanf .
Ввод целого числа с проверкой на некорректный ввод
int get_integer(const char *msg) { char answer; // строка для чтения int n; // итоговое целое число printf("%s", msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будет считано целое число while (sscanf(answer, "%d", &n) != 1) { printf("Incorrect input. Try again: "); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку } return n; // возвращаем корректное целое число }Чтобы считать целое число, алгоритм считывает всю строку и затем пытаеся получить из неё целое число. В том случае, если это не удалось, функция выводим сообщение об ошибке с предложением повторить ввод до тех пор, пока не будет введено корректное значение целого числа.
Ввод вещественного числа с проверкой на некорректный ввод
double get_double(const char *msg) { char answer; // строка для чтения double x; // итоговое вещественное число printf("%s", msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будет считано вещественное число while (sscanf(answer, "%lf", &x) != 1) { printf("Incorrect input. Try again: "); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку } return x; // воозвращаем корректное вещественное число }Ввод точки на координатной плоскости (структура с двумя вещественными полями)
// описание структуры даных typedef struct point_t { double x; // координата x double y; // координата y } point_t; point_t get_point(const char *msg) { char answer; // строка для чтения point_t point; // итоговая точка printf("%s", msg); // выводим приглашение ко вводу fgets(answer, sizeof(answer), stdin); // считываем строку // пока не будут считаны обе координаты точки while (sscanf(answer, "(%lf,%lf)", &point.x, &point.y) != 2) { printf("Incorrect input. Try again: "); // выводим сообщение об ошибке fgets(answer, sizeof(answer), stdin); // и заново считываем строку } return point; // возвращаем корректную точку }Как видно из примеров, особенность возвращения функцией sscanf числа считанных аргументов позволяет контролировать корректность введённых данных в указанном формате, а считывание всей строки защищает от того, что в потоке ввода останутся символы пробела или переноса строки "\n" , которые уж очень часто заставляют потратить на поиск ошибки ни один час или даже день.
Обзор