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

Существует два способа входа в удаленную систему через SSH - с использованием аутентификации по паролю или аутентификации с открытым ключом (вход SSH без пароля).

Если коротко, то нам нужно сгенерировать пару ключей аутентификации (публичный и приватный) и её публичную часть добавить в файл ~/.ssh/authorized_keys удаленных хостов.

Прежде чем приступить к работе, нам необходимо убедиться в том, что у нас установлен сервер OpenSSH:

# Dedian/Ubuntu
sudo systemctl status ssh

# CentOS
sudo systemctl status sshd

Если после команды мы видим Active: active (running), то всё в порядке, сервер OpenSSH присутствует и запущен.

Для установки сервера нужно выполнить следующую команду:

# Dedian/Ubuntu
sudo apt install openssh-server

# CentOS
sudo yum install openssh-server

После установки проверяем статус и запускаем его если это необходимо, добавляем в автозагрузку:

##### Dedian/Ubuntu
# Статус
sudo systemctl status ssh
# Запустить
sudo systemctl start ssh
# Добавить в автозагрузку
sudo systemctl enable ssh

######## CentOS
# Статус
sudo systemctl status sshd
# Запустить
sudo systemctl start sshd
# Добавить в автозагрузку
sudo systemctl enable sshd

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

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

ls -al ~/.ssh/id_*.pub

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

Следующая команда сгенерирует новую пару ключей:

ssh-keygen
# Эквивалентно ssh-keygen
ssh-keygen -t rsa

## Усилить защиту. Длина ключа 4096 бит
ssh-keygen -t rsa -b 4096

# Короткий (более безопасный) ключ
ssh-keygen -t ed25519

# С вашим адресом электронной почты в качестве комментария
ssh-keygen t ed25519 -C "your_email@domain.com"

Посмотреть содержимое публичного клуча:

cat ~/.ssh/id_ed25519.pub

Копируем публичную часть ключа на удалённый сервер можно следующими способами:

1 С помощью команды ssh-copy-id (Предпочтительный способ):

ssh-copy-id [remote_username]@[server_ip_address]

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

2 С помощью команды cat

cat ~/.ssh/id_ed25519.pub | ssh [remote_username]@[server_ip_address] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

3 Третий метод немного сложнее, так как вам придётся всё делать вручную. Однако, вариант вполне рабочий и вы можете использовать его в отдельных случаях, когда другие методы не работают. Вам нужно будет вручную добавить содержимое файла id_ed25519.pub в файл ~/.ssh/authorized_keys удалённого сервера.

Смотрим содержимое файла id_ed25519.pub

cat ~/.ssh/id_ed25519.pub

Команда выведет ключ, он начинается с ssh-ed25519. Скопируйте его. На удалённом сервере войдите в систему и создайте в корне директорию .ssh, если она не существует:

mkdir -p ~/.ssh

Немного разберёмся с правами на файлы и папки.

Если папка ~/.ssh уже существует, то следует проверить права.
  • Сама директория .ssh должна иметь права 700 (drwx------)
  • Закрытый ключ (id_*) должен иметь права 600 (-rw------)
  • Все остальные файлы в директории должны иметь права 644 (-rw------)
  • Все файлы должны принадлежать текущему пользователю и его группе

Следующие команды приведут всё в порядок:

chown -R $USER:$USER ~/.ssh
chmod 700 ~/.ssh
chmod 644 ~/.ssh/*
chmod 600 ~/.ssh/authorized_keys

Чтобы добавить дополнительный уровень безопасности к серверу сделаем ещё несколько изменений. Откроем файл /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Находим необходимые строки и изменяем их на:

# Запрещаем вход по паролю
PasswordAuthentication no

# Запрещаем вход пользователю root
PermitRootLogin no

# Задаём порт для подключения (Изменить на свой)
Port 29947

Открываем нужный порт:

iptables -I INPUT -p tcp --dport 29947 -j ACCEPT

Перезапускаем демона SSH:

# Dedian/Ubuntu/LMDE
sudo systemctl restart ssh

# CentOS
sudo systemctl restart sshd

Теперь можно подключиться так:

# Пример
ssh www-root@196.69.117.250 -p29947
Не покидайте сервер до полной работоспособности нужных настроек! Проверяйте подключение в отдельном окне терминала. Если что-то пойдёт не так (ошибка в подключении), всегда можно изменить настройки на предыдущие.

Также вы можете на своем компьютере создать файл с настройками подключений:

touch ~/.ssh/config

Права на файл:

chmod 600 ~/.ssh/config

Открываем вышеуказанный файл и добавляем такую конфигурацию:

# Не забудьте подставить свои данные (Host, HostName, Port, User, IdentityFile)
Host myhost
    HostName 196.69.117.250
    Port 29947
    User www-root
    IdentityFile ~/.ssh/id_ed25519
  • Host - Краткое название сервера
  • HostName - IP адрес сервера или доменное имя
  • Port - порт для подключения
  • User - пользователь
  • IdentityFile - Путь до приватной части ключа

Теперь, когда мы настроили подключение, выполняем команду:

# Подключаемся по ключу через ~/.ssh/config
ssh myhost

Если всё правильно сделано, то мы увидим аутентификацию по ключу, войдём на сервер без пароля.