Содержание
- Введение в SSH
- Теория и принципы работы SSH
- Безопасная настройка SSH-сервера
- Создание SSH-ключей на разных ОС
- Управление множеством SSH-ключей
- Дополнительные меры безопасности
- Мониторинг и логирование
Введение в SSH
SSH (Secure Shell) — это криптографический сетевой протокол для безопасного удалённого управления операционными системами и передачи данных. При работе с VPS (Virtual Private Server) SSH является основным инструментом администрирования.
Зачем нужна правильная настройка SSH?
- Защита от взлома: неправильно настроенный SSH — это открытая дверь для злоумышленников
- Предотвращение brute-force атак: ежедневно VPS подвергаются тысячам попыток подбора паролей
- Соответствие стандартам безопасности: многие регуляторы требуют определённого уровня защиты
- Защита данных: SSH защищает всю передаваемую информацию шифрованием
Теория и принципы работы SSH
Как работает SSH?
SSH использует архитектуру клиент-сервер и работает на основе криптографии с открытым ключом:
- Установка соединения: клиент инициирует подключение к серверу на порту 22 (по умолчанию)
- Согласование параметров: стороны договариваются о версии протокола и алгоритмах шифрования
- Аутентификация сервера: сервер предоставляет свой публичный ключ для проверки подлинности
- Аутентификация клиента: клиент подтверждает свою личность (ключ или пароль)
- Защищённый канал: создаётся зашифрованный туннель для обмена данными
Типы 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
Применение изменений
После редактирования конфигурации необходимо:
- Проверить синтаксис конфигурации:
sudo sshd -t
- Перезапустить SSH-сервис:
# Для Ubuntu/Debian
sudo systemctl restart sshd
# Или для более старых систем
sudo service ssh restart
- Проверить статус:
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
- Скачайте с официального сайта: https://www.putty.org/
- Установите полный пакет (включает PuTTYgen, Pageant, PSCP, PSFTP)
Генерация ключа в PuTTYgen
- Запустите PuTTYgen
- Выберите тип ключа:
- EdDSA (выберите кривую Ed25519) — рекомендуется
- RSA (4096 бит) — для совместимости
- Нажмите Generate
- Двигайте мышью для генерации случайности
- Введите Key passphrase (настоятельно рекомендуется)
- Сохраните:
- 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 после изменения конфигурации
Решение:
- Подключитесь через консоль хостинга (VNC/KVM)
- Проверьте синтаксис:
sudo sshd -t - Проверьте логи:
sudo journalctl -u sshd -n 50 - Временно верните старую конфигурацию
- Применяйте изменения постепенно
Проблема: «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:
- Используйте аутентификацию по ключу — это намного безопаснее паролей
- Отключите вход root — создайте отдельного пользователя с sudo
- Измените стандартный порт — снизит количество автоматических атак
- Установите Fail2Ban — защитит от brute-force
- Регулярно обновляйте систему — закрывайте уязвимости
- Мониторьте логи — знайте, что происходит на сервере
- Используйте 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
Эта статья может свободно распространяться и использоваться в образовательных целях с указанием источника.