Как вы защищаете сервер от взлома?

Ответьте параноику.
Итак, что было сделано:
сервер:
- запретил вход из под рута по SSH
- поменял порт SSH
- повесил fail2ban на mysqld, ssh с количеством попыток 3
- для каждого сайта создал своего пользователя mysql
- запретил заходить выше /var/www по SSH, без sudo su

сайты:
- так как использую Yii2, все данные из базы берутся с помощью PDO/AR, с биндингами
- запретил выполнение скриптов в папках, куда загружаются файлы
- включил csrf
- включил https
- шифрую данные клиентов, такие как email и пароль. Пароли не храню вообще, храню хеши. MD5 + соль надежно ли?
- бекапы еженедельно.

Можно ли теперь спать спокойно или что-то я упустил? Как вы защищаете сервера от доступа извне?
  • Вопрос задан
  • 7645 просмотров
Решения вопроса 1
OnYourLips
@OnYourLips
повесил fail2ban на mysqld с количеством попыток 3
Бесполезно. По умолчанию он только в 127.0.0.1 открыт. А если вы поменяли это поведение, то меняйте обратно.

для каждого сайта
1 сервер - 1 сайт. Так гораздо удобнее и безопаснее.

запретил выполнение скриптов в папках, куда загружаются файлы
Лишнее. Без специально оставленной дыры исполняемые файлы туда не попадут.

шифрую данные клиентов, такие как email и пароль.
Бессмысленно. Если есть доступ к серверу, то и расшифровать смогут.

Можно ли теперь спать спокойно или что-то я упустил?
Файрвол? Он особо не нужен, но на всякий случай ставят, всего парой команд.
Чтобы убедиться, что только порты из белого списка открыты.
К тому же основная ошибка сейчас - это логическая ошибка уровня приложения, когда не всегда проверяются права на определенные действия.
Ответ написан
Пригласить эксперта
Ответы на вопрос 11
@lubezniy
Можно выключить сервер.
Ответ написан
Комментировать
Используйте контенеры. Создавайте отдельный контейнер со всем софтом для каждого сайта отдельно. В корневой системе оставьте только базовый софт и фаервол. Прокиньте внутрь только 80/443 порты. Ну и ссх по ключу в корневой. Даже если вам таки взломают один из сайтов - проникнуть в соседний контейнер будет проблематично. Что бы не настраивать каждый контейнер ручками - используйте chef/ansible или что угодно на ваш вкус. И каждый новый сайт - новый контейнер со своими mysqld/php/nginx и всем остальным. Даже если случайно установите что-то не защищенное из софта - получить к нему доступ их вне проблематично.
Создайте отдельный контейнер с nginx на который фаервол перенаправит 80/443 порты. А он уже проксирует запросы в нужные контейнеры. В нем же храните и SSL сертификаты и ключи. Что б их не угнали при взломе.
И конечно ossec или аналоги + оповещения от него. Расскажут вам о вторжении в тужу минуту. Ставить в каждый контейнер.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
сервер:
- запретил вход из под рута по SSH
ни разу на тысячах серверов у меня не сломали рута за 10 лет

- поменял порт SSH
просто засканить можно ваш новый порт, тоже смысла нет

- повесил fail2ban на mysqld, ssh с количеством попыток 3
ни разу у меня не подобрали пароль на мускул или ссх на тысячах серверов за 10 лет , используйте длинные генеренные пароли и спите спокойно, от реальной угрозы если вы профукали пароль это не спасет

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

- запретил заходить выше /var/www по SSH, без sudo su
вообще зачем кому то разрешать туда заходить

используйте авторизацию по ключам а не по паролям для ссх
Ответ написан
un1t
@un1t
Нужно еще запретить весь входящий трафик на порты кроме 22, 80, 443.
Ответ написан
@kstyle
MD5 + соль надежно ли?

password_hash давно пора
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Я вот минимально написал тут про защиту сайта, кому интересно - Welcome!
Ответ написан
Комментировать
selivanov_pavel
@selivanov_pavel
Linux admin
- еженедельный бекап - ИМХО слишком редко, хотя бы ежедневный
- после обновлений не забывать перезапустить сервисы, которым нужно подхватить новые либы. Можно посмотреть, что требует перезапуска, с помощью needrestart -r l
- веб-приложения можно закрыть WAF. Есть modsecurity, есть naxsi(только для nginx). Но это требует значительного времени на настройку и поддержку
- можно поставить HIDS, например ossec. После грамотной настройки ловит подозрительную активность, надо не забывать регулярно просматривать отчёты
- можно поставить NIDS: snort, suricata
- можно почитать PCI DSS и реализовать понравившиеся моменты
Ответ написан
zooks
@zooks
Frontend и Django
повесил fail2ban на mysqld

Нужно закрыть внешний доступ к MySQL:
sudo mysql_secure_installation

для каждого сайта создал своего пользователя mysql

Нужен не только отдельный MySQL пользователь, но и пользователь на уровне ОС - это даже важнее.
Ответ написан
@Vaavaan
Вход по SSH только по ключу. Не по паролю.
Изоляция приложений в отдельных контейнерах. Всех приложений. Как правило 1 приложение 1 контейнер. Ну в крайнем случае - chroot на каждый сайт.
Открыть на файрволе только необходимые порты (как правило 22, 80, 443 и все).

но если у вас текучий движок сайта - то все плохо.
обновлять регулярно.
продумать еще раз как выставить права на каталоги.

бэкапы ежедневно.
Ответ написан
@res2001
Developer, ex-admin
Соберем все в кучу:
1.ssh - запрет рута, вход по ключу.
2.фаервол - запретить все, кроме нужного.
3.контейнеры для каждого приложения.
4.запретить mysql смотреть на ружу.
5.сменить хэш md5 на более современный алгоритм.
Ответ написан
@alexdora
Топ-менеджер корпорации
Посмотрел я этот пост и вспомнил, как перед нг настроивал своего монстра. Перечитал много ненужной информации на тему безопасности. Чего только не советую делать и не делать.
В итоге плюнул: длинный пароль на
SSH + fail2ban
Виртуализация на XEN, под каждый сервис своя виртуалка. 2 виртуалки с http/mysql. Между двумя mysql репликация.
Бэкапятся ежедневно все виртуалки

Ну и так как я далек от сисадминства и ленивый шопипец:

При заходе по ssh из вне >> sms на телефон
И пару скриптов с говорящими названиями и запускаемые через бота telegram:
Сосискасарделька - поменять местами http виртуалки
mayday - завершение виртуалок, бэк-ап, перекинуть на диск и зашифровать случайным ключем диск целиком. У меня на тесте это делается за 15 секунд.
Жопа - закрыть все порты.

PS: Mysql смотрит наружу, это нужно. Пароли везде длинные. Но сам пользуюсь phpmyadmin, который весит на домене прописанном в hosts на своей машине. Нет домена - нет доступа. Очень удобно.
Еще изменил настройки fail2ban. Чтоб бан был не 15 минут, а сразу сутки. По SSH мало кто ломает, 2-3 бана в день. А вот на SIP порты список бана в день переваливает за 300 правил.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы