Использование аутентификации с помощью открытого ключа SSH для подключения к удаленной системе является надежной и более безопасной альтернативой входу в систему с паролем учетной записи или парольной фразой. Аутентификация с открытым ключом SSH опирается на асимметричные криптографические алгоритмы, которые генерируют пару ключей, один из которых является «закрытым», а другой - «открытым». Вы храните закрытый ключ в секрете и храните его на компьютере, который используете для подключения к удаленной системе. Открытым ключём вы можете поделиться с кем угодно, не ставя под угрозу закрытый ключ; вы храните его в удаленной системе в хранилище .ssh/authorized_keys
.
Рекомендую предварительно ознакомиться со статьёй SSH - коротко о главном
Для нетерпеливых
Коротко расскажу общий подход как настроить SSH аутентификацию при помощи открытого ключа.
Генерируем пару ключей (ниже я расскажу, как это сделать). Закрытый будем использовать на клиенте, для подключения по ssh. Открытый передаём на удалённый сервер и помещаем его в хранилище авторизованных ключей (~/.ssh/authorized_keys).
ВАЖНО: если на сервере не выставить разрешения
chmod 600
иchown
, дляauthorized_keys
, то авторизация работать не будет. За этим следит sshd. В этой статье я покажу как это правильно сделать.
После того как сгенерили и разместили ключи нужно на удалённом сервере отредактировать sshd_config
- отключить авторизацию по паролю, чтобы использовать только сертификат, а также, не обязательно, но желательно, отключить PAM и разрешение входа по SSH под root-ом.
Полный перечень команд
ssh username@servername
mkdir ~/.ssh
chmod 700 ~/.ssh
scp c:\path_to_file\.ssh\id_rsa.pub username@servername:~/.ssh/username_rsa.pub
cd ~/.ssh
cat username_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chown $USER:$USER ~/.ssh -R
`/etc/ssh/sshd_config`
RSAAuthentication yes
PasswordAuthentication no
sudo service sshd restart
Теперь по порядку.
Для работы нам понадобиться установленный OpenSSH. К сведению пользователей Windows - OpenSSH был добавлен в Windows осенью 2018 года и включен в Windows 10 и Windows Server 2019.
Создаём пару ключей.
На компьютере, с которого вы хотите осуществлять подключение, генерируем пару ключей (открытый (id_rsa.pub)/закрытый (id_rsa)). Для этого выполните команду
ssh-keygen -t rsa -b 4096
Программа попросит вас ввести имя файла закрытого ключа (по умолчанию id_rsa). Если не хотите ничего менять, то просто нажимайте Enter. Далее Вас попросят ввести пароль (парольную фразу). Этот шаг можно пропустить и не вводить пароль, нажав Enter. Но имейте ввиду, что в этом случае, любой, кто завладеет вашим закрытым ключом, сможет им воспользоваться. Если Вы введёте пароль, то он будет спрашиваться у Вас каждый раз при использовании закрытого ключа. Я рекомендую всегда вводить пароль, тем самым защищать свой закрытый ключ. Затем Вас попросят повторить пароль, для контроля правильности ввода. В результате программа сгенерирует пару ключей и поместит их в каталог ~/.ssh
. Результат работы программы виден на скриншоте.
Передаём открытый ключ на сервер
После того как Вы сгенерировали открытый и закрытый ключ Вам необходимо передать открытый ключ на сервер, к которому Вы хотите подключаться.
Пользователи *nix систем, для передачи ключа, могут использовать программу ssh-copy-id
, которая входит в поставку OpenSSH. Она скопирует ключ и установит его, выполнив все необходимые действия.
ssh-copy-id -i ~/.ssh/id_rsa.pub remote_user@remote_host
ВАЖНО: Передавать нужно именно публичный ключ! Никогда не передавайте закрытый ключ. Он всегда должен оставться только у Вас!
К сожалению ssh-copy-id
не входит в поставку OpenSSH для Windows. Поэтому здесь я приведу ещё универсальный метод, который подходит в обоих случаях.
Для начала нам нужно подключиться к удалённому серверру, на который мы планируем, в последствии, авторизоваться с помощью открытого ключа.
ssh username@servername
Если на сервере ещё нет каталога ~/.ssh
, то выполните на нём следующие команды.
mkdir ~/.ssh
chmod 700 ~/.ssh
Теперь на компьютере, на котором мы создавали нашу пару ключей, выполните команду, которая скопирует публичный ключ на удалённый сервер, в каталог ~/.ssh
.
scp c:\path_to_file\.ssh\id_rsa.pub username@servername:~/.ssh/username_rsa.pub
Затем возвращаемся на удалённый сервер и выполняем следующие команды.
cd ~/.ssh
cat username_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chown $USER:$USER ~/.ssh -R
Теперь нам необходимо правильно настроить SSH на сервере. Для этого нужно отредактировать /etc/ssh/sshd_config
следующим образом.
- RSAAuthentication yes
- PasswordAuthentication no
Для вступления изменений в силу перезапустите sshd:
sudo service ssh restart
Для CentOS
sudo service sshd restart
Теперь можно перелегиниться на сервер. В этот раз вместо пароля будет использоваться публичный ключ.