
Привет, друзья! Я давно работаю с Linux-серверами, и одна из вещей, которая меня всегда раздражала, — это постоянный ввод паролей при подключении по SSH. Представьте: у вас несколько локальных машин, и каждый раз стучать по клавишам, вспоминая, какой там пароль... Но есть простое решение — использовать SSH-ключи. Это как цифровой пропуск: один раз настроил, и дальше всё идёт как по маслу. В этой статье я расскажу, как это сделать шаг за шагом, особенно если вы новичок в Linux или SSH.
Сначала пару слов о том, что такое SSH.
SSH (Secure Shell) — это протокол для безопасного удалённого доступа к серверу. Он шифрует все данные, так что никто не подслушает ваш пароль или команды. Обычно вы подключаетесь командой вроде ssh user@ip-адрес
, и сервер просит пароль. Но с ключами пароль не нужен — аутентификация происходит автоматически через криптографию.
Ключевой момент: вам не обязательно создавать отдельный ключ для каждого сервера. Один хороший ключ можно "раздать" на все машины, куда вы хотите подключаться. Это экономит время и силы. Я так делаю уже давно, и это реально упрощает жизнь, особенно если у вас кластер серверов или виртуалки в домашней сети.
Шаги по настройке
Шаг 1: Генерация SSH-ключа (делается один раз)
Сначала нужно создать пару ключей: приватный и публичный. Это как замок и ключ — приватный ключ остаётся у вас, а публичный "замок" ставится на серверах.
Откройте терминал (на Windows это может быть PowerShell
или Git Bash
, если у вас установлен Git). Введите команду:
ssh-keygen -t ed25519 -C "your_email@example.com"
Разберём, что здесь происходит:
ssh-keygen: Это утилита для генерации ключей. Она входит в стандартный набор OpenSSH, который обычно уже установлен на большинстве систем.
-t ed25519: Опция для типа ключа. Ed25519 — это современный алгоритм, он быстрый, безопасный и компактный.
-C "your_email@example.com": Это комментарий, который добавляется к ключу. Не обязательно, но полезно для идентификации — например, если у вас несколько ключей. Замените на свой реальный email.
Когда запустите команду, она спросит, куда сохранить файлы. По умолчанию это C:\Users\<ваше_имя>\.ssh\id_ed25519
(на Windows) или ~/.ssh/id_ed25519
(на Linux/Mac). Если предложит перезаписать существующий ключ — не соглашайтесь, если не хотите потерять старый.
Затем попросит ввести passphrase
(пароль для ключа). Это опционально, но рекомендую поставить — это дополнительная защита. Если passphrase нет, то подключение будет полностью автоматическим, но если кто-то украдёт ваш приватный ключ, то получит доступ ко всему. С passphrase
ключ "заперт" до ввода пароля, но для автоматизации (например, в скриптах) это может быть неудобно.
В итоге создастся два файла:
id_ed25519 — приватный ключ. Это ваш "секретный ключ", никогда не копируйте его на другие машины!
id_ed25519.pub — публичный ключ. Его можно раздавать направо и налево.
Если у вас Windows, проверьте папку .ssh
в вашем профиле. Если её нет — создастся автоматически.
Шаг 2: Копирование публичного ключа на серверы
Теперь нужно "установить" публичный ключ на каждый сервер. Для этого есть удобная команда ssh-copy-id
.
Для каждого сервера выполните:
ssh-copy-id -i "C:\Users\<ваше_имя>\.ssh\id_ed25519.pub" user@IP-адрес
Объясняю параметры:
-i "путь_к_публичному_ключу"
: Указывает, какой ключ копировать. Замените на реальный путь.user@IP-адрес
: Здесь user — имя пользователя на сервере (например, administrator или root), а IP-адрес — адрес сервера, вроде 192.168.98.98.
При первом запуске команда попросит пароль (да, в последний раз!). Она подключится по SSH, добавит ваш публичный ключ в файл ~/.ssh/authorized_keys
на сервере и выйдет. Повторите это для всех серверов.
Если ssh-copy-id
не работает (на старых системах), можно вручную: скопируйте содержимое id_ed25519.pub
(откройте в notepad, например), подключитесь к серверу по SSH с паролем, создайте файл ~/.ssh/authorized_keys
(если нет), и вставьте строку ключа в конец файла. Не забудьте установить права: chmod 600 ~/.ssh/authorized_keys
.
Шаг 3: (Опционально) Настройка файла config для удобства
Чтобы не набирать каждый раз длинные команды вроде ssh admin@192.168.98.98
, создайте файл ~/.ssh/config
(на Windows C:\Users\<ваше_имя>\.ssh\config
). Это как адресная книга для SSH.
Откройте файл в редакторе (notepad подойдёт) и добавьте блоки вроде:
Host server1
HostName 192.168.98.98
User admin
IdentityFile ~/.ssh/id_ed25519
Host server2
HostName 192.168.98.214
User administrator
IdentityFile ~/.ssh/id_ed25519
Host server1
: Это псевдоним, как вы будете вызывать сервер.HostName
: Реальный IP или домен.User
: Имя пользователя по умолчанию.IdentityFile
: Путь к приватному ключу.
Сохраните файл. Теперь подключение — просто ssh server1
. Круто, правда?
Шаг 4: Проверка подключения
Теперь попробуйте: ssh server1
.
Если всё ок, подключится без пароля. Если попросит passphrase
— введите (если ставили).
Как это работает под капотом
Давайте разберёмся, почему это работает, чтобы не было магии. SSH-ключи основаны на асимметричной криптографии (public-key cryptography). При генерации создаётся пара:
Приватный ключ: Хранится только у вас, используется для "подписи" запроса на подключение.
Публичный ключ: Открытый, размещается на серверах в
authorized_keys
.
Когда вы подключаетесь, клиент (ваш компьютер) отправляет запрос: "Эй, сервер, у меня есть приватный ключ, соответствующий этому публичному". Сервер генерирует случайный вызов, клиент "подписывает" его приватным ключом, сервер проверяет подпись публичным ключом. Если совпадает — добро пожаловать!
Публичный ключ не секрет, потому что им нельзя "взломать" приватный. Но приватный — да, это ваш главный актив.
Заключение
Вот и всё! Теперь вы можете подключаться к куче серверов без паролей.?
Комментарии (44)
arx3889
20.08.2025 09:42А к чему в заголовке "к нескольким"?
Barodzik99
20.08.2025 09:42«К нескольким» в заголовке потому что статья именно об этом — один ключ на несколько серверов. Если это кажется лишним, значит, вы, видимо, умеете читать только по диагонали.
arx3889
20.08.2025 09:42Ну так ответь нормально и успокойся, зачем в карму-то гадить? Конструктивное общение, по-твоему (ну или кто там из вас минус влепил?), видимо на каждый непонравившийся комментарий писать, что автор -- школьник?
"Один ключ на несколько серверов" -- это, конечно, откровение.
А "к нескольким" в заголовке вводит в заблуждение насчет содержимого. Без него я бы, однако, нет то что по диагонали читал, а даже не зашел в статью.
VenbergV
20.08.2025 09:42Не хватает минимальной настройки запрета входа по паролю для Linux.
Статья полезна хотя бы тем, что в ней наконец-то предлагают ed25519.
Глядишь, LLM будут чаще натыкаться на актуальные инструкции. И выдавать более актуальные советы начинающим.
Живой пример, отключение ipv6 в Proxmox. Правильное приведено в документации (но кто же ее читает?). Но LLM упорно базируется на часто встречающихся советах в глобальной сети.
plazotronik
20.08.2025 09:42ещё не помешает для ed25519 указать количество циклов KDF побольше дефолтного. ну, а если хочется всё же без ввода пароля заходить, то использовать ssh-агент, что позволит оставить пароли в ключах (а это всё же обязательно).
suprunchuk Автор
20.08.2025 09:42Спасибо за комментарий! Очень ценно услышать лекцию про ssh-agent от человека, который, судя по стилю, впервые в жизни открыл
man ssh
. Порадовало особенно слово «обязательно» — прям как в школьном дневнике: «обязательно прийти с родителями». Когда дорастёте до продакшена, узнаете, что «KDF побольше» и «ssh-agent» — это только половина картинки, а пока — тренируйтесь хотя бы писать осмысленно. Впрочем, прогресс есть: ещё вчера вы, наверное, пытались подключиться поtelnet
Barodzik99
20.08.2025 09:42Полезная и понятная статья ! Особенно понравилось, расписали шаги так, что даже новичок разберётся.
Из личного опыта добавлю пару моментов:
Фраза про один ключ для всех серверов верная, но на больших проектах лучше использовать разные ключи для разных окружений (dev, staging, prod) — это снижает риски, если вдруг ключ «утечёт».
Вместо
ssh-copy-id
иногда удобнее сразу пользоватьсяAnsible
илиpdsh
, когда серверов десятки и сотни — тогда раздача ключей автоматизируется.В Windows удобно сразу ставить Windows Terminal + WSL, тогда работа с ключами и SSH полностью как на Linux.
А в остальном — прям хорошее вводное руководство, думаю, многим пригодится!
dlinyj
20.08.2025 09:42В Windows удобно сразу ставить Windows Terminal + WSL, тогда работа с ключами и SSH полностью как на Linux.
Вы не поверите, открываю обычный cmd. И там из коробки в windows 10 есть ssh-keygen и ssh. Вместо ssh-copy-id можно использовать типа:
scp $env:USERPROFILE\.ssh\id_rsa.pub user@host:~/.ssh/authorized_keys
Barodzik99
20.08.2025 09:42Windows 10 не актуальна,из коробки в Linux есть ssh
dlinyj
20.08.2025 09:42С учётом проблем как она работает, это удобнее. И не у всех есть админ-права на Windows машине (например, рабочий ноут), а ssh есть из коробки без лишних телодвижений.
Так-то да, можно вспомнить ретро в виде cygwin :).
tlittle
20.08.2025 09:42Эээ.... А какая версия windows , актуальна по-вашему? И в каком дистрибутиве GNU/Linux есть ssh "из коробки"? В ядре Linux его кажется нет. В linux from scratch его тоже нет до определенного шага. А после каких-то шагов он (ssh) есть и в винде....
suprunchuk Автор
20.08.2025 09:42Практически во всех популярных дистрибутивах GNU/Linux ssh-клиент (
openssh-client
) идёт «из коробки».В Ubuntu Desktop, Debian, Fedora Workstation, openSUSE —
ssh
уже есть после установки, можно сразу стучаться на сервер.В минимальных сборках (например, Ubuntu Server Minimal, Arch Linux, Linux From Scratch) — нет, надо ставить руками.
Сам
sshd
(серверная часть) обычно предустановлен только в серверных редакциях (Ubuntu Server, RHEL/CentOS, SUSE Linux Enterprise Server).
То есть ssh «есть из коробки» ровно там, где дистрибутив рассчитан на сетевую работу по умолчанию, а не на демонстрацию рабочего стола для бабушки.
tlittle
20.08.2025 09:42Вот видите. Т.е., не "из коробки в Linux есть ssh", а во всех популярных дистрибутивах он идет из коробки. Что касается винды (и ее актуальности), то практически во всех актуальных версиях windows ssh-клиент идет "из коробки". В крайнем случае надо тыкнуть галочку в установленных компонентах винды.
andrezh
20.08.2025 09:42Теперь подключение — просто
ssh server1
. Круто, правда?Не круто! Под Windows вас ни на какой ssh сервер не пустит, пока не отключите inheritance ключу и не уберете права на файл всем, кроме владельца. Аналогично и на Linux - chmod 600 не только authorized_keys на сервере, но и ключи на клиенте.
suprunchuk Автор
20.08.2025 09:42Спасибо за лекцию, профессор chmod.exe. Я уж думал, Windows без вашего благословения вообще не запустится. Видимо, вы лично проверяете каждый приватный ключ на планете, стоя у дверей SSH-сервера с бейджиком «Инспектор прав доступа». Надеюсь, хоть на выходных вам дают chmod 777, чтобы отдохнуть.
Barodzik99
20.08.2025 09:42спасибо, кэп. Именно поэтому SSH так и устроен: если ключ валяется «для всех», то это уже не приватный ключ. Хотеть, чтобы он работал без
chmod 600
или отключения inheritance — это как требовать, чтобы замок открывался любым ключом
NekoYos
20.08.2025 09:42Статья совсем безсмысленная - в интернетах сотни и тысячи раз это расписывали. Сюда бы для приличия добавить конфигурацию sshd_config, с отключением пароля и рута, и для красоты пример анзибла которым конфигурировать настройки sshd на серверах
suprunchuk Автор
20.08.2025 09:42Ну конечно, куда ж без юного архитектора интернета! Сначала докажи, что сам умеешь заходить дальше чем
ssh root@localhost
, а потом приходи рассказывать, как тут для приличия анзибл прикрутить.
Barodzik99
20.08.2025 09:42Статья не обязана превращаться в твой личный «sshd_config + анзибл для чайников». Если ты не способен открыть мануал и сам настроить sshd — это уже твоя проблема, а не недостаток материала.
trabl
20.08.2025 09:42OMG, шёл 2025 год, на Хабре выложили статью как создать ssh ключ и подключаться не по паролю а по ключу. При этом забыли упомянуть что желательно отключить вход от root и аутентификацию по паролю. Если серверов много, то естественно нужно использовать Ansible для таких задач.
Barodzik99
20.08.2025 09:42OMG, шёл 2025 год, а тип на Хабре пишет OMG. До сих пор появляются комментаторы, которые думают, что без их банальностей про
PermitRootLogin no
и «ну вы же Ansible поставьте» статья вдруг теряет смысл. Спасибо, без тебя мы бы никогда не догадались. Если для тебя уровень текста «слишком базовый» — это не проблема статьи, это твоя проблема: значит, ты явно не её целевая аудитория. Интернет реально большой, иди читай Ansible playbooks и не мешай тем, кому эта информация ещё полезна
suprunchuk Автор
20.08.2025 09:42Ого, целый 2025 год, а ты всё ещё рассказываешь, что SSH лучше с ключом, а root надо блокировать. Жду с нетерпением твой мастер-класс 'Как открыть дверь, когда она не закрыта'.
MyWhiteShadow
20.08.2025 09:42Мда, самая нейронная статья на хабре. Статью написал Grok, а комменты - Chat GPT
MadridianFox
Зачем это здесь? Ну т.е. это уже написано сотни раз в интернете. Наверняка и на хабре найдётся не один пост на эту тему.
andrezh
Тоже интересно. Ссылки на телеграм нет. Очевидно, что статья, написанная ИИ, не наберет плюсов. Да еще автор прошелся по комментариям (к слову, конструктивным и полезным), минусанул их и плюнул всем в карму. А комментарий, который тоже написан ИИ, от юзера, зарегистрировавшегося за пару часов до статьи и, очевидно, только ради этого комментария, автор закрепил.
Кто-нибудь знает, в чем профит?
Barodzik99
ну ты и Шерлок)
Barodzik99
У типа 0 постов,18 гневных комментов, когда в школу?
RomanKu
Мне казалось, что после моей статьи на хабре про белые пятна в ssh (7 летней давности) уже не о чем писать, но была как минимум одна очень хорошая статья
P.S. Надеюсь обойдемся без взаимного минусования кармы
suprunchuk Автор
Ты, видимо, из тех школьников, которые, когда учитель пишет на доске формулу, встают и кричат: «ЗАЧЕМ ЭТО ЗДЕСЬ? ЭТО УЖЕ В КНИГЕ НАПИСАНО!». Успокойся, родной, мир не крутится вокруг твоего поисковика. Не хочешь читать — проходи мимо, а то интернет без тебя уже сотни раз справился.
Barodzik99
А зачем тогда твой комментарий здесь? Его тоже уже писали «сотни раз в интернете» и наверняка даже на Хабре. Но почему-то тебя это не смущает.