Для подключения к удаленной машине по 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
Как я писал выше, если пользователь не указан, то соединение происходит от имени текущего пользователя и вполне возможно что пользователя с таким именем на удаленной машине нет.
На этом все. До встречи.