Подключаемся по SSH

Подключаемся по SSH

КодингКодинг

Легенду про то, как ssh получил 22 порт, знают все. А если вы не знаете - можете погуглить-почитать. Достаточно интересная легенда.
Но почему же люди любят так ssh? В чём его очевидный плюс?

Общий смысл

Если в кратце, то с помощью пары ключей, вы можете создать защищённое TCP-соединение, по умолчанию, по порту 22. После того, как подключение состоялось, пользователь получает возможность отправлять команды или файлы на указанный адрес. Удобно? Ещё бы!

То есть, на сервере должен быть открыт порт 22. Если порт 22 закрыт - подключения не будет! В 99% случаев на вашем сервере такое подключение будет открыто. И тут есть важное замечание. Если вы настраиваете на сервере файрволл - вы им можете заблокировать ваш порт 22. Если такое случилось - просто напишите в тех поддержку и вам его откроют.

Ну и, кроме того, как было сказано выше - мы можем пересылать файлы. Это активно используется во всяких версионных программах. Например, вы делаете подключение к github через ssh и пересылаете файлы. Через пароль файлы в репозитории пересылают только новички и те, кто далёк от программирования.

Работа с ключами

Когда мы разобрались с тем что и зачем - давайте разберёмся "как". Для начала нам нужна пара ключей. В юникс-подобных системах они хранятся в директории ~/.ssh. В винде, аналогичная папочка находится на уровне вашего пользователя. В теории, кейген создаёт её автоматом. Но, если у меня "голая" система - я никому не верю и всё создам сам, попутно повесив нужные права на папочку:

mkdir -p ~/.ssh && chmod 700 ~/.ssh

Теперь самое время создать первый ключик.

ssh-keygen

Сгенерируется ключ под названием id_rsa. Безусловно, после нажатия на команду, вам предложат выбрать имя. Ну и, ввести пароль от ваших файлов ключей (приватной половинки). Если у вас не сервер, который точно будут пытаться взломать - просто нажимайте на ввод - можно игнорировать.

Ещё есть важная опция - выбор алгоритма шифрования. За неё отвечает флаг -t. Не все системы поддерживают все варианты алгоритмов шифрования. Можете ради интереса заглянуть в руководство по ssh и обнаружите минимум 4 варианта. А если вы не укажите опцию, как мы делали выше - выберется алгоритм RSA.

ssh-keygen -t ed25519

Ну и, я лично не особо заморачиваюсь в какой директории нахожусь. Поэтому имя файла забиваю сразу - без всяких дурацких вопросиков. Это флаг -f. В итоге мы получили:

ssh-keygen -t ed25519 -f $HOME/.ssh/github-key

Подключение

После введения волшебной команды выше (и потом два раза на ввод, чтобы пропустить создание пароля), в вашей директории ~/.ssh появятся два новых файла - github-key и github-key.pub. Первый - для авторизации нашей машины. Второй - мы отправим на сервер или сервис куда будем подключаться.

Пример как закинуть ключ на гитхаб.

  1. Выводим ключ с .pub в консоль:
cat ~/.ssh/github-key.pub
  1. Копируем его
  2. Заходим в настройки, находим там графу SSH и забиваем туда ключик.

github ssh

Часто бывает ещё такой сценарий, когда сервис даёт нам только один из ключей для подключения (например на AWS). Очевидно, что это будет ключ без .pub. Значит нам ничего уже загружать и не нужно. Осталось настроить свою машину на подключение.

В руководстве гитхаба (как и во многих других, это просто пример) написано, что для подключения по ssh мы должны инициировать ssh клиент и потом добавить наш ключ (который без .pub). Тогда он будет активным:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

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

Файл конфига

Создадим наш файл конфига (если его ещё нет):

touch ~/.ssh/config && chmod 600 ~/.ssh/config

В этот файл мы будем закидывать наши конфиги. Все конфиги имеют схожую структуру:

Сперва идёт Host. Есть два подхода к выбору Host.

  1. Когда у нас есть сервер и мы просто к нему подключаемся по ssh. Команда будет ssh и имя, которое мы укажем в Host. Поэтому выбираем имя латиницей максимально коротким. Например, я выбрал имя ggg. Чтобы подключиться к серверу я просто пишу ssh ggg.
  2. Репозитории и другие сервисы могут не разрешать нам держать подключение постоянно. Тогда, как имя в Host мы должны выбрать доменное имя сервиса. Тогда, если мы будем обращаться к сервису - подключение будет вызываться через ssh автоматически. Например, для github указываем имя github.com

Остальные строчки идут с табуляции или четырёх пробелов

  • Обязательная опция HostName - вот тут указывается или DNS (например, в случае гитхаба будет github.com) или айпишник
  • Обязательная опция User - обычно это или username (на сервере часто root). Или это может быть email, как в случае с github
  • IdentityFile - обязательная опция - путь к нашему файлу ключей
  • Port - иногда полезно, когда нас интересует подключение по конкретному порту
  • Есть ещё Compression - он включен по-умолчанию на x4
  • IdentitiesOnly я добавляю, когда подключение держать не нужно. Опция прямо указывает, что подключение нужно только для авторизации, чтобы не срабатывала защита ssh на излишние подключения.

Пример:

Host github.com
  HostName github.com
  User [email protected]
  IdentityFile ~/.ssh/github-key
  IdentitiesOnly yes

Ещё будет неплохо если между вашими конфигами будут пустые строчки. Ну и, не забудем добавить ssh в автозагрузку, если вдруг оно ещё там не стоит:

sudo systemctl enable sshd.service

Подлючение публичного ключа

В случае если вы заморачиваетесь с CI/CD - а я это делаю почти всегда, нам нужно, чтобы наш автоматизированный скрипт подключался на наш сервер. Я лично это делаю так.

У себя на компьютере генерирую ключ для подключения. Важной опцией будет, чтобы ключ генерировался для нужного нам email, потому что, по-умолчанию, будет использована почта вашего текущего аккаунта (компьютера или сервера). С этим нам помогает опция -C.

ssh-keygen -t ed25519 -f $HOME/.ssh/github-to-server -a 200 -C [email protected]

То есть, в примере выше я сгенерировал ключ для github actions. Action будет использовать для работы мой гитхабовский email.

Дальше я закидываю сгенерированный публичный ключ на сервер:

ssh-copy-id -i ~/.ssh/github-to-server.pub [email protected]

Если зайти на сервер и там посмотреть внутрь файла authorized_keys, можно увидеть, что наш ключ скопировался туда. То есть - осталось только добавить наш приватный ключ в сам action. И подключение заработает. Это если вкратце.

Заключение

Безусловно, ssh - это больше чем я сейчас рассказал. По сути - вы создаёте туннель. Хотите - через него пишите в базу данных. Хотите - прокачивайте файлы. Активация хуков, или взаимодействие сервисов и программ.

В общем, если ssh для вас - нечто новое, вы должны усвоить правило:

Если есть возможность использовать где-то ssh вместо пароля - вы должны его использовать!


📚 Другие статьи