SSH: подключение к серверу

SSH (Secure Shell) — протокол зашифрованного удалённого доступа к серверу: позволяет выполнять команды, передавать файлы и создавать туннели через защищённое соединение.

Зачем нужно

SSH — основной инструмент управления Linux-серверами. Без него невозможно настроить VPS, задеплоить приложение вручную или отладить проблему на сервере. Ключевая пара (key pair) вместо пароля — более безопасный и удобный способ аутентификации, используемый в CI/CD для автоматических деплоев.

Где используется

  • Подключение к VPS (DigitalOcean, AWS EC2, Hetzner)
  • Автоматический деплой из GitHub Actions через appleboy/ssh-action
  • Копирование файлов на сервер (SCP, rsync)
  • Туннелирование портов для доступа к закрытым сервисам

Основной контент

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

# Создать пару ключей (Ed25519 — современный, надёжный)
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519

# Два файла:
# ~/.ssh/id_ed25519      — приватный ключ (НИКОМУ не давать!)
# ~/.ssh/id_ed25519.pub  — публичный ключ (копируется на сервер)

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

Добавление ключа на сервер

# Вариант 1: ssh-copy-id (если уже есть доступ с паролем)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip

# Вариант 2: вручную
ssh user@server-ip
mkdir -p ~/.ssh
echo "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Подключение

# Базовое подключение
ssh user@server-ip
ssh -i ~/.ssh/id_ed25519 user@server-ip   # явно указать ключ
ssh -p 2222 user@server-ip                # нестандартный порт

# ~/.ssh/config — алиасы для серверов
Host myserver
    HostName 1.2.3.4
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519
    Port 22

# Теперь можно просто
ssh myserver

Передача файлов

# SCP — копирование файлов
scp file.txt user@server:/var/www/
scp -r ./dist user@server:/var/www/myapp/

# rsync — синхронизация (быстрее, передаёт только изменения)
rsync -avz --delete ./dist/ user@server:/var/www/myapp/
rsync -avz -e "ssh -i ~/.ssh/deploy_key" ./dist/ user@server:/var/www/

Туннели (port forwarding)

# Локальный туннель: доступ к удалённой БД через localhost
ssh -L 5433:localhost:5432 user@server
# Теперь postgres://localhost:5433 → server:5432

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

SSH-ключ в GitHub Actions

- name: Deploy via SSH
  uses: appleboy/ssh-action@v1.0.0
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: deploy
    key: ${{ secrets.SSH_PRIVATE_KEY }}    # приватный ключ в GitHub Secret
    script: |
      cd /var/www/myapp
      git pull origin main
      npm ci --production
      pm2 restart myapp

Усиление безопасности SSH

# /etc/ssh/sshd_config
PasswordAuthentication no      # отключить вход по паролю
PermitRootLogin no             # запретить вход под root
Port 2222                      # нестандартный порт
AllowUsers deploy              # разрешить только конкретного пользователя

sudo systemctl restart sshd

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

  • Хранить приватный ключ в репозитории — использовать только GitHub Secrets
  • Права 644 на ~/.ssh/authorized_keys вместо 600 — SSH отказывает в подключении
  • Отключить вход по паролю до проверки что ключ работает — можно заблокировать себя
  • Не добавить IP Cloudflare/firewall-правила — порт 22 открыт для всего интернета

Связанные темы

Ресурсы