Учимся работать с SSH-ключами
Настало время сделать SSH-ключи своими верными друзьями, а не источником жопной боли. Пора подключаться к серверу, просто вводя ssh moy_server
вместо пердолинга с паролями. А также иметь возможность использовать много других крутых утилит, которые умеют работать с удаленным сервером, если настроено ssh-подключение (scp, rsync). Здесь ты можешь этому научиться.
Prerequisites
- Данный гайд, как и все остальные, рассчитан на более-менее уверенных пользователей Linux.
- Все описанные шаги протестированы в Ubuntu 20.04. Можно с таким же успехом проделать в WSL на Windows 10.
Вводный ликбез
- SSH-ключи хранятся в директории
~/.ssh/
. - Права на приватный ключ:
600
, на публичный (.pub):644
. При генерации пары ключей ssh-keygen'ом, нужные права на них сразу проставляются автоматически. Если же у тебя уже есть пара ключей, откуда бы ты ее ни взял, то тебе надо копирнуть их в данную директорию вручную и самостоятельно проставить права с помощьюchmod
. - Новый SSH-ключ генерируется командой
ssh-keygen -t rsa -b 4096
. Если будешь тупо тыкать enter, то ключ сохранится под именем~/.ssh/id_rsa
и~/.ssh/id_rsa.pub
. Но я настоятельно рекомендую задавать осмысленное имя при генерации ключа, чтобы было понятно, от чего этот ключ. Сохраняй их под именами вида~/.ssh/id_rsa_moy_ohuenniy_kluch
. - Сразу, не отходя от кассы, привыкай настраивать
~/.ssh/config
. Иначе потом ОЧЕ сильно охуеешь от весьма нетривиальных багов, когда все вроде бы правильно настроено, но сервер шлет нахуй. Особенно когда у тебя много ключей. Про настройку~/.ssh/config
будет дальше отдельный пункт. - Парольные фразы (passphrase). Нахуй их. Создают ОЧЕНЬ много дополнительного геморроя. Я скозал, что SSH-ключи достаточно безопасны сами по себе, а если ты просрешь ключи, то тебе один хуй ничего не поможет, так что нахуй их. Всегда оставляй пустыми.
- Чтобы к серверу было возможно подключиться по ssh, публичный ключ должен быть добавлен в
~/.ssh/authorized_keys
на сервере.
~/.ssh/config
Данный файл выполняет крайне важную функцию - определяет, к каким айпишникам/доменам применять каждый конкретный ключ.
А то, если ты не задашь эти правила, линух будет при каждом ssh-подключении к любому хосту перебирать все ключи. Тупо по очереди.
А сервера обычно имеют весьма мелкий лимит на число попыток подключения и с высокой вероятностью пошлют тебя нахуй уже после 3-й или 5-й попытки.
Поэтому, блять, запоминай, как должен выглядеть ~/.ssh/config
:
Самое главное тут - это последние 2 строки. Именно они задают ключ, который будет использован при выполнении команды ssh moy_ohuenniy_server
. Линух не будет перебирать ВСЕ имеющиеся ключи, а сразу возьмет нужный, таким образом, ты не поймаешь ошибку превышения лимита попыток авторизации и не будешь потом охуевать, почему это сервер шлет тебя нахуй, если ключ правильный.
Удобно также сразу тут и задать порт. Тогда тебе не придется задавать его в других местах. Особенно важно, когда порт не стандартный 22-й. Также ты сможешь подключаться к серверу не только по его хосту (ssh 114.154.31.54
), но и по алиасу (ssh moy_ohuenniy_server
).
В HostName
может быть как айпишник, так и домен.
Название в Host moy_ohuenniy_server
может быть любым.
keychain
Еще один крайне важный элемент. Дело в том, что если ты положил ключ в ~/.ssh/
и настроил ~/.ssh/config
, то это еще не все. Если ты попытаешься подключиться к серверу, то нихуя не выйдет. Я даже не знаю, как там на низком уровне обрабатываются ключи, вроде ssh-agent'ом. Но нас это ебать не должно, ПРОСТО ставим keychain
:
Далее в ~/.bashrc
добавляем в конец следуюущее:
Как видишь, для каждого ключа из ~/.ssh/
нужно дописать $HOME/.ssh/id_rsa_xxx
в соответствующее keychain'овское место в ~/.bashrc
.
Спокуха, если ты думаешь, что ЭТО пердолинг, то это не пердолинг, пердолинг у тебя был бы с ssh-agent. Так что, просто добавляй одну однотипную строчку на каждый ключ в соответствующее место в ~/.bashrc
и горя знать не будешь.
~/.bashrc
обновляется 1 раз при начале сеанса. Так что, перелогинься, чтобы применить изменения.
При новом сеансе ты должен будешь увидеть, что keychain
подрубил ключ. Все, можно подключаться к серваку.
Чек-лист
- Приватный и публичный ключи лежат в
~/.ssh/
под именами~/.ssh/id_rsa_xxx
и~/.ssh/id_rsa_xxx.pub
. Права на них600
и644
соответственно. - В
~/.ssh/config
хосту назначен этот ключ. - Установлен
keychain
, ключ добавлен в~/.bashrc
, сеанс перелогинен.
Популярные ошибки
Q: Все настроено правильно, сервер шлет нахуй.
A: Настроен ли ~/.ssh/config
? На сервере вообще добавлен публичный ключ в ~/.ssh/authorized_keys
? Включена ли авторизация по ключам?