Skip to main content

Настройка SSH ключей для безопасного подключения

🎯 Описание

Для чего эта инструкция: Пошаговая настройка современной аутентификации SSH по ключам Ed25519 с отключением паролей для максимальной безопасности.

Когда используется:

  • Первоначальная настройка доступа к серверам
  • Подключение новых серверов к VS Code через Remote-SSH
  • Замена устаревших RSA ключей на Ed25519
  • Усиление безопасности существующих подключений

Краткий контекст: Настройка включает генерацию ключей, их установку на сервер, конфигурацию клиента и сервера. Подходит для Ubuntu/Debian серверов.


🔧 Настройка на стороне клиента (Ubuntu 24)

🔑 Шаг 1: Генерация SSH ключа

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/<host>-ed25519 -C "user@<host>-$(date +%F)"

Расшифровка параметров:

  • ssh-keygen — создание пары ключей (приватный + публичный)
  • -t ed25519 — современный тип ключа (быстрый, безопасный)
  • -a 100 — количество итераций KDF для защиты приватного ключа
  • -f ~/.ssh/<host>-ed25519 — имя файлов ключей
  • -C "комментарий" — метка для идентификации ключа

При генерации обязательно задайте passphrase для защиты приватного ключа

🔐 Шаг 2: Загрузка ключа в SSH агент (опционально)

# Запуск SSH агента
eval "$(ssh-agent -s)"

# Добавление ключа в агент
ssh-add ~/.ssh/<host>-ed25519

Зачем нужно:

  • Агент держит ключ в памяти
  • Не нужно вводить passphrase при каждом подключении

📤 Шаг 3: Установка публичного ключа на сервер

ssh-copy-id -i ~/.ssh/<host>-ed25519.pub user@HOST

Что происходит:

  • Подключение к серверу по паролю (последний раз!)
  • Автоматическое добавление ключа в ~/.ssh/authorized_keys
  • Установка правильных прав доступа

⚙️ Шаг 4: Настройка SSH конфигурации

Создайте/отредактируйте ~/.ssh/config:

nano ~/.ssh/config

Добавьте блок для сервера:

Host myhost                      # удобный алиас для подключения
  HostName 203.0.113.10         # реальный IP/DNS сервера
  User ubuntu                    # имя пользователя на сервере
  Port 22                        # порт SSH (по умолчанию 22)
  IdentityFile ~/.ssh/<host>-ed25519  # путь к приватному ключу
  IdentitiesOnly yes             # использовать только указанные ключи
  StrictHostKeyChecking accept-new    # автоматически принимать новые ключи хостов

Объяснение параметров:

  • Host — алиас для команды ssh myhost
  • HostName — реальный адрес сервера
  • User — логин на удаленном сервере
  • IdentityFile — путь к приватному ключу
  • IdentitiesOnly yes — предотвращает ошибку "Too many authentication failures"
  • StrictHostKeyChecking accept-new — безопасное принятие новых host keys

✅ Тест подключения

ssh myhost

Должно подключиться без пароля (только passphrase если задавали).


🖥️ Настройка на стороне сервера

⚙️ Конфигурация SSH демона

Отредактируйте конфигурацию SSH:

sudo nano /etc/ssh/sshd_config

Обязательные параметры:

# Разрешение аутентификации по ключам
PubkeyAuthentication yes

# КРИТИЧНО: Отключение паролей (только после проверки ключей!)
PasswordAuthentication no

# Путь к файлу с авторизованными ключами
AuthorizedKeysFile %h/.ssh/authorized_keys

# Запрет root входа по паролю (лучше полный запрет: no)
PermitRootLogin prohibit-password

🔍 Проверка и применение конфигурации

# Проверка синтаксиса конфигурации
sudo sshd -t

# Применение изменений (без обрыва сессий)
sudo systemctl reload ssh

ВАЖНО: Отключайте PasswordAuthentication no только после успешной проверки подключения по ключу!

📋 Проверка прав доступа на сервере

# Правильные права для SSH директории и файлов
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown "$USER:$USER" ~/.ssh -R

🔍 Диагностика проблем

📊 Просмотр логов сервера:

# Мониторинг SSH логов в реальном времени
sudo journalctl -u ssh -f

# Альтернативно
sudo tail -f /var/log/auth.log

🐛 Отладка клиента:

# Подробный вывод отладки
ssh -vvv myhost

🔧 Проверка статуса SSH:

# Статус SSH службы
sudo systemctl status ssh

# Проверка портов
sudo netstat -tlnp | grep :22

💡 Полезные советы

  • Используйте Ed25519 вместо RSA - современнее и быстрее
  • Всегда ставьте passphrase на приватные ключи
  • Используйте SSH агент для удобства работы
  • Создавайте отдельные ключи для разных серверов
  • Делайте резервные копии ключей в надежном месте
  • Тестируйте подключение перед отключением паролей

⚠️ Частые ошибки

Ошибка Причина Решение
Permission denied (publickey) Ключ не установлен или неправильные права Проверить authorized_keys и права (700/600)
Too many authentication failures SSH предлагает много ключей Добавить IdentitiesOnly yes в config
Could not load host key Ошибка в sshd_config Проверить синтаксис: sudo sshd -t
Connection refused SSH служба не запущена sudo systemctl start ssh
VS Code не видит конфиг Неправильный путь или синтаксис Проверить ~/.ssh/config синтаксис
Постоянно спрашивает passphrase Ключ не в агенте ssh-add ~/.ssh/key-name

🚀 Подключение к VS Code

После настройки SSH конфигурации:

  1. Откройте VS Code
  2. Установите расширение Remote - SSH
  3. Нажмите Ctrl+Shift+P
  4. Выберите Remote-SSH: Connect to Host...
  5. Выберите ваш myhost из списка
  6. VS Code подключится автоматически!

🔄 Добавление новых серверов

Для каждого нового сервера повторите:

# 1. Генерация нового ключа
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/<newhost>-ed25519 -C "kodalin@<newhost>-$(date +%F)"

# 2. Копирование на сервер
ssh-copy-id -i ~/.ssh/<newhost>-ed25519.pub user@NEWHOST

# 3. Добавление блока в ~/.ssh/config

🛡️ Безопасность

Рекомендуемые дополнительные настройки sshd_config:

# Отключение пустых паролей
PermitEmptyPasswords no

# Ограничение количества попыток
MaxAuthTries 3

# Тайм-аут аутентификации
LoginGraceTime 60

# Отключение X11 forwarding (если не нужен)
X11Forwarding no

# Ограничение пользователей (опционально)
AllowUsers ubuntu kodalin

# Изменение порта (опционально)
Port 2222

После изменения порта обновите конфиг клиента:

Host myhost
  Port 2222
  # остальные параметры...

🎯 Результат

После выполнения инструкции у вас будет:

  • ✅ Безопасное подключение по ключам Ed25519
  • ✅ Отключена аутентификация по паролям
  • ✅ Удобная работа через SSH алиасы
  • ✅ Интеграция с VS Code Remote-SSH
  • ✅ Защищенная инфраструктура