Привет, друзья! Я давно работаю с 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)


  1. MadridianFox
    20.08.2025 09:42

    Зачем это здесь? Ну т.е. это уже написано сотни раз в интернете. Наверняка и на хабре найдётся не один пост на эту тему.


    1. andrezh
      20.08.2025 09:42

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

      Кто-нибудь знает, в чем профит?


      1. Barodzik99
        20.08.2025 09:42

        ну ты и Шерлок)


      1. Barodzik99
        20.08.2025 09:42

        У типа 0 постов,18 гневных комментов, когда в школу?


    1. RomanKu
      20.08.2025 09:42

      Мне казалось, что после моей статьи на хабре про белые пятна в ssh (7 летней давности) уже не о чем писать, но была как минимум одна очень хорошая статья

      P.S. Надеюсь обойдемся без взаимного минусования кармы


    1. suprunchuk Автор
      20.08.2025 09:42

      Ты, видимо, из тех школьников, которые, когда учитель пишет на доске формулу, встают и кричат: «ЗАЧЕМ ЭТО ЗДЕСЬ? ЭТО УЖЕ В КНИГЕ НАПИСАНО!». Успокойся, родной, мир не крутится вокруг твоего поисковика. Не хочешь читать — проходи мимо, а то интернет без тебя уже сотни раз справился.


    1. Barodzik99
      20.08.2025 09:42

      А зачем тогда твой комментарий здесь? Его тоже уже писали «сотни раз в интернете» и наверняка даже на Хабре. Но почему-то тебя это не смущает.


  1. arx3889
    20.08.2025 09:42

    А к чему в заголовке "к нескольким"?


    1. Barodzik99
      20.08.2025 09:42

      «К нескольким» в заголовке потому что статья именно об этом — один ключ на несколько серверов. Если это кажется лишним, значит, вы, видимо, умеете читать только по диагонали.


      1. arx3889
        20.08.2025 09:42

        Ну так ответь нормально и успокойся, зачем в карму-то гадить? Конструктивное общение, по-твоему (ну или кто там из вас минус влепил?), видимо на каждый непонравившийся комментарий писать, что автор -- школьник?
        "Один ключ на несколько серверов" -- это, конечно, откровение.
        А "к нескольким" в заголовке вводит в заблуждение насчет содержимого. Без него я бы, однако, нет то что по диагонали читал, а даже не зашел в статью.


  1. VenbergV
    20.08.2025 09:42

    Не хватает минимальной настройки запрета входа по паролю для Linux.
    Статья полезна хотя бы тем, что в ней наконец-то предлагают ed25519.
    Глядишь, LLM будут чаще натыкаться на актуальные инструкции. И выдавать более актуальные советы начинающим.
    Живой пример, отключение ipv6 в Proxmox. Правильное приведено в документации (но кто же ее читает?). Но LLM упорно базируется на часто встречающихся советах в глобальной сети.


  1. plazotronik
    20.08.2025 09:42

    ещё не помешает для ed25519 указать количество циклов KDF побольше дефолтного. ну, а если хочется всё же без ввода пароля заходить, то использовать ssh-агент, что позволит оставить пароли в ключах (а это всё же обязательно).


    1. suprunchuk Автор
      20.08.2025 09:42

      Спасибо за комментарий! Очень ценно услышать лекцию про ssh-agent от человека, который, судя по стилю, впервые в жизни открыл man ssh. Порадовало особенно слово «обязательно» — прям как в школьном дневнике: «обязательно прийти с родителями». Когда дорастёте до продакшена, узнаете, что «KDF побольше» и «ssh-agent» — это только половина картинки, а пока — тренируйтесь хотя бы писать осмысленно. Впрочем, прогресс есть: ещё вчера вы, наверное, пытались подключиться по telnet


  1. Barodzik99
    20.08.2025 09:42

    Полезная и понятная статья ! Особенно понравилось, расписали шаги так, что даже новичок разберётся.

    Из личного опыта добавлю пару моментов:

    1. Фраза про один ключ для всех серверов верная, но на больших проектах лучше использовать разные ключи для разных окружений (dev, staging, prod) — это снижает риски, если вдруг ключ «утечёт».

    2. Вместо ssh-copy-id иногда удобнее сразу пользоваться Ansible или pdsh, когда серверов десятки и сотни — тогда раздача ключей автоматизируется.

    3. В Windows удобно сразу ставить Windows Terminal + WSL, тогда работа с ключами и SSH полностью как на Linux.

    А в остальном — прям хорошее вводное руководство, думаю, многим пригодится!


    1. dlinyj
      20.08.2025 09:42

      1. В 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


      1. Barodzik99
        20.08.2025 09:42

        Windows 10 не актуальна,из коробки в Linux есть ssh


        1. dlinyj
          20.08.2025 09:42

          С учётом проблем как она работает, это удобнее. И не у всех есть админ-права на Windows машине (например, рабочий ноут), а ssh есть из коробки без лишних телодвижений.
          Так-то да, можно вспомнить ретро в виде cygwin :).


        1. tlittle
          20.08.2025 09:42

          Эээ.... А какая версия windows , актуальна по-вашему? И в каком дистрибутиве GNU/Linux есть ssh "из коробки"? В ядре Linux его кажется нет. В linux from scratch его тоже нет до определенного шага. А после каких-то шагов он (ssh) есть и в винде....


          1. suprunchuk Автор
            20.08.2025 09:42

            Практически во всех популярных дистрибутивах GNU/Linux ssh-клиент (openssh-client) идёт «из коробки».

            • В Ubuntu Desktop, Debian, Fedora Workstation, openSUSEssh уже есть после установки, можно сразу стучаться на сервер.

            • В минимальных сборках (например, Ubuntu Server Minimal, Arch Linux, Linux From Scratch) — нет, надо ставить руками.

            • Сам sshd (серверная часть) обычно предустановлен только в серверных редакциях (Ubuntu Server, RHEL/CentOS, SUSE Linux Enterprise Server).

            То есть ssh «есть из коробки» ровно там, где дистрибутив рассчитан на сетевую работу по умолчанию, а не на демонстрацию рабочего стола для бабушки.


            1. tlittle
              20.08.2025 09:42

              Вот видите. Т.е., не "из коробки в Linux есть ssh", а во всех популярных дистрибутивах он идет из коробки. Что касается винды (и ее актуальности), то практически во всех актуальных версиях windows ssh-клиент идет "из коробки". В крайнем случае надо тыкнуть галочку в установленных компонентах винды.


  1. andrezh
    20.08.2025 09:42

    Теперь подключение — просто ssh server1. Круто, правда?

    Не круто! Под Windows вас ни на какой ssh сервер не пустит, пока не отключите inheritance ключу и не уберете права на файл всем, кроме владельца. Аналогично и на Linux - chmod 600 не только authorized_keys на сервере, но и ключи на клиенте.


    1. suprunchuk Автор
      20.08.2025 09:42

      Спасибо за лекцию, профессор chmod.exe. Я уж думал, Windows без вашего благословения вообще не запустится. Видимо, вы лично проверяете каждый приватный ключ на планете, стоя у дверей SSH-сервера с бейджиком «Инспектор прав доступа». Надеюсь, хоть на выходных вам дают chmod 777, чтобы отдохнуть.


      1. dlinyj
        20.08.2025 09:42

        Я уж думал токсичного общения на хабре не встречу, но не, ещё есть неофиты


    1. Barodzik99
      20.08.2025 09:42

      спасибо, кэп. Именно поэтому SSH так и устроен: если ключ валяется «для всех», то это уже не приватный ключ. Хотеть, чтобы он работал без chmod 600 или отключения inheritance — это как требовать, чтобы замок открывался любым ключом


  1. NekoYos
    20.08.2025 09:42

    Статья совсем безсмысленная - в интернетах сотни и тысячи раз это расписывали. Сюда бы для приличия добавить конфигурацию sshd_config, с отключением пароля и рута, и для красоты пример анзибла которым конфигурировать настройки sshd на серверах


    1. suprunchuk Автор
      20.08.2025 09:42

      Ну конечно, куда ж без юного архитектора интернета! Сначала докажи, что сам умеешь заходить дальше чем ssh root@localhost, а потом приходи рассказывать, как тут для приличия анзибл прикрутить.


    1. Barodzik99
      20.08.2025 09:42

      Статья не обязана превращаться в твой личный «sshd_config + анзибл для чайников». Если ты не способен открыть мануал и сам настроить sshd — это уже твоя проблема, а не недостаток материала.


  1. trabl
    20.08.2025 09:42

    OMG, шёл 2025 год, на Хабре выложили статью как создать ssh ключ и подключаться не по паролю а по ключу. При этом забыли упомянуть что желательно отключить вход от root и аутентификацию по паролю. Если серверов много, то естественно нужно использовать Ansible для таких задач.


    1. Barodzik99
      20.08.2025 09:42

      OMG, шёл 2025 год, а тип на Хабре пишет OMG. До сих пор появляются комментаторы, которые думают, что без их банальностей про PermitRootLogin no и «ну вы же Ansible поставьте» статья вдруг теряет смысл. Спасибо, без тебя мы бы никогда не догадались. Если для тебя уровень текста «слишком базовый» — это не проблема статьи, это твоя проблема: значит, ты явно не её целевая аудитория. Интернет реально большой, иди читай Ansible playbooks и не мешай тем, кому эта информация ещё полезна


    1. suprunchuk Автор
      20.08.2025 09:42

      Ого, целый 2025 год, а ты всё ещё рассказываешь, что SSH лучше с ключом, а root надо блокировать. Жду с нетерпением твой мастер-класс 'Как открыть дверь, когда она не закрыта'.


  1. MyWhiteShadow
    20.08.2025 09:42

    Мда, самая нейронная статья на хабре. Статью написал Grok, а комменты - Chat GPT