Другое

Генерация и настройка SSH-ключей на Linux: пошаговое руководство

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

Обновлено 17 февраля 2026 г.
15-30 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 22.04+Debian 11+CentOS 8+/RHEL 8+Fedora 35+Arch Linux

Введение / Зачем это нужно

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

После выполнения этого гайда вы сможете:

  • Подключаться к серверам по SSH без ввода пароля.
  • Повысить безопасность ваших серверов, отключив аутентификацию по паролю.
  • Управлять множеством серверов через один ключ или набор ключей.

Требования / Подготовка

Перед началом убедитесь, что:

  1. Вы работаете в терминале локальной Linux-машины (или WSL2 в Windows).
  2. На удалённом сервере установлен и запущен демон sshd (systemctl status sshd).
  3. У вас есть учётные данные (логин и пароль) для доступа к целевому серверу по SSH.
  4. Пакет openssh-client установлен локально (обычно есть по умолчанию).

Проверьте наличие клиента:

ssh -V
# Пример вывода: OpenSSH_8.9p1, OpenSSL 3.0.2 15 Mar 2022

Если команда не найдена, установите:

  • Ubuntu/Debian: sudo apt update && sudo apt install openssh-client
  • CentOS/RHEL/Fedora: sudo dnf install openssh-clients
  • Arch Linux: sudo pacman -S openssh

Шаг 1: Сгенерируйте пару SSH-ключей

Современные системы рекомендуют использовать алгоритм Ed25519 — он быстрый и безопасный. Если же нужна совместимость с очень старыми системами (например, CentOS 6), используйте RSA.

Вариант A (рекомендуется, Ed25519):

ssh-keygen -t ed25519 -C "ваш_email@example.com"

Вариант B (совместимость, RSA 4096 бит):

ssh-keygen -t rsa -b 4096 -C "ваш_email@example.com"

Программа предложит:

  1. Путь сохранения ключа — просто нажмите Enter, чтобы использовать путь по умолчанию (~/.ssh/id_ed25519 или ~/.ssh/id_rsa).
  2. Passphrase — парольную фразу для дополнительной защиты ключа. Настоятельно рекомендуется задать, если ключ будет использоваться на ноутбуке/рабочей станции. Можно оставить пустым (нажать Enter дважды), тогда ключ будет использоваться без пароля.

После успешного выполнения в ~/.ssh/ появятся два файла:

  • id_ed25519 (или id_rsa) — приватный ключ. Храните его в секрете, не передавайте никому!
  • id_ed25519.pub (или id_rsa.pub) — публичный ключ. Его безопасно отправлять на серверы.

Шаг 2: Скопируйте публичный ключ на сервер (ssh-copy-id)

Самый простой способ — утилита ssh-copy-id. Она:

  1. Подключается к серверу с помощью вашего текущего пароля.
  2. Создаёт (при необходимости) директорию ~/.ssh на сервере.
  3. Добавляет ваш публичный ключ в файл ~/.ssh/authorized_keys.
  4. Устанавливает правильные права доступа.

Выполните команду:

ssh-copy-id пользователь@ip_сервера

Пример:

ssh-copy-id deploy@192.168.1.100

Вам будет предложено ввести пароль пользователя deploy на сервере. После успешного копирования вы увидите сообщение Number of key(s) added: 1.

Альтернатива: ручное копирование

Если ssh-copy-id отсутствует (редко), скопируйте ключ вручную:

  1. Просмотрите содержимое публичного ключа:
    cat ~/.ssh/id_ed25519.pub
    

    Скопируйте всю длинную строку, которая начинается с ssh-ed25519 AAAA....
  2. Подключитесь к серверу:
    ssh пользователь@ip_сервера
    
  3. На сервере создайте директорию .ssh (если её нет) и добавьте ключ:
    mkdir -p ~/.ssh
    echo "скопированная_строка_ключа" >> ~/.ssh/authorized_keys
    
  4. Установите строгие права на сервере (критически важно!):
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    

Шаг 3: Настройте ssh-agent для автоматической работы

ssh-agent — это фоновый процесс, который хранит ваш расшифрованный приватный ключ в памяти. Это позволяет не вводить passphrase при каждом подключении после первого ввода.

  1. Запустите агент (обычно он уже запущен в современных DE):
    eval $(ssh-agent -s)
    # Пример вывода: Agent pid 12345
    
  2. Добавьте ваш приватный ключ в агент:
    ssh-add ~/.ssh/id_ed25519
    

    Если вы задавали passphrase, введите его сейчас. Ключ будет загружен в память агента.
  3. (Опционально) Автозагрузка ключа при старте сессии
    Добавьте следующие строки в конец файла ~/.bashrc или ~/.profile:
    # Запуск ssh-agent, если не запущен
    if ! pgrep -u "$USER" ssh-agent > /dev/null; then
        eval "$(ssh-agent -s)"
    fi
    # Добавление стандартного ключа, если он ещё не добавлен
    ssh-add -l > /dev/null 2>&1 || ssh-add ~/.ssh/id_ed25519 2>/dev/null
    

    После этого ключ будет автоматически загружаться при каждом открытии терминала.

Шаг 4: Проверьте подключение без пароля

Теперь попробуйте подключиться к серверу:

ssh пользователь@ip_сервера

Ожидаемый результат: Вы сразу попадаете на командную строку сервера. Никаких запросов пароля (кроме возможного ввода passphrase для ключа при первом использовании в сессии) быть не должно.

Если подключение прошло успешно, можно отключить аутентификацию по паролю на сервере для повышения безопасности:

  1. Подключитесь к серверу.
  2. Отредактируйте /etc/ssh/sshd_config:
    sudo nano /etc/ssh/sshd_config
    
  3. Найдите строку #PasswordAuthentication yes и измените на:
    PasswordAuthentication no
    
  4. Перезапустите демон SSH:
    sudo systemctl restart sshd
    

Внимание: Перед отключением парольной аутентификации убедитесь, что ваш ключ работает, и у вас есть доступ по другому ключу или через консоль управления (например, в облаке) на случай ошибки!

Шаг 5: (Опционально) Создайте конфигурацию для удобства

Если вы работаете с множеством серверов, создайте файл ~/.ssh/config на локальной машине:

nano ~/.ssh/config

Добавьте записи в таком формате:

# Пример для рабочего сервера
Host web-prod
    HostName 192.168.1.100
    User deploy
    IdentityFile ~/.ssh/id_ed25519_web
    Port 22

# Пример для базы данных
Host db-int
    HostName 10.0.5.20
    User dbadmin
    IdentityFile ~/.ssh/id_ed25519
    Port 2222  # если SSH слушает нестандартный порт

Теперь подключаться можно коротко:

ssh web-prod

Конфиг также позволяет задавать опции вроде ProxyJump (прыжки через хост) или ForwardAgent (проксирование агента).

Проверка результата

  1. Подключение работает без пароля — основной признак.
  2. На сервере в ~/.ssh/authorized_keys есть ваша публичная строка (проверьте cat ~/.ssh/authorized_keys).
  3. Права на сервере: ~/.ssh = 700, ~/.ssh/authorized_keys = 600.
  4. На клиенте: ~/.ssh = 700, id_rsa (приватный) = 600, id_rsa.pub = 644.
  5. Команда ssh-add -l показывает загруженные ключи в агенте.

Возможные проблемы

Ошибка: Permission denied (publickey,password).

  • Причина: Сервер не видит ваш ключ или ключ не соответствует.
  • Решение:
    1. Убедитесь, что публичный ключ полностью и без изменений скопирован в ~/.ssh/authorized_keys на сервере (одна строка!).
    2. Проверьте права на сервере: chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys.
    3. Проверьте, что владелец файлов — ваш пользователь на сервере (chown -R ваш_пользователь:ваш_пользователь ~/.ssh).
    4. Убедитесь, что в sshd_config на сервере разрешён метод PubkeyAuthentication yes.

Ошибка: Bad permissions: ignore key: ...

  • Причина: Слишком открытые права на приватный ключ локально.
  • Решение: chmod 600 ~/.ssh/id_ed25519 (или id_rsa).

Ошибка: The authenticity of host '...' can't be established.

  • Причина: Вы подключаетесь к серверу впервые, и его fingerprint неизвестен.
  • Решение: Это предупреждение, а не ошибка. Если уверены в IP/домене, введите yes. Ключ хоста сохранится в ~/.ssh/known_hosts.

Ключ не добавляется в ssh-agent автоматически

  • Решение: Проверьте, добавлен ли ключ: ssh-add -l. Если нет, добавьте вручную ssh-add ~/.ssh/id_ed25519. Для автозагрузки проверьте настройки в ~/.bashrc (см. Шаг 3).

Не работает копирование через ssh-copy-id (Connection refused)

  • Причина: Сервер не принимает SSH-подключения (порт закрыт, firewall, сервис не запущен).
  • Решение: Проверьте, доступен ли порт 22 (или другой) с вашего IP: nc -zv ip_сервера 22. Убедитесь, что sshd запущен на сервере: sudo systemctl status sshd. Проверьте firewall (sudo ufw status или sudo firewall-cmd --list-all).

Часто задаваемые вопросы

Нужно ли ставить пароль (passphrase) на SSH-ключ?
Что делать, если ssh-agent не добавляет ключ автоматически?
Почему сервер拒绝 ключ с ошибкой 'Permissions 0644 for ... are too open'?
Можно ли использовать один ключ для нескольких серверов?

Полезное

Установите OpenSSH Client (если не установлен)
Сгенерируйте пару SSH-ключей
Скопируйте публичный ключ на сервер
Настройте ssh-agent для автоматической загрузки ключа
Проверьте подключение без пароля

Эта статья помогла вам решить проблему?