Учимся работать с 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? Включена ли авторизация по ключам?