Авторизация на сервер по SSH-ключу и выключение авторизации по паролю
Залогинился недавно на сервер, на который ни кто не заходил месяца 3. Увидел не очень приятное сообщение, от том, что на сервер попытались залогиниться 56234 раза с того момента, как я туда заходил.
$ There were **56234** failed login attempts since the last successful login.
$ Last login: Sun Jul 28 15:08:23 2019 from xxxxxxxx.xxxx
За час пока я писал эту заметку и параллельно ковыряя настройки сервера, было совершено более 1000 попыток входа.
После внесенных изменений, даже через 10-12 часов, не было ни одной.
Очевидно, что надо обезопасить сервер.
Сейчас мне повезло, ни кто не просочился, хотя пароль всего 20 символов разной каши ?
А потом? А у вас? А у других пользователей, у которых есть доступ к SSH?
Так что надо отключать возможность входа по паролю (главное потом ключ не потерять — это будет фиаско).
Инициализируем генерациюю
ssh-keygen -t rsa
В ответ получаем запрос на ввод пути для ключа.
# Generating public/private rsa key pair.
# Enter file in which to save the key (/home/rame0/.ssh/id_rsa):
В принципе на этом шаге можно просто нажать Enter
и, если такого ключа еще нет, будет создан ключ id_rsa
. Я предпочитаю для каждого сервера создавать свой ключ.
Дальше нам предлагают ввести секретную фразу для ключа, для пущей безопасности. Её лучше тоже ввести. Главное потом не забыть. Ввести нужно будет дважды (сама фраза и её же для подтверждения).
# Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
Если все ок, нам скажут, что ключ создался и где он теперь обитает:
# Your identification has been saved in /home/rame0/.ssh/test-key.
# Your public key has been saved in /home/rame0/.ssh/test-key.pub.
Теперь нужно залить публичный ключ на сервер (файл .pub
):
ssh-copy-id -i /ваш/путь/до/ключа.pub <имя_пользователя>@<ip_хоста>
Если все хорошо, нас попросят ввести пароль от аккаунта, по которому мы пытаемся залогиниться для добавления ключа:
usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@~~.~~.~~'s password:
Если пароль верный, ключ будет добавлен
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@~~.~~.~~'"
and check to make sure that only the key(s) you wanted were added.
Проверим корректность сделанных предложенной командой
ssh <имя_пользователя>@<ip_хоста>
Настройка сервера
Теперь надо настроить сервер — отключить авторизацию по паролю, сменить порт и остальное по мелочи.
Открываем в вашем любимом редакторе (vi
, nano
, …) файл /etc/ssh/sshd_config
.
! Важно при изменении порта проверять
* не занят ли желаемый порт
* входит ли порт в список разрешенных/запрещенных к подключению командой
iptables-save
Я меняю в нем следующие параметры:
# Укажите свободный порт отличный от стандартного 22
# Port 22
Port 5465
# MaxAuthTries 6
MaxAuthTries 2
# PasswordAuthentication yes
PasswordAuthentication no
#LoginGraceTime 2m
LoginGraceTime 30s
## Раскомментировать (или добавить) строчку (запретить старый протокол):
Protocol 2
Сохраняем настройки и перезапускаем SSH сервер
sudo service sshd restart
Добавляем алиас удаленного хоста в SSH конфиг
Это удобно, так как не нужно каждый раз писать имя пользователя, ip хоста и адрес файла ключа (если он не id_rsa или лежит в нестандартной директории), а подключаться к серверу просто по алиасу.
Открываем для редактирования файл ~/.ssh/config
и добавляем в него алиасы для хостов.
Host test_host_1 # имя алиаса
HostName <адрес_хоста> # например, 186.128.3.15 или test.com
User <ssh_user>
Port <port> #порт на котором висит SSH
IdentityFile <путь до файла ключа> # Путь до файла ключа (.pub), который вы создали вначяале
После сохранения файла подключиться к SSH стало гораздо проще:
ssh test_host_1