Усиление безопасности доступа к серверу с помощью SSH-ключей

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

Для решения этой задачи сгенерируйте два ключа, приватный и публичный. Приватный ключ не должен попадать в руки никому, кроме вас; публичный ключ – способ серверу убедиться, что ваш приватный ключ составляет с ним единственно возможную пару и позволяет разрешить доступ.
(Теория и практика использования SSH – http://www.opennet.ru/base/sec/ssh_intro.txt.html)

Для Linux и Mac OS X можно сгенерировать ключи прямо в терминале. Если ваш персональный компьютер работает под Windows – сгенерируйте ключи на сервере и перенесите приватный ключ в папку рядом с ssh-клиентом.

В терминале (на локальной машине):

ssh-keygen -t rsa

Согласитесь на вариант по умолчанию ~/.ssh/id_rsa:

Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa):

Придумайте и укажите пароль к содержимому ключа:

Enter passphrase (empty for no passphrase):

Генератор ключей создаст в папке .ssh два файла: приватный ключ id_rsa и публичный ключ id_rsa.pub

Усиление защиты ключа с помощью формата хранения PKCS#8

cd .ssh
mv id_rsa id_rsa.old

# Команда потребует три раза ввести пароль - один раз для изначального ключа, два раза для усиленного
openssl pkcs8 -topk8 -v2 des3 -in id_rsa.old -out id_rsa

rm id_rsa.old

Запретите доступ к ключам всем, кроме вашего пользователя:

chmod 600 id_rsa*

Зайдите на сервер по SFTP:

sftp user@server_hostname

Загрузите публичный ключ на сервер:

sftp> put id_rsa.pub id_rsa.pub
sftp> exit

Зайдите на сервер по SSH и из домашней папки добавьте ключ в список разрешённых хостов:

ssh -l user server_hostname

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

Проверьте настройки ssh-сервера:

sudo nano /etc/ssh/sshd_config

Убедитесь, что значения перечисленных параметров выставлены так:

RSAAuthentication yes
PubkeyAuthentication yes

Сохраните изменения и перезагрузите ssh-сервер:

sudo service ssh restart

Авторизуйтесь на сервер ещё раз и убедитесь, что пароль доступа к серверу не потребовался. Если это так, откройте заново настройки ssh-сервера:

sudo nano /etc/ssh/sshd_config

и запретите авторизацию способом ввода пароля, оставив только авторизацию по ключу:

PasswordAuthentication no

Сохраните конфиг и перезагрузите ssh-сервер.

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

В macOS после первой же перезагрузки локального компьютера потребуется заново вводить пароль. Чтобы этого не происходило, укажите Keychains постоянно хранить ключ:

ssh-add -K ~/.ssh/id_rsa

и добавьте файл (работает для macOS Sierra и более новых версий)

nano ~/.ssh/config

с содержимым

Host *
  UseKeychain yes

Для других nix-систем:

ssh-add ~/.ssh/id_rsa
on безопасность, ssh, PKCS8, openssl