Введение / Зачем это нужно
SSH-ключи — это стандарт для безопасного удалённого доступа к серверам Linux. Вместо ввода пароля при каждом подключении вы аутентифицируетесь с помощью криптографической пары: приватный ключ хранится у вас, публичный — на сервере. Это не только удобнее, но и значительно безопаснее, так как исключает перехват пароля и защищает от брутфорс-атак.
После выполнения этого гайда вы сможете:
- Подключаться к серверам по SSH без ввода пароля.
- Повысить безопасность ваших серверов, отключив аутентификацию по паролю.
- Управлять множеством серверов через один ключ или набор ключей.
Требования / Подготовка
Перед началом убедитесь, что:
- Вы работаете в терминале локальной Linux-машины (или WSL2 в Windows).
- На удалённом сервере установлен и запущен демон sshd (
systemctl status sshd). - У вас есть учётные данные (логин и пароль) для доступа к целевому серверу по SSH.
- Пакет
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"
Программа предложит:
- Путь сохранения ключа — просто нажмите
Enter, чтобы использовать путь по умолчанию (~/.ssh/id_ed25519или~/.ssh/id_rsa). - Passphrase — парольную фразу для дополнительной защиты ключа. Настоятельно рекомендуется задать, если ключ будет использоваться на ноутбуке/рабочей станции. Можно оставить пустым (нажать
Enterдважды), тогда ключ будет использоваться без пароля.
После успешного выполнения в ~/.ssh/ появятся два файла:
id_ed25519(илиid_rsa) — приватный ключ. Храните его в секрете, не передавайте никому!id_ed25519.pub(илиid_rsa.pub) — публичный ключ. Его безопасно отправлять на серверы.
Шаг 2: Скопируйте публичный ключ на сервер (ssh-copy-id)
Самый простой способ — утилита ssh-copy-id. Она:
- Подключается к серверу с помощью вашего текущего пароля.
- Создаёт (при необходимости) директорию
~/.sshна сервере. - Добавляет ваш публичный ключ в файл
~/.ssh/authorized_keys. - Устанавливает правильные права доступа.
Выполните команду:
ssh-copy-id пользователь@ip_сервера
Пример:
ssh-copy-id deploy@192.168.1.100
Вам будет предложено ввести пароль пользователя deploy на сервере. После успешного копирования вы увидите сообщение Number of key(s) added: 1.
Альтернатива: ручное копирование
Если ssh-copy-id отсутствует (редко), скопируйте ключ вручную:
- Просмотрите содержимое публичного ключа:
cat ~/.ssh/id_ed25519.pub
Скопируйте всю длинную строку, которая начинается сssh-ed25519 AAAA.... - Подключитесь к серверу:
ssh пользователь@ip_сервера - На сервере создайте директорию .ssh (если её нет) и добавьте ключ:
mkdir -p ~/.ssh echo "скопированная_строка_ключа" >> ~/.ssh/authorized_keys - Установите строгие права на сервере (критически важно!):
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
Шаг 3: Настройте ssh-agent для автоматической работы
ssh-agent — это фоновый процесс, который хранит ваш расшифрованный приватный ключ в памяти. Это позволяет не вводить passphrase при каждом подключении после первого ввода.
- Запустите агент (обычно он уже запущен в современных DE):
eval $(ssh-agent -s) # Пример вывода: Agent pid 12345 - Добавьте ваш приватный ключ в агент:
ssh-add ~/.ssh/id_ed25519
Если вы задавали passphrase, введите его сейчас. Ключ будет загружен в память агента. - (Опционально) Автозагрузка ключа при старте сессии
Добавьте следующие строки в конец файла~/.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 для ключа при первом использовании в сессии) быть не должно.
Если подключение прошло успешно, можно отключить аутентификацию по паролю на сервере для повышения безопасности:
- Подключитесь к серверу.
- Отредактируйте
/etc/ssh/sshd_config:sudo nano /etc/ssh/sshd_config - Найдите строку
#PasswordAuthentication yesи измените на:PasswordAuthentication no - Перезапустите демон 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 (проксирование агента).
Проверка результата
- Подключение работает без пароля — основной признак.
- На сервере в
~/.ssh/authorized_keysесть ваша публичная строка (проверьтеcat ~/.ssh/authorized_keys). - Права на сервере:
~/.ssh= 700,~/.ssh/authorized_keys= 600. - На клиенте:
~/.ssh= 700,id_rsa(приватный) = 600,id_rsa.pub= 644. - Команда
ssh-add -lпоказывает загруженные ключи в агенте.
Возможные проблемы
Ошибка: Permission denied (publickey,password).
- Причина: Сервер не видит ваш ключ или ключ не соответствует.
- Решение:
- Убедитесь, что публичный ключ полностью и без изменений скопирован в
~/.ssh/authorized_keysна сервере (одна строка!). - Проверьте права на сервере:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys. - Проверьте, что владелец файлов — ваш пользователь на сервере (
chown -R ваш_пользователь:ваш_пользователь ~/.ssh). - Убедитесь, что в
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).