Настройка авторизации SSH по ключу

Авторизация SSH на удаленной машине по ключу

Чтобы не вводить постоянно логин и пароль на удаленной машине, настроим доступ по ключу.
Как пример для доступа к ранее созданной VPS и доступ к аккаунту на github.com буду использовать один ключ из локальной машины на Ubuntu 22.04 по протоколу SSH.

В домашнем каталоге ищем директорию .ssh и переходим туда:

cd ~/.ssh

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

ssh-keygen -t ed25519 -C "your_email@example.com"

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

Проверяем и запускаем ssh-agent:

eval "$(ssh-agent -s)"

Выдаст нечто вроде -  Agent pid 27143 то все хорошо.
Добавляем ключ в ssh-agent, если имя ключа не изменяли, иначе пишем свое имя:

ssh-add ~/.ssh/id_ed25519

Далее надо скопировать содержимое публичного ключа, оно находится в файле имя.pub

cat ~/.ssh/id_ed25519.pub

Зайти в свой профиль github.com далее найти в меню раздел SSH and GPG keys и в нем нажать кнопку  New SSH key  и скопировать в поле содержимое публичного ключа. Название произвольное, тип ключа Authentication Keys и сохранить нажав кнопку  Add SSH key 

Проверяем соединение набрав в терминале команду:

ssh -T git@github.com

При первом соединении нужно будет ответить на запрос yes и если все сделано правильно,  можно будет увидеть нечто:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

Настройка доступа к удаленному серверу

Если на локальной машине есть утилита ssh-copy-id, то перекинуть ключ на удаленную машину можно одной командой:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@you-hostname.com

Где user это имя пользователя с уже настроенным входом по паролю SSH а you-hosname.com это доменное имя или ip адрес удаленного сервера. После ввода команды потребуется ввести пароль учетной записи user.

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

ssh user@you-hostname.com

 Создаем директорию .ssh если она не существует, файл authorized_keys и даем права доступа:

mkdir ~/.ssh; chmod 0711 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

Теперь через встроенный текстовый редактор nano нужно поместить содержимое публичного ключа id_ed25519.pub на локальной машине в файл authorized_keys на удаленной машине:

nano ~/.ssh/authorized_keys

После ввода откроется окно текстового редактора в терминале,  далее копируем содержимое ключа на локальной машине в буфер обмена, как было описано ранее и вставляем в окно редактора nano. Чтобы сохранить изменение файла authorized_keys нужно нажать комбинацию клавиш CTRL + O (латинская буква O) и нажать Enter. Для выхода из редактора жмем CTRL + X и закрываем окно терминала. Проверяем что все работает, выполняя повторный вход:

ssh user@you-hostname.com

Теперь можно запретить вход по SSH пользователю root, для этого надо войти на сервер от его имени и отредактировать файл /etc/ssh/sshd_config

nano /etc/ssh/sshd_config

Открываем и ищем директиву PermitRootLogin, по файлу можно перемещаться стрелками. Возможно варианты: PermitRootLogin yes - вход разрешен, no - вход запрещен, without-password - вход разрешен только по ключам. В моем случае вход по SSH под root не нужен, поэтому изменяю на PermitRootLogin no и сохраняю файл. Теперь чтобы изменения вступили в силу, перезапустим службу:

service sshd restart

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

su root

Конечно перед этой операцией надо убедиться что работает хоть какой то доступ по SSH от пользователя, иначе доступ будет потерян.


Комментарии