SSH-сервер на VPS: теория, безопасный конфиг и пошаговая настройка

Содержание

  1. Введение в SSH
  2. Теория и принципы работы SSH
  3. Безопасная настройка SSH-сервера
  4. Создание SSH-ключей на разных ОС
  5. Управление множеством SSH-ключей
  6. Дополнительные меры безопасности
  7. Мониторинг и логирование

Введение в SSH

SSH (Secure Shell) — это криптографический сетевой протокол для безопасного удалённого управления операционными системами и передачи данных. При работе с VPS (Virtual Private Server) SSH является основным инструментом администрирования.

Зачем нужна правильная настройка SSH?

  • Защита от взлома: неправильно настроенный SSH — это открытая дверь для злоумышленников
  • Предотвращение brute-force атак: ежедневно VPS подвергаются тысячам попыток подбора паролей
  • Соответствие стандартам безопасности: многие регуляторы требуют определённого уровня защиты
  • Защита данных: SSH защищает всю передаваемую информацию шифрованием

Теория и принципы работы SSH

Как работает SSH?

SSH использует архитектуру клиент-сервер и работает на основе криптографии с открытым ключом:

  1. Установка соединения: клиент инициирует подключение к серверу на порту 22 (по умолчанию)
  2. Согласование параметров: стороны договариваются о версии протокола и алгоритмах шифрования
  3. Аутентификация сервера: сервер предоставляет свой публичный ключ для проверки подлинности
  4. Аутентификация клиента: клиент подтверждает свою личность (ключ или пароль)
  5. Защищённый канал: создаётся зашифрованный туннель для обмена данными

Типы SSH-ключей

RSA (Rivest-Shamir-Adleman)

  • Размер: 2048-4096 бит
  • Статус: устаревает, но всё ещё широко поддерживается
  • Рекомендация: минимум 3072 бит для новых ключей
  • Применение: универсальная совместимость со старыми системами
# Генерация RSA ключа
ssh-keygen -t rsa -b 4096 -C "email@example.com"

Ed25519 (Edwards-curve Digital Signature Algorithm)

  • Размер: фиксированный 256 бит
  • Статус: современный стандарт, рекомендуется
  • Преимущества: быстрее RSA, более безопасен, меньше размер ключа
  • Применение: для современных систем (Linux, macOS 10.12+, Windows 10+)
# Генерация Ed25519 ключа (рекомендуется)
ssh-keygen -t ed25519 -C "email@example.com"

ECDSA (Elliptic Curve Digital Signature Algorithm)

  • Размер: 256, 384 или 521 бит
  • Статус: хорош, но Ed25519 предпочтительнее
  • Особенность: основан на эллиптических кривых

SSH Protocol версии

  • Protocol 1: устарел, имеет уязвимости — НИКОГДА не использовать
  • Protocol 2: текущий стандарт, единственный безопасный вариант

Безопасная настройка SSH-сервера

Базовая конфигурация sshd_config

Файл конфигурации SSH-сервера находится по адресу /etc/ssh/sshd_config

# Открываем конфигурационный файл
sudo nano /etc/ssh/sshd_config

Рекомендуемые настройки безопасности

1. Основные параметры протокола

# Использовать только SSH Protocol 2
Protocol 2

# Изменить стандартный порт (снижает автоматические атаки)
Port 2222

# Указать конкретные IP-адреса для прослушивания
# Оставить закомментированным для прослушивания всех интерфейсов
# ListenAddress 0.0.0.0
# ListenAddress ::

# Время на аутентификацию (30 секунд достаточно)
LoginGraceTime 30

# Ключи сервера (используем современные алгоритмы)
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

2. Аутентификация и доступ

# КРИТИЧЕСКИ ВАЖНО: Запретить вход root
PermitRootLogin no

# Включить строгую проверку прав на файлы
StrictModes yes

# Максимальное количество попыток аутентификации
MaxAuthTries 3

# Максимальное количество одновременных сессий
MaxSessions 10

# Включить аутентификацию по ключу (основной метод)
PubkeyAuthentication yes

# Расположение авторизованных ключей
AuthorizedKeysFile .ssh/authorized_keys

# ОТКЛЮЧИТЬ парольную аутентификацию (после настройки ключей!)
PasswordAuthentication no

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

# Отключить аутентификацию через keyboard-interactive
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no

3. Дополнительные функции

# X11 Forwarding (отключить если не используется)
X11Forwarding no

# Разрешить использование PAM
UsePAM yes

# Не показывать MOTD (Message of the Day)
PrintMotd no

# Принимать переменные окружения
AcceptEnv LANG LC_*

# SFTP subsystem (для передачи файлов)
Subsystem sftp /usr/lib/openssh/sftp-server

4. Ограничение доступа для конкретных пользователей

# Разрешить доступ только определённым пользователям
AllowUsers msb admin deploy

# Или разрешить доступ группе
AllowGroups sshusers

# Запретить доступ определённым пользователям
# DenyUsers baduser

# Запретить доступ определённым группам
# DenyGroups noremote

Применение изменений

После редактирования конфигурации необходимо:

  1. Проверить синтаксис конфигурации:
sudo sshd -t
  1. Перезапустить SSH-сервис:
# Для Ubuntu/Debian
sudo systemctl restart sshd

# Или для более старых систем
sudo service ssh restart
  1. Проверить статус:
sudo systemctl status sshd

⚠️ ВАЖНО: Перед отключением парольной аутентификации убедитесь, что вы можете подключиться по SSH-ключу! Иначе вы потеряете доступ к серверу.


Создание SSH-ключей на разных ОС

Linux (Ubuntu, Debian, CentOS, etc.)

Генерация ключа Ed25519 (рекомендуется)

# Базовая генерация
ssh-keygen -t ed25519 -C "ваш_email@example.com"

# С указанием имени файла
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps_main -C "vps-main-server"

# С установкой passphrase через переменную окружения (для автоматизации)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps -N "ваш_надёжный_пароль"

Генерация ключа RSA (для совместимости)

# RSA 4096 бит с комментарием
ssh-keygen -t rsa -b 4096 -C "старый_сервер@example.com"

# Без passphrase (небезопасно, только для автоматизации)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_automation -N ""

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

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

# С указанием порта
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@your-server.com

# Ручной способ
cat ~/.ssh/id_ed25519.pub | ssh user@your-server.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Установка правильных прав доступа на сервере
ssh user@your-server.com "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Проверка подключения

# Тестовое подключение
ssh -i ~/.ssh/id_ed25519 user@your-server.com

# С отладкой (для диагностики проблем)
ssh -vvv -i ~/.ssh/id_ed25519 user@your-server.com

macOS

На macOS процесс идентичен Linux, так как используется тот же OpenSSH клиент.

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

# Ed25519 (рекомендуется для macOS 10.12+)
ssh-keygen -t ed25519 -C "macbook-pro@example.com"

# RSA для старых версий
ssh-keygen -t rsa -b 4096 -C "macbook@example.com"

Использование macOS Keychain

macOS позволяет хранить passphrase ключа в Keychain:

# Добавить ключ в ssh-agent
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# Для старых версий macOS (до macOS 12)
ssh-add -K ~/.ssh/id_ed25519

Автоматическая загрузка ключей при входе

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

# Создаём файл конфигурации
nano ~/.ssh/config

Добавьте следующее содержимое:

Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

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

# Стандартный способ
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.com

# Если ssh-copy-id не установлен (редко на современных macOS)
cat ~/.ssh/id_ed25519.pub | ssh user@server.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Windows

Способ 1: PowerShell (Windows 10+)

Windows 10 (1809+) и Windows 11 включают встроенный OpenSSH клиент.

Проверка установки OpenSSH
# Проверить наличие SSH
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

# Установить клиент SSH (если отсутствует)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Установить SSH-сервер (опционально)
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Генерация ключа через PowerShell
# Переходим в директорию пользователя
cd ~

# Ed25519 (рекомендуется)
ssh-keygen -t ed25519 -C "windows-pc@example.com"

# RSA
ssh-keygen -t rsa -b 4096 -C "windows-laptop@example.com"

# Ключи сохраняются в C:\Users\ИмяПользователя\.ssh\
Копирование ключа на сервер
# Windows 10 PowerShell (если ssh-copy-id доступен)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server.com "cat >> ~/.ssh/authorized_keys"

# Альтернативный способ
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
Настройка SSH-agent в Windows
# Запустить службу ssh-agent
Start-Service ssh-agent

# Установить автозапуск
Set-Service -Name ssh-agent -StartupType Automatic

# Добавить ключ в ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Способ 2: PuTTY

PuTTY — популярный SSH-клиент для Windows с собственным форматом ключей.

Установка PuTTY
  1. Скачайте с официального сайта: https://www.putty.org/
  2. Установите полный пакет (включает PuTTYgen, Pageant, PSCP, PSFTP)
Генерация ключа в PuTTYgen
  1. Запустите PuTTYgen
  2. Выберите тип ключа:
    • EdDSA (выберите кривую Ed25519) — рекомендуется
    • RSA (4096 бит) — для совместимости
  3. Нажмите Generate
  4. Двигайте мышью для генерации случайности
  5. Введите Key passphrase (настоятельно рекомендуется)
  6. Сохраните:
    • Save public key (формат PuTTY)
    • Save private key (формат .ppk)
Экспорт ключа в формат OpenSSH
1. В PuTTYgen: Conversions → Export OpenSSH key
2. Сохраните как id_ed25519 (для приватного ключа)
3. Публичный ключ скопируйте из окна "Public key for pasting into OpenSSH authorized_keys file"
Копирование ключа на сервер
1. Скопируйте содержимое публичного ключа из PuTTYgen
2. Подключитесь к серверу через PuTTY с паролем
3. Выполните команды:
   mkdir -p ~/.ssh
   echo "ваш_публичный_ключ" >> ~/.ssh/authorized_keys
   chmod 700 ~/.ssh
   chmod 600 ~/.ssh/authorized_keys
Использование Pageant (SSH-agent для PuTTY)
1. Запустите Pageant (появится иконка в трее)
2. Правый клик → Add Key
3. Выберите ваш .ppk файл
4. Введите passphrase
5. Ключ загружен и готов к использованию

Способ 3: WSL (Windows Subsystem for Linux)

Если у вас установлен WSL, используйте инструкции для Linux:

# В терминале WSL
wsl

# Затем следуйте инструкциям для Linux
ssh-keygen -t ed25519 -C "wsl@example.com"

Управление множеством SSH-ключей

Когда у вас несколько серверов, проектов или учётных записей, нужна организованная система управления ключами.

Структура директории ~/.ssh

~/.ssh/
├── config              # Конфигурация SSH-клиента
├── known_hosts         # Отпечатки известных хостов
├── id_ed25519          # Приватный ключ по умолчанию
├── id_ed25519.pub      # Публичный ключ по умолчанию
├── id_ed25519_github   # Ключ для GitHub
├── id_ed25519_github.pub
├── id_rsa_work         # Рабочий сервер
├── id_rsa_work.pub
├── id_ed25519_vps1     # VPS 1
├── id_ed25519_vps1.pub
├── id_ed25519_vps2     # VPS 2
└── id_ed25519_vps2.pub

Конфигурационный файл SSH (~/.ssh/config)

Это мощный инструмент для управления подключениями.

Linux/macOS: Полная конфигурация

# Создаём или редактируем конфиг
nano ~/.ssh/config
# Глобальные настройки для всех хостов
Host *
    # Использовать ssh-agent
    AddKeysToAgent yes
    
    # Для macOS: хранить passphrase в Keychain
    UseKeychain yes
    
    # Переиспользовать подключения (быстрее)
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h:%p
    ControlPersist 10m
    
    # Держать соединение живым
    ServerAliveInterval 60
    ServerAliveCountMax 3
    
    # Отключить строгую проверку ключей для локальной сети
    # StrictHostKeyChecking no

# GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes

# GitLab
Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519_gitlab
    IdentitiesOnly yes

# Рабочий VPS (основной)
Host work-vps
    HostName 192.168.1.100
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes
    ForwardAgent yes

# Личный VPS (США)
Host vps-usa
    HostName vps1.example.com
    User mikhail
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_vps_usa
    IdentitiesOnly yes
    LocalForward 8080 localhost:80
    LocalForward 3306 localhost:3306

# Личный VPS (Германия)
Host vps-de
    HostName vps2.example.com
    User admin
    Port 22022
    IdentityFile ~/.ssh/id_ed25519_vps_de
    IdentitiesOnly yes
    ProxyJump jumphost

# Jumphost (бастион-хост)
Host jumphost
    HostName jump.example.com
    User jumper
    Port 22
    IdentityFile ~/.ssh/id_ed25519_jump
    IdentitiesOnly yes

# Подключение через прокси/jumphost к внутреннему серверу
Host internal-server
    HostName 10.0.0.50
    User sysadmin
    Port 22
    IdentityFile ~/.ssh/id_ed25519_internal
    ProxyJump jumphost

# AWS EC2 инстанс
Host aws-prod
    HostName ec2-XX-XX-XX-XX.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/aws-production.pem
    IdentitiesOnly yes

# Множественные серверы с паттерном
Host web*.example.com
    User webadmin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_web
    IdentitiesOnly yes

# Локальная VM
Host local-vm
    HostName 192.168.56.101
    User vagrant
    Port 22
    IdentityFile ~/.ssh/id_rsa_vagrant
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Пояснения к параметрам конфигурации

  • Host: алиас (псевдоним) для подключения
  • HostName: реальный адрес сервера (IP или домен)
  • User: имя пользователя на удалённом сервере
  • Port: порт SSH (по умолчанию 22)
  • IdentityFile: путь к приватному ключу
  • IdentitiesOnly yes: использовать только указанный ключ
  • ForwardAgent yes: пробрасывать ssh-agent (осторожно с безопасностью!)
  • LocalForward: проброс локального порта на удалённый
  • RemoteForward: проброс удалённого порта на локальный
  • ProxyJump: подключение через промежуточный хост
  • ServerAliveInterval: интервал keep-alive пакетов (секунды)
  • ControlMaster: переиспользование SSH-соединений
  • StrictHostKeyChecking: проверка отпечатка хоста

Использование конфигурации

После настройки config файла подключение становится простым:

# Вместо: ssh -i ~/.ssh/id_ed25519_work -p 2222 deploy@192.168.1.100
ssh work-vps

# Вместо длинной команды для GitHub
ssh github.com

# Копирование файла
scp file.txt vps-usa:/home/mikhail/

# Синхронизация с rsync
rsync -avz /local/path/ vps-de:/remote/path/

Windows: SSH Config

Для OpenSSH (PowerShell)

# Создаём конфиг файл
New-Item -Path $env:USERPROFILE\.ssh\config -ItemType File -Force
notepad $env:USERPROFILE\.ssh\config

Содержимое идентично Linux/macOS конфигу, но пути к ключам должны быть Windows-стиля:

Host work-vps
    HostName 192.168.1.100
    User deploy
    Port 2222
    IdentityFile C:\Users\YourName\.ssh\id_ed25519_work
    IdentitiesOnly yes

Для PuTTY: Использование Sessions

PuTTY не использует конфигурационный файл, но позволяет сохранять сессии:

1. Запустите PuTTY
2. Введите параметры подключения:
   - Host Name: your-server.com
   - Port: 2222
   - Connection → SSH → Auth → Credentials: укажите .ppk файл
3. Вернитесь в Session
4. В "Saved Sessions" введите имя (например, "work-vps")
5. Нажмите Save

Для быстрого подключения используйте командную строку:

putty -load "work-vps"

Права доступа на файлы SSH

Linux/macOS

# Правильные права для директории
chmod 700 ~/.ssh

# Права для приватных ключей (КРИТИЧНО!)
chmod 600 ~/.ssh/id_*
chmod 600 ~/.ssh/*_rsa
chmod 600 ~/.ssh/*_ed25519

# Права для публичных ключей
chmod 644 ~/.ssh/*.pub

# Права для config
chmod 600 ~/.ssh/config

# Права для known_hosts
chmod 644 ~/.ssh/known_hosts

# Права для authorized_keys на сервере
chmod 600 ~/.ssh/authorized_keys

Windows (PowerShell)

# Для приватных ключей
icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r
icacls $env:USERPROFILE\.ssh\id_ed25519 /grant:r "$($env:USERNAME):(F)"

# Или через проводник:
# Правый клик → Свойства → Безопасность → Дополнительно
# Отключить наследование → Удалить все разрешения
# Добавить → Ваш пользователь → Полный доступ

Дополнительные меры безопасности

1. Fail2Ban — защита от brute-force атак

Fail2Ban мониторит логи и автоматически банит IP после нескольких неудачных попыток входа.

Установка Fail2Ban

# Ubuntu/Debian
sudo apt update
sudo apt install fail2ban

# CentOS/RHEL
sudo yum install epel-release
sudo yum install fail2ban

# Запуск и автозагрузка
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Настройка Fail2Ban для SSH

# Создаём локальный конфиг (не перезаписывается при обновлениях)
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# Время бана в секундах (10 минут = 600)
bantime = 600

# Время окна для подсчёта попыток
findtime = 600

# Максимальное количество попыток
maxretry = 3

# Email для уведомлений (опционально)
destemail = admin@example.com
sender = fail2ban@example.com

# Действие при бане
action = %(action_mwl)s

[sshd]

enabled = true

port = 2222

filter = sshd

logpath = /var/log/auth.log

maxretry = 3

bantime = 3600

findtime = 600

# Дополнительная защита от DDOS

[sshd-ddos]

enabled = true

port = 2222

filter = sshd-ddos

logpath = /var/log/auth.log

maxretry = 2

bantime = 7200

Проверка статуса Fail2Ban

# Общий статус
sudo fail2ban-client status

# Статус конкретной jail
sudo fail2ban-client status sshd

# Разбанить IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

2. UFW/iptables — firewall

Настройка UFW (Ubuntu/Debian)

# Установка
sudo apt install ufw

# Разрешить SSH (НЕ ЗАБУДЬТЕ перед включением!)
sudo ufw allow 2222/tcp comment 'SSH custom port'

# Разрешить только с определённого IP
sudo ufw allow from 192.168.1.0/24 to any port 2222 proto tcp

# Ограничить количество подключений (rate limiting)
sudo ufw limit 2222/tcp

# Включить firewall
sudo ufw enable

# Проверить статус
sudo ufw status verbose

Настройка iptables (расширенная конфигурация)

# Ограничить количество новых SSH-соединений с одного IP
sudo iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

# Логирование отброшенных пакетов
sudo iptables -A INPUT -p tcp --dport 2222 -j LOG --log-prefix "SSH DROP: " --log-level 4
sudo iptables -A INPUT -p tcp --dport 2222 -j DROP

# Сохранить правила
sudo iptables-save > /etc/iptables/rules.v4

3. Port Knocking — скрытый SSH

Port knocking скрывает SSH-порт до тех пор, пока не получит правильную последовательность пакетов на определённые порты.

Установка knockd

sudo apt install knockd

Настройка

sudo nano /etc/knockd.conf
[options]
    UseSyslog

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 15
    command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 15
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags    = syn

Использование с клиента

# Установка knock на клиенте
sudo apt install knockd

# Открыть порт
knock your-server.com 7000 8000 9000

# Подключиться по SSH
ssh user@your-server.com -p 2222

# Закрыть порт
knock your-server.com 9000 8000 7000

4. Two-Factor Authentication (2FA)

Установка Google Authenticator

# Установка PAM модуля
sudo apt install libpam-google-authenticator

# Настройка для пользователя
google-authenticator

Ответьте на вопросы:

  • Do you want authentication tokens to be time-based? Yes
  • Update ~/.google_authenticator file? Yes
  • Disallow multiple uses? Yes
  • Increase time skew window? No
  • Enable rate-limiting? Yes

Настройка SSH для 2FA

sudo nano /etc/pam.d/sshd

Добавьте в конец файла:

auth required pam_google_authenticator.so
sudo nano /etc/ssh/sshd_config

Измените/добавьте:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Перезапустите SSH:

sudo systemctl restart sshd

5. Автоматическое обновление системы

# Ubuntu/Debian
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# Настройка
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Мониторинг и логирование

1. Анализ логов SSH

# Последние попытки входа
sudo journalctl -u sshd | tail -100

# Неудачные попытки входа
sudo grep "Failed password" /var/log/auth.log | tail -20

# Успешные входы
sudo grep "Accepted publickey" /var/log/auth.log | tail -20

# Статистика по IP-адресам атакующих
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10

2. Настройка уведомлений о входе

Создайте скрипт для уведомлений:

sudo nano /etc/ssh/login-notify.sh
#!/bin/bash
# SSH Login Notification Script

# Получаем информацию о подключении
LOGIN_IP=$(echo $SSH_CONNECTION | awk '{print $1}')
LOGIN_DATE=$(date +"%Y-%m-%d %H:%M:%S")
LOGIN_USER=$USER

# Отправляем уведомление через Telegram (опционально)
TELEGRAM_BOT_TOKEN="your_bot_token"
TELEGRAM_CHAT_ID="your_chat_id"
MESSAGE="🔐 SSH Login Alert
User: $LOGIN_USER
IP: $LOGIN_IP
Time: $LOGIN_DATE
Hostname: $(hostname)"

curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
    -d chat_id="$TELEGRAM_CHAT_ID" \
    -d text="$MESSAGE"

# Или отправка email
echo "$MESSAGE" | mail -s "SSH Login: $LOGIN_USER from $LOGIN_IP" admin@example.com
# Делаем скрипт исполняемым
sudo chmod +x /etc/ssh/login-notify.sh

Добавьте в конец ~/.bashrc или ~/.zshrc:

echo "~/.bashrc":
# SSH login notification
if [ -n "$SSH_CONNECTION" ]; then
    /etc/ssh/login-notify.sh &
fi

3. Мониторинг с помощью Prometheus и Alertmanager

Для продвинутого мониторинга используйте node_exporter с Prometheus:

# Установка node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter

# Создание systemd service
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Чек-лист безопасности SSH

Минимальная конфигурация

  • [ ] Изменён стандартный порт (22 → 2222 или другой)
  • [ ] Отключён вход root (PermitRootLogin no)
  • [ ] Создан отдельный пользователь для SSH
  • [ ] Настроена аутентификация по ключу
  • [ ] Отключена парольная аутентификация (PasswordAuthentication no)
  • [ ] Установлен Fail2Ban
  • [ ] Настроен firewall (UFW/iptables)

Средний уровень

  • [ ] Всё из минимальной конфигурации
  • [ ] Ограничен список пользователей (AllowUsers)
  • [ ] Настроены лимиты (MaxAuthTries 3, MaxSessions 10)
  • [ ] Отключены ненужные функции (X11Forwarding, etc.)
  • [ ] Используются Ed25519 ключи
  • [ ] Настроены уведомления о входе
  • [ ] Регулярный мониторинг логов

Максимальная безопасность

  • [ ] Всё из среднего уровня
  • [ ] Включена двухфакторная аутентификация (2FA)
  • [ ] Настроен port knocking
  • [ ] Используется VPN для доступа к SSH
  • [ ] Настроен IDS/IPS (например, OSSEC)
  • [ ] Централизованный сбор и анализ логов
  • [ ] Автоматические security обновления
  • [ ] Regular security audits

Устранение типичных проблем

Проблема: Не могу подключиться по SSH после изменения конфигурации

Решение:

  1. Подключитесь через консоль хостинга (VNC/KVM)
  2. Проверьте синтаксис: sudo sshd -t
  3. Проверьте логи: sudo journalctl -u sshd -n 50
  4. Временно верните старую конфигурацию
  5. Применяйте изменения постепенно

Проблема: «Permission denied (publickey)»

Решение:

# Проверьте права на ключи
ls -la ~/.ssh/

# Должно быть:
# ~/.ssh/            - 700
# ~/.ssh/id_*        - 600
# ~/.ssh/config      - 600
# ~/.ssh/*.pub       - 644

# Проверьте, добавлен ли ключ на сервер
ssh user@server "cat ~/.ssh/authorized_keys"

# Подключитесь с отладкой
ssh -vvv user@server

Проблема: Too many authentication failures

Решение:

# В ~/.ssh/config добавьте:
IdentitiesOnly yes

# Или при подключении:
ssh -o IdentitiesOnly=yes -i ~/.ssh/specific_key user@server

Проблема: Connection timeout

Решение:

# Проверьте firewall
sudo ufw status

# Проверьте, слушает ли SSH на нужном порту
sudo netstat -tlnp | grep sshd

# Проверьте Fail2Ban
sudo fail2ban-client status sshd

Полезные команды SSH

# Туннелирование порта (Local Forward)
ssh -L 8080:localhost:80 user@server

# Обратное туннелирование (Remote Forward)
ssh -R 8080:localhost:80 user@server

# SOCKS прокси
ssh -D 1080 user@server

# Выполнение команды без входа в shell
ssh user@server 'df -h'

# Копирование файла
scp file.txt user@server:/path/

# Копирование директории рекурсивно
scp -r /local/dir user@server:/remote/dir

# Синхронизация с rsync через SSH
rsync -avz -e "ssh -p 2222" /local/ user@server:/remote/

# Монтирование удалённой директории (SSHFS)
sshfs user@server:/remote/path /local/mount/point

# Проверка отпечатка ключа сервера
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

# Удаление ключа хоста из known_hosts
ssh-keygen -R server.com

Заключение

Правильная настройка SSH-сервера — это основа безопасности вашего VPS. Следуя рекомендациям из этого руководства, вы значительно снизите риск взлома и несанкционированного доступа.

Ключевые принципы безопасности SSH:

  1. Используйте аутентификацию по ключу — это намного безопаснее паролей
  2. Отключите вход root — создайте отдельного пользователя с sudo
  3. Измените стандартный порт — снизит количество автоматических атак
  4. Установите Fail2Ban — защитит от brute-force
  5. Регулярно обновляйте систему — закрывайте уязвимости
  6. Мониторьте логи — знайте, что происходит на сервере
  7. Используйте 2FA — дополнительный уровень защиты

Дальнейшее изучение:

  • Официальная документация OpenSSH: https://www.openssh.com/
  • SSH Academy: https://www.ssh.com/academy/ssh
  • Hardening SSH Guide: https://linux-audit.com/audit-and-harden-your-ssh-configuration/

Помните: безопасность — это не единоразовая настройка, а постоянный процесс. Регулярно проверяйте логи, обновляйте систему и следите за новостями об уязвимостях.


Автор: msb.support
Дата публикации: 29 ноября 2025
Версия: 2.0

Эта статья может свободно распространяться и использоваться в образовательных целях с указанием источника.