Лучшие практики для обеспечения безопасности вашего сервера

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

· 8 минуты на чтение
Лучшие практики для обеспечения безопасности вашего сервера

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

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

Cтатья не является “рецептом”, в котором надо выполнить все пункты. Некоторые пункты не нужны, если вы выполнили другие. Поэтому выберете только необходимые вам. Я же придерживаюсь следующего рецепта.

Поскольку мы будем вносить изменения в SSH, важно не закрывать ваше первоначальное SSH-соединение. Вместо этого откройте второй сеанс SSH для тестирования. Это делается, чтобы избежать блокировки вашего сервера в случае ошибки в конфигурации SSH.
Спонсор поста

Устанавливайте обновления

Эффективность: 🛡️ 🛡️ 🛡️

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

Это включает операционную систему, веб-сервер и любое другое программное обеспечение, работающее на вашем сервере. Разработчики часто выпускают исправления и обновления программного обеспечения для устранения уязвимостей и ошибок в системе безопасности. Если не устанавливать эти обновления, ваш сервер может стать уязвимым для атак.

Для Fedora, CentOS, RHEL команда на обновление выглядит так

sudo dnf upgrade

Для Ubuntu / Debian

sudo apt update && sudo apt upgrade -y

Замена стандартного порта SSH

Эффективность: 🛡️ 🛡️

Большинство ботов сканируют только дефолтный порт (22). Сменив его, вы защититесь от ботов работающих на дурака.

Firewall

Перед сменой порта разберитесь, какой firewall стоит на вашей системе. Например на CentOS/RHEL это скорее всего firewalld.

Вам необходимо открыть новый порт для ssh, и закрыть старый. Например, если у вас установлен firewalld, а порт вы выбрали 58291, то команды для открытия порта будут такие:

firewall-cmd --zone=public --add-port=57622/tcp --permanent
firewall-cmd --reload

Если этого не сделать, вы не сможете войти на сервер.

Для изменения порта нужно отредактировать файл /etc/ssh/sshd_config. В этой статье мы будем часто этим заниматься. Всякий раз, когда вам нужно отредактировать этот файл, используйте следующую команду:

sudo nano /etc/ssh/sshd_config

В открывшемся файле найдите следующую строку: #Port 22 Удалите решетку и измените номер порта, например на 58291. Номер не должен превышать 65535. Рекомендую выбрать пятизначное значение.

Также удостоверьтесь, что выбранное вами значение не конфликтует с другими сервисами в системе, например mysqld использует порт 3306, httpd — 80, ftpd — 21.

После этого необходимо перезапустить службу ssh:

sudo systemctl restart sshd

Для входа с использованием нового порта используйте следующий флаг:

ssh username@remote_host -p 58291

Config SSH

Чтобы не запоминать порты ко всем своим серверам, можно воспользоваться файлом ~.ssh/config. Создайте этот файл, если его нет на вашей локальной машине.

Пример .ssh/config

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

ssh my_server

Также можно добавить другие параметры в конфигурацию, например, использовать разные ключи ssh для аутентификации или настроить прокси-серверы.

Создание нового пользователя

Эффективность: 🛡️ 🛡️ 🛡️

Входить на сервер как root пользователь плохая практика. Лучше входить в систему как обычный пользователь и использовать sudo для выполнения действий, требующих привилегий root.

🤓
Root — это учётная запись, которая имеет доступ ко всем без исключения действиям. Да, вообще ко всем.

Добавим нового пользователя, для альтернативы root.

sudo adduser имя_пользователя

Если вас не попросили придумать пароль для пользователя, то установите его вручную.

passwd имя_пользователя

Я предполагаю, что мы заблокируем root пользователя, поэтому после этого добавим пользователя в группу sudo:

usermod -aG sudo имя_пользователя
На некоторых ОС эта группа называется wheel.
usermod -aG wheel имя_пользователя

Для каждого пользователя sudo можно задать ограничения: разрешить запускать только определенные команды от имени супер пользователя.

🙅‍♂️ Запрет входа root пользователя

Эффективность: 🛡️ 🛡️ 🛡️ 🛡️ 🛡️

Вы не должны позволять root входить в ваш SSH-сервер. Если злоумышленник получит доступ к root-аккаунту, то он будет иметь полный контроль над сервером. Подключение должно быть разрешено только обычным пользователям. Если им нужно выполнить административную задачу, им также следует использовать sudo.

Если вы вынуждены разрешить пользователю root вход в систему, вы можете хотя бы заставить его использовать ключи SSH.

Открываем текстовый файл в любом редакторе:

sudo nano /etc/ssh/sshd_config

Нас интересует параметр PermitRootLogin:

  • Если вы хотите вообще запретить пользователю root вход в систему, установите PermitRootLogin no.
  • Если вы собираетесь разрешить пользователю root входить в систему, но хотите использовать только SSH-ключи, установите PermitRootLogin prohibit-password.

После внесения вышеуказанных изменений сохраните и закройте файл. Затем перезапустите службу SSH, чтобы внесенные изменения вступили в силу.

systemctl restart sshd

Заблокировать пароль root

Эффективность: 🛡️ 🛡️ 🛡️ 🛡️

Я обычно блокирую пароль для пользователя root. Это не позволит обычному пользователю перейти в root пользователя с помощью команды su.

Важно понимать, что это не блокировка учетной записи. Пользователь всё ещё может войти в систему с помощью другого способа аутентификации (например, с помощью ключа SSH), но не сможет войти с помощью пароля.

Для этого заходим на сервер под пользователем, обладающим правами sudo. И вводим следующую команду:

sudo passwd -l root

🔐 Используйте SSH ключ вместо пароля

Эффективность: 🛡️ 🛡️ 🛡️ 🛡️ 🛡️ 🛡️

Сервер OpenSSH поддерживает различную аутентификацию. Пароли можно угадывать, взламывать или подбирать методом перебора. Ключи SSH не подвержены таким атакам.

Когда вы генерируете ключи SSH, вы создаете пару ключей. Один из них - публичный (открытый) ключ, другой — приватный (закрытый). Открытый ключ передается на сервера, к которым вы хотите подключиться. Закрытый ключ, хранится в безопасности на вашем компьютере.

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

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

Схематичный процесс авторизации по SSH ключу

Создание ssh ключей

И так, генерация ключей ssh выполняется командой:

ssh-keygen

Утилита предложит вам выбрать расположение ключей. По умолчанию ключи располагаются в папке ~/.ssh/. Лучше ничего не менять, чтобы все работало по умолчанию и ключи автоматически подхватывались. Секретный ключ будет называться id_rsa, а публичный id_rsa.pub.

Затем утилита предложит ввести пароль для дополнительного шифрования ключа на диске. Его можно не указывать, если не хотите.

Теперь у вас есть открытый и закрытый ключи SSH и вы можете использовать их для проверки подлинности. Дальше нам осталось разместить открытый ключ на удаленном сервере.

Никогда и никому не передавайте свой закрытый ключ.

Загрузка ключа на сервер

Самый простой способ скопировать ключ на удаленный сервер - это использовать утилиту ssh-copy-id. Она входит в пакет программ OpenSSH. Но для работы этого метода вам нужно иметь пароль доступа к серверу по SSH.

Синтаксис команды:

ssh-copy-id username@remote_host

Если вы хотите указать путь до публичного ключа, используйте команду:

ssh-copy-id -i /path_to_key username@remote_host

При первом подключении к серверу система может его не распознать, поэтому вам нужно ввести yes. Затем введите ваш пароль пользователя на удаленном сервере. Утилита подключится к удаленному серверу, а затем использует содержимое ключа id_rsa.pub для загрузки его на сервер в файл ~/.ssh/authorizedkeys. Дальше вы можете выполнять аутентификацию с помощью этого ключа.

Если такой способ по какой-либо причине для вас не работает, вы можете скопировать ключ по ssh вручную. Мы создадим каталог ~/.ssh, а затем поместим наш ключ в файл authorized_keys с помощью символа >>, это позволит не перезаписывать существующие ключи:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Здесь вам тоже нужно набрать yes, если вы подключаетесь к новому серверу, а затем ввести пароль.

Также необходимо убедиться, что имеется возможность входа по ssh ключу. Для этого в файле /etc/ssh/sshd_config должна присутствовать строка PubkeyAuthentication yes.

После этого вы можете использовать созданный ключ для аутентификации на сервере:

ssh username@remote_host

Если вы не захотели создать ssh ключ с доступом по паролю, то вы сразу же будете авторизованы, что очень удобно. Иначе, сначала вам придется ввести фразу-пароль для расшифровки ключа.

🙅‍♂️ Запрет авторизации по паролю

Эффективность: 🛡️ 🛡️ 🛡️ 🛡️ 🛡️

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

Прежде чем запрещать вход по паролю, проверьте возможность входа по ssh ключу.

Нам нужно отредактировать ваш файл конфигурации SSH.

sudo nano /etc/ssh/sshd_config

Находим строчку PasswordAuthentication yes и меняем ее на PasswordAuthentication no.

Теперь сохраните файл и перезапустите службу ssh:

sudo service ssh restart

Ограничить доступ пользователей по ssh

По умолчанию все пользователи системы могут войти в систему через SSH, используя свой пароль или открытый ключ.

Иногда вы создаете учетную запись пользователя UNIX Linux для FTP или электронной почты. Однако эти пользователи могут войти в систему с помощью ssh. У них будет полный доступ к системным инструментам, включая компиляторы и языки сценариев, такие как Perl, Python, которые могут открывать сетевые порты и делать много других нехороших вещей.

Чтобы разрешить доступ по ssh только нужным пользователям, добавьте следующее в sshd_config:

// ... ... ... ... ...

AllowUsers user1, user2

// ... ... ... ... ...

В качестве альтернативы вы можете разрешить всем пользователям входить в систему через SSH, но запретить только нескольким пользователям, с помощью следующей строки в sshd_config:

// ... ... ... ... ...

DenyUsers user1, user2, user3

// ... ... ... ... ...

Запрет X11 Forwarding

Эффективность: 🛡️ 🛡️

X11 Forwarding позволяет удаленным пользователям запускать графические приложения с вашего сервера в сеансе SSH. В руках злоумышленника графический интерфейс может облегчить их нехорошие цели.

Стандартная мантра в области кибер-безопасности:

если у вас нет веской причины включить что-то, выключите это

Мы сделаем это, отредактировав файл конфигурации SSH:

sudo nano /etc/ssh/sshd_config

Отредактируйте строчку X11Forwarding yes на X11Forwarding no.

Перезапустите службу SSH:

sudo systemctl restart sshd

Ограничение для попыток ввода пароля

Эффективность: 🛡️ 🛡️

Если вы по какой-то причине не хотите использовать подключение по ssh ключам, то необходимо ограничить количество попыток аутентификации. Это предотвратит попытки подбора пароля и атаки методом перебора.

После обозначенного количества запросов аутентификации пользователь будет отключен от SSH-сервера. По умолчанию ограничений нет. Но это быстро исправить.

Нам нужно отредактировать ваш файл конфигурации SSH:

sudo nano /etc/ssh/sshd_config

Прокрутите файл до тех пор, пока не увидите строку, начинающуюся с MaxAuthTries 0. Удалите хеш с начала строки, измените цифру 0 на желаемое. Например 3.

После внесения изменений сохраните файл и перезапустите демон SSH:

sudo systemctl restart sshd

Установите таймаут подключения

Эффективность: 🛡️ 🛡️

Если к вашему компьютеру установлено SSH соединение и на нем не было активности в течение определенного периода времени, это может представлять угрозу безопасности.

Есть вероятность, что пользователь покинул свой рабочий стол и оставил компьютер не заблокированным. Любой другой, кто проходит мимо, может сесть и начать пользоваться компьютером. Намного безопаснее установить лимит тайм-аута. Соединение SSH будет прервано, если неактивный период совпадет с лимитом времени. Мы еще раз отредактируем файл конфигурации SSH:

sudo nano /etc/ssh/sshd_config

Устанавливаем параметр ClientAliveInterval 600.

sudo systemctl restart sshd

Отклонять подключение без пароля

Эффективность: 🛡️ 🛡️

Хотя это плохая практика, системный администратор Linux может создать учетную запись пользователя без пароля. Это означает, что запросы на удаленное соединение от этой учетной записи не будут иметь пароля для проверки. Эти соединения будут приняты, но не аутентифицированы.

Настройки по умолчанию для SSH принимают запросы на соединение без паролей. Мы можем очень легко это изменить и обеспечить аутентификацию всех подключений. Нам нужно отредактировать ваш файл конфигурации SSH, добавив:

PermitEmptyPasswords no

Бэкапы

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

Заключение

В этом руководстве представлен необходимый минимум для усиления защиты сервера Linux. Дополнительные уровни безопасности могут и должны быть включены в зависимости от того, как используется сервер. Эти уровни могут включать такие вещи, как индивидуальные конфигурации приложений, программное обеспечение для обнаружения вторжений и включение контроля доступа, например, двухфакторной аутентификации.

Мой коктейль

Это все были разрозненные советы, из которых вы можете собрать свой “рецепт”. Какой рецепт использую я сам?

Чаще всего мой рецепт выглядит так:

  • Смена порта SSH
  • Создание нового sudo пользователя
  • Блокировка входа по паролю для всех пользователей
  • Блокировка входа root на сервер
  • Блокировка пароля root
  • Регулярные бэкапы

Struchkov Mark
Struchkov Mark
Задавайте вопросы, если что-то осталось не понятным👇