Linux - одна из самых популярных операционных систем, используемых для веб-серверов, благодаря своей природе с открытым исходным кодом, надежности и гибкости.
Популярность означает, что она является мишенью для хакеров, которые всегда ищут уязвимости для использования. Поэтому важно принять необходимые меры предосторожности, чтобы защитить ваш Linux-сервер от попыток взлома. В этой статье мы обсудим некоторые из лучших способов защиты Вашего Linux-сервера от взлома.
Cтатья не является “рецептом”, в котором надо выполнить все пункты. Некоторые пункты не нужны, если вы выполнили другие. Поэтому выберете только необходимые вам. Я же придерживаюсь следующего рецепта.
Устанавливайте обновления
Эффективность: 🛡️ 🛡️ 🛡️
Одна из самых важных и простых вещей, которую вы можете сделать для защиты вашего 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 my_server
Также можно добавить другие параметры в конфигурацию, например, использовать разные ключи ssh для аутентификации или настроить прокси-серверы.
Создание нового пользователя
Эффективность: 🛡️ 🛡️ 🛡️
Входить на сервер как root пользователь плохая практика. Лучше входить в систему как обычный пользователь и использовать sudo
для выполнения действий, требующих привилегий root.
Добавим нового пользователя, для альтернативы root.
sudo adduser имя_пользователя
Если вас не попросили придумать пароль для пользователя, то установите его вручную.
passwd имя_пользователя
Я предполагаю, что мы заблокируем root пользователя, поэтому после этого добавим пользователя в группу sudo:
usermod -aG sudo имя_пользователя
wheel
.usermod -aG wheel имя_пользователя
Для каждого пользователя sudo можно задать ограничения: разрешить запускать только определенные команды от имени супер пользователя.
🙅♂️ Запрет входа root пользователя
Эффективность: 🛡️ 🛡️ 🛡️ 🛡️ 🛡️
Вы не должны позволять root входить в ваш SSH-сервер. Если злоумышленник получит доступ к root-аккаунту, то он будет иметь полный контроль над сервером. Подключение должно быть разрешено только обычным пользователям. Если им нужно выполнить административную задачу, им также следует использовать sudo
.
Открываем текстовый файл в любом редакторе:
sudo nano /etc/ssh/sshd_config
Нас интересует параметр PermitRootLogin
:
- Если вы хотите вообще запретить пользователю root вход в систему, установите
PermitRootLogin no
. - Если вы собираетесь разрешить пользователю root входить в систему, но хотите использовать только SSH-ключи, установите
PermitRootLogin prohibit-password
.
После внесения вышеуказанных изменений сохраните и закройте файл. Затем перезапустите службу SSH, чтобы внесенные изменения вступили в силу.
systemctl restart sshd
Заблокировать пароль root
Эффективность: 🛡️ 🛡️ 🛡️ 🛡️
Я обычно блокирую пароль для пользователя root. Это не позволит обычному пользователю перейти в root пользователя с помощью команды su
.
Для этого заходим на сервер под пользователем, обладающим правами sudo. И вводим следующую команду:
sudo passwd -l root
🔐 Используйте SSH ключ вместо пароля
Эффективность: 🛡️ 🛡️ 🛡️ 🛡️ 🛡️ 🛡️
Сервер OpenSSH поддерживает различную аутентификацию. Пароли можно угадывать, взламывать или подбирать методом перебора. Ключи 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.
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
- Регулярные бэкапы