Gymterview
junior

Как работать с SSH?

SSH (Secure Shell) — протокол для безопасного удалённого подключения к серверам, выполнения команд и передачи данных через зашифрованный канал. Для Java-разработчика SSH — основной способ взаимодействия с серверами, CI/CD-инфраструктурой и Git-репозиториями.

Подключение

Пример
ssh user@hostname                 # Подключение к серверу
ssh user@192.168.1.100            # По IP-адресу
ssh -p 2222 user@hostname         # Указание нестандартного порта
ssh user@hostname 'ls -la /opt'   # Выполнить команду удалённо и выйти

Генерация SSH-ключей

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

Пример
# Генерация пары ключей (рекомендуется Ed25519)
ssh-keygen -t ed25519 -C "developer@example.com"

# Или RSA (4096 бит) — для совместимости со старыми системами
ssh-keygen -t rsa -b 4096 -C "developer@example.com"

# Результат:
# ~/.ssh/id_ed25519       — приватный ключ (НИКОГДА не передавать!)
# ~/.ssh/id_ed25519.pub   — публичный ключ (можно передавать)

Копирование ключа на сервер

Пример
# Автоматическое копирование (рекомендуется)
ssh-copy-id user@hostname
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname

# Ручное копирование (если ssh-copy-id недоступен)
cat ~/.ssh/id_ed25519.pub | ssh user@hostname \
    'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys'

ssh-agent — менеджер ключей

ssh-agent хранит расшифрованные приватные ключи в памяти, чтобы не вводить passphrase при каждом использовании:

Пример
eval $(ssh-agent)                  # Запуск агента
ssh-add ~/.ssh/id_ed25519          # Добавить ключ
ssh-add -l                         # Список ключей в агенте

Конфигурация ~/.ssh/config

Файл конфигурации позволяет задать алиасы для серверов, избавляя от запоминания IP-адресов и параметров:

Пример
Host production
    HostName 10.0.1.50
    User deploy
    Port 2222
    IdentityFile ~/.ssh/prod_key

Host staging
    HostName 10.0.2.30
    User deploy
    IdentityFile ~/.ssh/staging_key

Host github.com
    IdentityFile ~/.ssh/github_key

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes

# Теперь можно подключаться:
# ssh production       вместо   ssh -p 2222 deploy@10.0.1.50
# ssh staging          вместо   ssh deploy@10.0.2.30

SSH-туннелирование (проброс портов)

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

Пример
# Локальный проброс: доступ к удалённому сервису через локальный порт
ssh -L 5432:localhost:5432 user@server
# Теперь localhost:5432 → PostgreSQL на сервере

# Удалённый проброс: дать серверу доступ к локальному сервису
ssh -R 8080:localhost:8080 user@server

# Динамический проброс (SOCKS-прокси)
ssh -D 1080 user@server
# Весь трафик через прокси localhost:1080 идёт через сервер

Права доступа к SSH-файлам

SSH откажется работать, если права на файлы ключей слишком открыты:

Пример
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519          # Приватный ключ — только владелец
chmod 644 ~/.ssh/id_ed25519.pub      # Публичный ключ — можно читать всем
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/config

На собеседовании: покажите, что понимаете принцип асимметричной криптографии (приватный ключ остаётся у вас, публичный копируется на сервер). Знание ~/.ssh/config и SSH-туннелей отличает уверенного Middle от Junior. Частый вопрос: «как пробросить базу данных с production через bastion-хост?» — ssh -J bastion -L 5432:db-host:5432 user@bastion.