Содержание
Backend Java Developer
Backend Java Developer
Oбновлена 2021-02-28

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

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

Как только все заработает, вы можете безопасно закрывать любые сеансы.

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

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

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

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

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

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

sudo yum update

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

Сервер 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. Затем введите ваш пароль пользователя на удаленном сервере. Утилита подключится к удаленному серверу, а затем использует содержимое ключа idrsa.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

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

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

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

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

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

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

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

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

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

usermod -aG sudo имя_пользователя

На некоторых ОС эта гурппа называется wheel.

usermod -aG wheel имя_пользователя
sudo
Sudo — это программа, которая позволяет пользователям запускать программы с привилегиями безопасности другого пользователя, по умолчанию супер-пользователя.

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

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

Самый лучший вариант – это когда у root пользователя нет возможности войти на сервер.

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

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

sudo nano /etc/ssh/sshd_config

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

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

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

systemctl restart sshd

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

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

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

sudo passwd -l root

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

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

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

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

AllowUsers user1, user2

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

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

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

DenyUsers user1, user2, user3

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

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

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

Перед сменой порта разберитесь, какой firewall стоит на вашей системе. Например на CentOS 8 это скорее всего 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

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

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

Пример файла config
Пример заполнения файла ~.ssh/config

После сохранения вы сможете подключаться к серверу следующим образом:

ssh my_server

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

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

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

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

Комментарии

Struchkov Mark
Struchkov Mark
Какие инструменты для защиты своего сервера используете вы?