SSH аутентификация по ключу

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

ssh username@192.168.1.150
username@192.168.1.150's password:

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

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


Аутентификация по ключу не только упрощает процесс подключения, но еще повышает общую безопасность сервера.

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

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


Создание ключей для ssh аутентификации

Первым делом нужно убедиться в наличии скрытого каталога .ssh находящегося в домашнем каталоге пользователя, в нашем случае ~/ (root-пользователь). Просмотреть скрытые каталоги можно следующей командой.

# Просматриваем домашний каталог пользователя
ls -1a

Если по каким-то причинам каталог .ssh отсутствует, его необходимо создать, причем на обоих машинах: и на клиенте, и на сервере.

# Создаем скрытый каталог .ssh
mkdir -p ~/.ssh

На домашней машине (клиенте) генерируем ключи командой ssh-keygen.

ssh-keygen

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

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wzV0scS8cw8g8CaalAiVSrgYQ0yrVunTGhjs454QRIk root@home-16
The key's randomart image is:
+---[RSA 2048]----+
|==o...  ...o+.   |
|Eoo.o. . o.o+.   |
|.X +. o . =..o   |
|* * .. + + .o o  |
|o= + .o S    o o |
|o.. +    .      .|
|.. .             |
|o .              |
| o               |
+----[SHA256]-----+

По умолчанию вышеуказанная команда создает пару 2048-битных ключей в каталоге .ssh (id_rsa и id_rsa.pub). Ключ id_rsa — закрытый (приватный), он остается на домашней машине. Ключ id_rsa.pub — открытый (публичный), он передается на удаленную машину.

Для большей надежности к ключам можно добавить секретную фразу (passphrase), но в таком случае ее нужно будет вводить при каждом подключении. Секретная фраза конечно повышает надежность аутентификации, но по сути мы придем к тому, от чего уходим — постоянному вводу пароля секретной фразы при каждом подключении.

При желании можно создать 4096-битные ключи (лучше не надо — это на любителя).

ssh-keygen -b 4096

Передача ключей на удаленный сервер

Публичный ключ (id_rsa.pub) нужно передать на удаленную машину в каталог .ssh. Проще всего это можно сделать командой scp (потребуется ввод пароля ssh).

IP-свой подставьте только)

# Если на удаленной машине ssh работает на стандартном (22-ом) порту
scp ~/.ssh/id_rsa.pub root@192.168.1.150:~/.ssh

# Если на удаленной машине ssh работает на нестандартном порту (-P portnumber)
scp -P portnumber ~/.ssh/id_rsa.pub root@192.168.1.150:~/.ssh

На вопрос о продолжении соединения отвечаем — yes. Потом вводим пароль пользователя.

Are you sure you want to continue connecting (yes/no)? yes

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

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Редактируем файл sshd_config на сервере чтобы отключить аутентификацию по паролю. Нужно изменить значение директивы PasswordAuthentication с yes на no.

# Редактируем файл sshd_config в каталоге /etc/ssh
nano /etc/ssh/sshd_config

# Изменяем значение директивы PasswordAuthentication на no
PasswordAuthentication no

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

# Перезагружаем ssh-сервер
systemctl restart ssh

Аутентификация по ключам настроена на обоих машинах, и пароль теперь вводить не требуется, достаточно просто выполнить одну команду и подключение к серверу будет открыто.

ssh username@192.168.1.150

Настройка алиасов для ssh

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

На домашней машине в каталоге .ssh создадим файл config.

nano ~/.ssh/config

Параметры подключения могут быть общими и распространяться на все подключения. А могут быть индивидуальными, такие параметры работают только для конкретного подключения.

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

Host * 
    KeepAlive yes 
    ServerAliveInterval 30

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

# У меня не 20000 порт - это для примера)
Host techlist
    HostName techlist.top
    Port 20000
    User root

Директива Host задает имя подключения (алиас) в моем случае — techlist, это имя используется для подключения к серверу. В значении директивы HostName можно указать как ip-адрес, так и доменное имя (если оно есть) в таком случае оно резолвится через DNS.

Если не указывать номер порта, то по умолчанию используется 22-ой порт. С пользователем то же самое, если вы root, то и соединяться будете от имени root-пользователя.

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

ssh techlist

А теперь я расскажу как подключаться только одним словом, как и писал выше, Да, я ленивый, и даже два слова  — это для меня много. Поэтому я сделал вот такой костылик на скриптах.

Создаю скрипт в каталоге /usr/bin. Обзывайте его как хотите, это и будет ваша команда.

nano /usr/bin/techlist

Добавляю в него следующее содержимое (просто вызов команды которую настроили выше).

#!/bin/bash

ssh techlist

exit

Делаю файл исполняемым.

chmod +x /usr/bin/techlist

Подключаюсь к серверу только одним словом)

techlist

Передача ключей не root-пользователю

Ключами может пользоваться и другой пользователь. Скопируем файл закрытого ключа (id_rsa) и файл настроек config в каталог /home/username/.ssh.

Хоть это и необязательно, но на всякий случай зададим права для каталога .ssh и файлов в нем.

chmod 700 /home/username/.ssh
chmod 600 /home/usename/.ssh/*

Пробуем подключиться (настроенные алиасы тоже работают).

ssh techlist

Соглашаемся и добавляем соединение в known_hosts.

Are you sure you want to continue connecting (yes/no)? yes

Все должно работать. Если вдруг вы видите следующую ошибку — Permission denied (publickey), то тогда в файле config нужно указать пользователя от имени которого устанавливается соединение, если он не был указан ранее.

Host techlist
	HostName techlist.top
	Port 20000
        User root

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

На этом все. До встречи.

Ответить:

Please enter your comment!
Please enter your name here