Свой Linux сервер в интернете. Как настроить «безопасность»

Предисловие…

Приветствую Вас, друзья! Эта статья представляет собой очередной флешбэк из админского прошлого. буквально сегодня мне написал хороший товарищ, программист, с вопросом — как ему лучше для своего «домашнего» проекта настроить сервер. Цитата дословно (без ссылки на автора просто):

Нужен  совет. Есть VDS, торчит в интернете(сайте). Какие вещи я должен на нем сконфигурировать с точки зрения секьюрности? Кроме того чтобы настроить ssh на нестандартном порту с аутентификацией по ключу и запретить ssh для рута? Может надо как-то правильно расставить права на папки, может включить какие-то дополнительные механизмы, что-то в этом духе? А может и не надо больше ничего. Мне не надо упарываться по самые бубенцы, просто хочу немного обезопасить себя.

Вопрос как оказалось очень даже актуальный. Да, если вы регулярно администрирует Linux и веб сервера, казалось бы, «что тут сложного» и «как это программист не знает». А вот очень просто. Ну не работает человек с этим постоянно. Имеет право не знать. Поэтому сегодня мы поговорим с Вами о настройке Linux сервера под сайт или любое другое веб приложение, в случаях когда этот самый сервер должен быть доступен из публичной сети интернет. Погнали!

Первое, о чем мы с Вами условимся — это не будет стандартный шаблонный How-to гайд с тонной команд без комментариев, мол вот это и это сделай и будет тебе счастье. Таким, простите за мой французский, низкопробным шлаком, Интернет переполнен. Я буду говорить о том что нужно сделать, как и почему, давая ссылки на документацию или авторитетные источники и уже в последнюю очередь — может буду приводить команды.

Второе о чем мы с Вами условимся — если будут примеры, они будут привязаны к Ubuntu как к ОС Вашего сервера. Сейчас любой Облачный провайдер или хостинговая компания позволяет Вам развернуть свой виртуальный сервер на базе этого Linux дистрибутива. Она ( Ubuntu) дружественна к пользователям, есть поддержка всего программного обеспечения какое только существует под Linux и т.д. Опять же, никто не мешает Вам применять эти рекомендации для любого другого дистрибутива, например Centos, просто используя другой набор команд. Например  для установки ПО.

Третье и самое главное — это НЕ исчерпывающее руководство. Это просто список тех МИНИМАЛЬНЫХ мер «гигиены» которые Вы должны предпринять или убедиться что они предприняты по умолчанию, чтобы Ваш сервер хорошо себя чувствовал и радовал Вас стабильным аптаймом

Поехали!

Настройки ОС

Нус, с чего нам стоить начать?

Пункт первый — ставьте обновления! Черт возьми- первым делом после установки сервера — ставьте обновления! И в дальнейшем старайтесь про ни не забывать. Обновления в первую очередь закрывают баги и дыры в безопасности.

Шаг Второй — заведи учетную запись отличную от root. В 99% случаев аренды vps/vds Вам отдают виртуальную машину с единственной учетной записью — root. Это нормально. не нормально — оставлять ее просто так. Заведите отдельную учетку, с правами на sudo или без — уже Вам решать. Но сделайте это. А так же смените root пароль, чтобы не оставлять тот, который Вам изначально сгенерировал хостер. Мало ли что.

Кстати «о птичках» — если работать на сервере Вы будете не один, используя sudoers файлы, можно отлично «нарезать» привелегированный доступ другим сотрудникам, не выдавая им при этом возможность завладеть root привелегиями. Вот пример  часто используемого мною файла sudoers, чтобы предоставить например веб-разработчикам на «продакшен» сервере довольно широкие права для исследования проблемы, но при этом без полного доступа к системе:

Если не очень понятно что это и зачем — милости просим читать про sudo утилиту и sudoers файлы

Шаг четвертый — настройте правильно SSH. Тут существует 3 простые и максимально действенные настройки:

  • Отключите вход по учетной записью root (саму запись можно не выключать, просто в настройках sshd скажите «PermitRootLogin no» )
  • Сгенерируйте для себя ssh ключ, установите его на сервер под Вашей учетной записью, проверьте доступ по ключу и наконец отключите вход по паролю («PasswordAuthentication no»)
  • «Скройте» стандартный ssh порт от всего Интернет. Самый простой способ для этого — переключите ssh на не стандартный порт ( т.е отличный от 22). Зачем это нужно — в сети огромное число ботов и авто сканирующих программ, которые просто рыщут по доступным ip адресам и найдя открытый 22 ssh порт, начинаю его брутфорсить. Посмотрите записи вашего лога аутентификаци и в реальном времени — «tail -f /var/log/auth.log», спустя  час после запуска вашего сервера, а потом повторите эту процедуру после смены порта и перезапуска ssh — сразу поймете о чем я)
  • Другие способы — это спрятать ssh за vpn, разрешить подключение к ssh только с определенных ip адресов  с помощью firewall (например с вашего домашнего/рабочего адреса, если у Вас там статический IP)

Шаг пятый — раз уж мы заговорили про SSH, стоит вспомнить про тот факт, что не только Вы используете ключи при работе с сервером, но и он при работе с Вами. При установке OpenSSH сервера, происходит автоматическая генерация ключей для него, тем самым гарантируется их уникальность ( а значит и безопасность) для каждой новой инсталляции. Однако, нередко хостеры грешат тем, что при заказе Вами у них виртуалки, они не устанавливают ее «с нуля» а просто клонируют ее Вам из шаблона, сохраняя всю «начинку» ( и сгенерированные 1 раз ключи, и устаревшие пакеты без обновлений). Я уже писал про один такой хостинг. Как резюме — да, это плохо, да, про это надо помнить. Что в такой ситуации делать? Просто взять и перегенерировать эти ключи вручную с последующим перезапуском сервера. Вот пример из моего Ansible Playbook для настройки нового сервера, где  я безапелляционно делаю:

Шаг шестой — настройка firewall. Да, да, да.. Если у Вас простой и не притязательный веб сервер, наружу у вас должны быть открыты 3 порта — два для web трафика (80 — http, 443 — https) и порт для ssh ( о том какой и как — говорили выше). Все! Все прочее должно быть закрыто наглухо. Ваш Firewall должен исповедовать политику «все что не разрешено явно, должно быть запрещено» — то есть для входящего трафика мы пишем 3 разрешающих правила, и выставляем политику по умолчанию в запрещающем режиме. Правда не стоит забывать, что так же нам нужно разрешить трафик, который возвращается на наш сервер в ответ на наши запросы с него. Т.е. трафик инициированный нами.  Это так называемые «Established and Related Incoming Connections» — благо Linux-овый firewall «Netfilter» ( да именно он является фаерволом а не iptables, как многие пишут. iptables лишь утилита управления!) является statefull firewall — то есть он умеет в определение соединений и их состояний. Тут я могу посоветовать три модели поведения:

Собственно выбор за Вами! И еще нюанс — настоятельно рекомендую, так же подумать над ограничительными правилами для исходящего трафика! Порой бывает полезно!

Веб сервер

Так как статья нацелена именно на вопросы security а не на вопросы просто настройки веб сервера, я буду краток. на Вашем сервере с вероятностью 99% будет либо nginx, либо apache. При условии что оба они обновлены (стоят последние пакеты со всеми патчами), сами по себе они безопасны. Вопрос сводится только к настройкам:

Веб сервер должен быть запущен от имени отдельного пользователя! Не root, не ваша учетка! Отдельный юзер, в настройках которого, в качестве командной оболочки стоит nologin. То есть, если веб сервер будет взломан и через него зальют некий shell скрипт, злоумышенник не сможет его запустить на Вашей машинке и не получит доступа к управлению:

Как видно на скриншоте,  рабочий процесс Nginx работает из под пользователя www-data, для которого оболочкой стоит nologin.

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

Конфигурация веб сервера для Вашего сайта должна содержать инструкцию, которая разрешает обращение к «админке» только с определенных адресов. Вот пример для nginx:

И наконец последний из моих советов (но не из всех действий которые Вы можете сделать) — это обязательно настройте httpS! Вот прям щас! Ранее я уже писал про Let’s Encrypt и применение certbot. С этими ребятами получить и установить себе SSL сертификат — да как два пальца…

Ну что, думали это всем? А вот нет уж… Это Минимальные действия которые Вы ДОЛЖНЫ предпринять.

Вот только офф гайды что еще можно сделать:

И Блогерские рекомендации по харденингу:

База данных

Тут все довольно просто. Скорее всего Вы используете MySQL или ее вариации (MariaDB или Percona Server). 

Первым делом убедитесь, что Ваш движок СУБД не открыт всему миру, а слушает только локальный порт:

Далее — ваш сайт должен иметь отдельную базу, и отдельного пользователя внутри СУБД, которому разрешено пользоваться только этой базой и более ничем:

Ну и в конце — есть такой замечательный скрипт от самих разработчиков MySQL, как mysql_secure_installation, который позволит Вам быстро и просто подкрутить настройки безопасности СУБД, без страха сломать Вашу базу.

Дополнительные меры

Fail2ban

Одной из дополнительных мер защиты, которую я настоятельно рекомендую применять в любом случае, является установка и настройка службы fail2ban. Это очень хороший инструмент борьбы с различными брутфорсерами и сканировщиками в автоматическом режиме без вашего участия. Инструмент парсит логи различных служб ( поддерживется очень большое число популярных — начиная от ssh и заканчивая различными ftp сервисами) на предмет нездоровой активности, вычисляет источник и банит его по ip адресу, добавляя в специально созданное правило firewall. Для общего развития советую так же ознакомиться вот с такой статьей на хабре.  

По умолчанию, fail2ban готов защищать ваш ssh сервер ( только в нашем случае нужно будет в настройках сменить порт с стандартного под псевдонимом ssh на тот который Вы указали в настройках sshd)

Как быть, если он забанил легитимного пользователя/адрес (например коллегу), а времени ждать пока произойдет анбан нет (срочная работа или Вы таймер бана поставили на неделю). Очень просто — находим что в цепочке ssh есть забаненый

смотрим кто это

если адрес совпал с тем кого надо разбанить — даем команду на анбан

Мониторинг

Все же, за сервером лучше присматривать. Мало ли- его там dos-ят, или таки взломали, а может кончается место на диске и вот вот «ляжет» база данных. Ситуаций есть много! Что я могу тут порекомендовать — установите систему мониторинга. Лучше отдельно ( да, это потребует отдельный, пусть и небольшой сервер, но мы же считаем что Ваш сайт для вас важен). Сейчас есть много систем мониторинга — по соотношению простота/возможности из коробки/удобство использования/объем информации в сети, на первом месте для меня Zabbix. В случае сложных и серьезных проектов его первенство спорно — возможно лучше взять Prometheus или TICK/TIG стэк. Но тут он подойдет как нельзя кстати.

Поэтому ставим, используя русскоязычную (полную и актуальную) документацию, «из коробки» получаем необходимым минимум и если не хватает уведомлений на почту — настраиваем хоть в Telegram, хоть в Slack.

Уведомления

Возможно Вам захочется получать каждое утро сводку новостей от сервера- что случилось, что изменилось и тд. Когда у вас таких серверов десятки это конечно перебор, но когда он один любимый, почему бы нет. В этом Вам поможет LogWatch — утилита парсит логи сервисов, за которыми вы ей приказали следить, и шлет вам на почту отчет регулярно в указанное время  в виде симпатичного простого отчета:

Хотя по большому счету конечно хранение и анализ логов лучше доверить чему-то по серьезней, типа rsyslog +LogAnalyzer или ELK.

Но мы помним что вопрос идет про 1 сервер!

Сканирование

Время от времени не плохо было бы проверить Ваш сервер — а не забыли ли Вы чего, а не поселилось ли там что? Для этого нам помогут различные сканеры:

Заключение

На этом все. Друзья — спешу повторить, что эта статья НЕ является исчерпывающим руководством. Это БАЗА, которую нужно знать и применять. Существует огромное множество руководств по настройкам и харденингу, как более подробных, так и узкоспециализированных, затрагивающих вопросы, которых мы в рамках данной статьи не касались — например тюнинг ядра Linux для повышения сетевой безопасности.  Но эти меры уже нельзя назвать общими и применимыми в 99% случаев. Скорее наоборот — Вы четко должны понимать зачем вы это делаете, а главное ЧТО вы собираетесь делать и какие последствия это действие может за собой повлечь.

Всем спасибо, до новых встреч! Всем высокого аптайма!

П.С. Подписывайтесь на мой Telegram канал