Легенду про то, как 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
. Первый - для авторизации нашей машины. Второй - мы отправим на сервер или сервис куда будем подключаться.
Пример как закинуть ключ на гитхаб.
cat ~/.ssh/github-key.pub
Часто бывает ещё такой сценарий, когда сервис даёт нам только один из ключей для подключения (например на AWS). Очевидно, что это будет ключ без .pub. Значит нам ничего уже загружать и не нужно. Осталось настроить свою машину на подключение.
В руководстве гитхаба (как и во многих других, это просто пример) написано, что для подключения по ssh мы должны инициировать ssh клиент и потом добавить наш ключ (который без .pub). Тогда он будет активным:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Сразу скажу - это имеет место быть, когда у вас опция разовая. Например, вы подключаетесь на чужой или рабочий проект. Или вам нужно сделать операцию пару разков. Но если вам нужен этот ключ постоянно (например, как в случае с гитхабом или личным сервером) - гораздо проще и лучше создать конфиг для подключения.
Создадим наш файл конфига (если его ещё нет):
touch ~/.ssh/config && chmod 600 ~/.ssh/config
В этот файл мы будем закидывать наши конфиги. Все конфиги имеют схожую структуру:
Сперва идёт Host. Есть два подхода к выбору Host
.
ggg
. Чтобы подключиться к серверу я просто пишу ssh ggg
.github
указываем имя github.com
Остальные строчки идут с табуляции или четырёх пробелов
HostName
- вот тут указывается или DNS (например, в случае гитхаба будет github.com) или айпишникUser
- обычно это или username (на сервере часто root). Или это может быть email, как в случае с githubIdentityFile
- обязательная опция - путь к нашему файлу ключейPort
- иногда полезно, когда нас интересует подключение по конкретному портуCompression
- он включен по-умолчанию на x4IdentitiesOnly
я добавляю, когда подключение держать не нужно. Опция прямо указывает, что подключение нужно только для авторизации, чтобы не срабатывала защита 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 вместо пароля - вы должны его использовать!