SSH: Полное руководство по использованию и защите.
1. Что такое SSH и зачем он нужен
SSH (Secure Shell) — это криптографический сетевой протокол, который обеспечивает защищённый доступ к удалённым системам.
Он позволяет:
- Подключаться к серверу удалённо
- Выполнять команды в терминале
- Передавать файлы по защищённому каналу (SCP, SFTP)
- Настраивать туннели и порт-форвардинг
Главная особенность — передача данных происходит в зашифрованном виде, что защищает от перехвата паролей и другой информации.
2. Как работает SSH
SSH использует клиент-серверную архитектуру:
- Клиент (ваш компьютер) инициирует соединение
- Сервер (удалённая машина) принимает соединение и проверяет аутентификацию
Аутентификация может быть:
- По паролю (менее безопасно)
- По SSH-ключу (рекомендуется)
- По сертификатам (в корпоративных системах)
Стандартный порт SSH — 22, но его можно изменить для повышения безопасности.
3. Потенциальные угрозы безопасности
Хотя SSH надёжен, при неправильной настройке есть риски:
- Брутфорс-атаки — автоматический подбор пароля
- Перехват паролей при использовании небезопасных машин
- Уязвимости в старых версиях OpenSSH
- Несанкционированный доступ при утечке приватного ключа
- DoS/DDoS-атаки на SSH-порт.
4. Основные команды SSH
📌 Подключение к серверу
ssh user@ip_address
Пример:
ssh root@192.168.0.10
📌 Подключение с нестандартным портом
ssh -p 2222 user@ip_address
📌 Копирование файлов через SCP
scp localfile.txt user@server:/path/to/destination
scp user@server:/path/to/file.txt /local/path
📌 Работа с SFTP
sftp user@server
# После входа:
# get file.txt — скачать файл
# put file.txt — загрузить файл
📌 Генерация SSH-ключа
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Ключи сохраняются в ~/.ssh/id_rsa (приватный) и ~/.ssh/id_rsa.pub (публичный).
📌 Копирование ключа на сервер
ssh-copy-id user@server
5. Как защитить SSH
🔹 1. Использовать SSH-ключи вместо пароля
- Генерируем ключ:
ssh-keygen -t ed25519 - Копируем на сервер:
ssh-copy-id user@server - Включаем вход только по ключам в /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
🔹 2. Изменить порт SSH
В файле /etc/ssh/sshd_config:
Port 2222
После изменения:
sudo systemctl restart ssh
🔹 3. Ограничить доступ по IP
В /etc/hosts.allow:
sshd: 192.168.0.100
В /etc/hosts.deny:
sshd: ALL
🔹 4. Отключить вход под root
В /etc/ssh/sshd_config:
PermitRootLogin no
🔹 5. Включить Fail2Ban
sudo apt install fail2ban -y
Конфигурация /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
Запуск:
sudo systemctl enable --now fail2ban
🔹 6. Использовать двухфакторную аутентификацию (2FA)
Устанавливаем:
sudo apt install libpam-google-authenticator
Настраиваем:
google-authenticator
В /etc/pam.d/sshd:
auth required pam_google_authenticator.so
В /etc/ssh/sshd_config:
ChallengeResponseAuthentication yes
🔹 7. Логи и мониторинг
Проверка логов SSH:
sudo journalctl -u ssh
cat /var/log/auth.log
6. Рекомендации по постоянной безопасности
- Регулярно обновлять OpenSSH:
sudo apt update && sudo apt upgrade - Хранить приватные ключи только в защищённом месте
- Использовать firewall (UFW, iptables) для ограничения доступа
- Следить за логами и пытаться блокировать подозрительные IP
- Использовать VPN для доступа к SSH в закрытой сети
- Не подключаться с общедоступных Wi-Fi без VPN.
7. Готовый безопасный конфиг /etc/ssh/sshd_config
Этот вариант подходит для производственного сервера, где важна максимальная защита.
# === Основные параметры ===
Port 2222 # Меняем порт (например, 2222)
AddressFamily inet # IPv4 только (опционально)
ListenAddress 0.0.0.0 # Слушаем на всех интерфейсах
# === Аутентификация ===
PermitRootLogin no # Запрет логина под root
PasswordAuthentication no # Запрет входа по паролю
PubkeyAuthentication yes # Разрешить вход только по ключам
ChallengeResponseAuthentication no
AuthenticationMethods publickey
# === Безопасность ===
MaxAuthTries 3 # Не более 3 попыток входа
LoginGraceTime 30 # 30 секунд на ввод пароля/ключа
PermitEmptyPasswords no # Запрет пустых паролей
AllowTcpForwarding no # Запрет перенаправления портов (если не нужно)
X11Forwarding no # Запрет X11 (если не нужно)
AllowAgentForwarding no # Запрет agent forwarding
# === Логирование ===
LogLevel VERBOSE # Подробный лог входов
SyslogFacility AUTH
# === Пользователи ===
AllowUsers ivan backupuser # Разрешённые пользователи
После изменения:
sudo systemctl restart ssh
8. Дополнительная защита SSH с помощью UFW (firewall)
Устанавливаем и настраиваем:
sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # Разрешаем новый порт SSH
sudo ufw enable
Проверка правил:
sudo ufw status
9. Пример защиты от брутфорса с Fail2Ban
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.local
Добавляем:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
Перезапускаем:
sudo systemctl restart fail2ban
10. SSH через VPN
Если есть VPN (WireGuard, OpenVPN), можно сделать так, чтобы SSH был доступен только внутри VPN-сети.
В UFW:
sudo ufw deny 2222/tcp
sudo ufw allow from 10.8.0.0/24 to any port 2222 proto tcp
Теперь подключение к SSH возможно только с IP из VPN.
11. Как быстро проверить безопасность SSH
# Проверка, что порт изменён
sudo ss -tulpn | grep ssh
# Проверка логов на неудачные попытки
grep "Failed password" /var/log/auth.log | sort | uniq -c | sort -nr | head
12. Список команд для повседневной работы с SSH
ДействиеКомандаПодключиться к серверуssh user@serverУказать портssh -p 2222 user@serverКопировать файл на серверscp file.txt user@server:/pathСкачать файл с сервераscp user@server:/path/file.txt .Копировать папку рекурсивноscp -r folder user@server:/pathЗапустить команду на сервереssh user@server "uptime"Подключиться с ключомssh -i ~/.ssh/id_rsa user@serverГенерация ключейssh-keygen -t ed25519Копировать ключ на серверssh-copy-id user@server
13. Полный чеклист по защите SSH
✅ Использовать только вход по ключам
✅ Отключить root login
✅ Изменить порт на нестандартный
✅ Ограничить доступ по IP
✅ Настроить Fail2Ban
✅ Вести логи и мониторинг
✅ Регулярно обновлять OpenSSH
✅ При возможности — закрыть SSH за VPN
💡 Вывод:
SSH безопасен, если правильно его настроить.
При применении всех этих мер вероятность взлома снижается в десятки раз.
Если хочешь, я могу прямо сейчас сделать готовый bash-скрипт, который:
- Установит fail2ban
- Настроит UFW
- Изменит порт SSH
- Отключит парольный вход
- Добавит твой ключ
- Перезапустит SSH
Тогда тебе останется только вставить его на сервер и запустить.
Скрипт усиления безопасности SSH (Ubuntu/Debian)
Что делает:
создаёт (или находит) пользователя-админа и готовит ему SSH-ключи
включает вход только по ключам, запрещает root, меняет порт
настраивает UFW (временно держит оба порта, чтобы не отрезать доступ)
ставит и настраивает Fail2Ban для sshd
делает бэкап текущего sshd_config и проверяет конфиг перед рестартомКак запустить:
отредактируй переменные в начале (порт, имя пользователя, публичный ключ)
сохрани как hardening-ssh.sh
сделай исполняемым и запускай от root:
chmod +x hardening-ssh.sh
sudo ./hardening-ssh.sh
После запуска не закрывай текущую SSH-сессию: проверь вход на новый порт во второй сессии. Если всё ок — скрипт предложит закрыть старый порт.
#!/usr/bin/env bash
set -euo pipefail
### === НАСТРОЙКИ — ОТРЕДАКТИРУЙ ПЕРЕД ЗАПУСКОМ ===
NEW_USER="ivanyurievich" # новый (или существующий) админ-пользователь
NEW_SSH_PORT="2222" # новый порт SSH
PUBKEY='ssh-ed25519 AAAA... ваш_публичный_ключ ... user@host' # ВСТАВЬ СВОЙ ПУБЛИЧНЫЙ КЛЮЧ
ALLOW_USERS="$NEW_USER" # список разрешённых к SSH пользователей через пробел
IPV4_ONLY="yes" # yes => только IPv4; no => IPv4+IPv6
### ===============================================
# Проверки окружения
if [[ $EUID -ne 0 ]]; then
echo "Запусти скрипт от root (sudo)."; exit 1
fi
if ! command -v sshd >/dev/null 2>&1; then
echo "OpenSSH server не найден. Устанавливаю..."
apt update && apt install -y openssh-server
fi
OSFIREWALL=""
if command -v ufw >/dev/null 2>&1; then
OSFIREWALL="ufw"
else
echo "UFW не найден. Устанавливаю..."
apt update && apt install -y ufw
OSFIREWALL="ufw"
fi
# 1) Создание/подготовка пользователя
if ! id -u "$NEW_USER" >/dev/null 2>&1; then
echo "Создаю пользователя $NEW_USER..."
adduser --disabled-password --gecos "" "$NEW_USER"
fi
# Добавляем sudo-права
if ! groups "$NEW_USER" | grep -qE '\bsudo\b'; then
usermod -aG sudo "$NEW_USER"
fi
# Готовим ~/.ssh
USER_HOME="$(eval echo ~"$NEW_USER")"
mkdir -p "$USER_HOME/.ssh"
chmod 700 "$USER_HOME/.ssh"
if [[ -n "$PUBKEY" ]]; then
echo "$PUBKEY" > "$USER_HOME/.ssh/authorized_keys"
chmod 600 "$USER_HOME/.ssh/authorized_keys"
chown -R "$NEW_USER:$NEW_USER" "$USER_HOME/.ssh"
fi
# 2) Бэкап sshd_config
SSHD_CFG="/etc/ssh/sshd_config"
BACKUP="/etc/ssh/sshd_config.backup.$(date +%F-%H%M%S)"
cp "$SSHD_CFG" "$BACKUP"
echo "Бэкап конфигурации: $BACKUP"
# 3) Сборка безопасного sshd_config
# - временно разрешим и старый 22, и новый порт (закроем 22 после проверки)
CURRENT_PORTS_LINE="Port 22"
if grep -qE '^\s*Port\s+' "$SSHD_CFG"; then
CURRENT_PORTS_LINE="$(grep -E '^\s*Port\s+' "$SSHD_CFG" | head -n1)"
fi
cat > "$SSHD_CFG" <<EOF
# === Сгенерировано hardening-ssh.sh ===
# Порты: временно держим 22 и новый, чтобы не отрезать доступ
Port 22
Port ${NEW_SSH_PORT}
# Семейства адресов
$( [[ "$IPV4_ONLY" == "yes" ]] && echo "AddressFamily inet" || echo "# AddressFamily any" )
# Интерфейсы
ListenAddress 0.0.0.0
#ListenAddress ::
# Аутентификация
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
PermitEmptyPasswords no
# Поведение
LoginGraceTime 30
MaxAuthTries 3
UsePAM yes
# Форвардинг и X11 (если нужно — включай осознанно)
AllowTcpForwarding no
X11Forwarding no
AllowAgentForwarding no
PermitTunnel no
GatewayPorts no
PermitUserEnvironment no
# Шифры/MAC/KEX — полагаемся на безопасные значения OpenSSH по умолчанию
# (жёстко пинать версии не будем, чтобы не сломать совместимость клиента)
# Логи
LogLevel VERBOSE
SyslogFacility AUTH
# Разрешённые пользователи
AllowUsers ${ALLOW_USERS}
# HostKeys — используем дефолтные, не трогаем
#HostKey /etc/ssh/ssh_host_ed25519_key
#HostKey /etc/ssh/ssh_host_rsa_key
EOF
# 4) Проверка синтаксиса и рестарт ssh
sshd -t || { echo "Ошибка в sshd_config. Откатываю..."; cp "$BACKUP" "$SSHD_CFG"; systemctl restart ssh; exit 1; }
systemctl restart ssh
echo "SSHD перезапущен с портами: 22 и ${NEW_SSH_PORT}"
# 5) Фаервол UFW
ufw allow 22/tcp || true
ufw allow "${NEW_SSH_PORT}"/tcp || true
ufw --force enable
echo "UFW: разрешены порты 22 и ${NEW_SSH_PORT}"
# 6) Fail2Ban для sshd
apt install -y fail2ban
mkdir -p /etc/fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
backend = systemd
maxretry = 3
findtime = 10m
bantime = 1h
ignorecommand =
action = %(action_mwl)s
EOF
systemctl enable --now fail2ban
echo
echo "=== ПРОВЕРКА ДОСТУПА ==="
echo "1) Не закрывая текущую сессию, открой НОВОЕ подключение:"
echo " ssh -p ${NEW_SSH_PORT} ${NEW_USER}@<IP_СЕРВЕРА>"
echo
read -r -p "Удалить доступ по порту 22 после проверки? (yes/no) " DROP22
if [[ "${DROP22,,}" == "yes" || "${DROP22,,}" == "y" ]]; then
# Удаляем 22 из sshd_config и UFW
sed -i '/^Port 22$/d' "$SSHD_CFG"
sshd -t || { echo "Ошибка правки sshd_config. Откатываю бэкап..."; cp "$BACKUP" "$SSHD_CFG"; systemctl restart ssh; exit 1; }
systemctl restart ssh
ufw delete allow 22/tcp || true
echo "Порт 22 закрыт. Используй порт ${NEW_SSH_PORT}."
else
echo "Оставил порт 22 временно открытым. Не забудь закрыть его позже!"
fi
echo
echo "Готово ✅"
echo "Резервная копия конфига: $BACKUP"
echo "Подключение: ssh -p ${NEW_SSH_PORT} ${NEW_USER}@<IP_СЕРВЕРА>"Быстрый откат (если что-то пошло не так)
sudo cp /etc/ssh/sshd_config.backup.YYYY-MM-DD-HHMMSS /etc/ssh/sshd_config
sudo systemctl restart ssh
sudo ufw allow 22/tcpДополнение к статье: продвинутые нюансы SSH
14) Типы ключей и что выбрать
ed25519 — быстрый, компактный, современный. Рекомендую по умолчанию:
ssh-keygen -t ed25519 -a 100 -C "комментарий"
rsa 4096 — всё ещё ок для совместимости:
ssh-keygen -t rsa -b 4096 -o -a 100 -C "комментарий"
FIDO2/U2F (ecdsa-sk / ed25519-sk) — ключ на аппаратном токене (YubiKey и т.п.). Даже если приватный ключ украдут с ПК — логин невозможен без токена:
ssh-keygen -t ed25519-sk -C "hardware key"
Флаг -a 100 усиливает защиту от перебора (KDF rounds).15) SSH-агент и безопасное делегирование
ssh-agent хранит ключ расшифрованным в памяти. Всегда защищай сессию паролем и не включай ForwardAgent, если не понимаешь риски.
Если нужен hop через bastion — лучше ProxyJump, чем agent forwarding.16) Bastion/Jump Host (ProxyJump)
Для доступа в приватную сеть через «шлюз»:
ssh -J user@bastion:2222 user@internal-hostВ ~/.ssh/config:
Host bastion
HostName 203.0.113.10
Port 2222
User user
Host internal
HostName 10.0.0.15
User user
ProxyJump bastion17) Локальный/удалённый порт-форвардинг (туннели)
Локальный: открыть сервис из удалённой сети на локальной машине
ssh -L 127.0.0.1:8080:127.0.0.1:80 user@server
Удалённый: пробросить порт с сервера на твою локальную машину
ssh -R 0.0.0.0:2222:127.0.0.1:22 user@server
Динамический (SOCKS5):
ssh -D 1080 user@server
В проде оставляй AllowTcpForwarding no и включай точечно через Match (см. ниже).18) Точная политика через Match
В sshd_config можно задавать правила для отдельных пользователей/сетей:
Match User deploy
AllowTcpForwarding yes
X11Forwarding no
Match Address 10.8.0.0/24
PasswordAuthentication no
PubkeyAuthentication yes19) Двухфакторка (TOTP) + ключи (опционально)
Установка:
sudo apt install -y libpam-google-authenticator
sudo -u <user> google-authenticator
PAM: /etc/pam.d/sshd → добавь строку выше @include common-auth:
auth required pam_google_authenticator.so nullok
В sshd_config:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Проверь вход в новой сессии прежде чем разрывать текущую.20) SSH-сертификаты (CA)
Вместо заливки ключей на сотню серверов можно подписывать публичные ключи сертификатом (корпоративный вариант):
Поднимаешь internal CA (ssh-keygen -f ssh_ca -C CA)
На сервере указываешь: TrustedUserCAKeys /etc/ssh/ca.pub
Подписываешь ключи пользователей:
ssh-keygen -s ssh_ca -I dev-ivan -n ivanyurievich -V +52w id_ed25519.pub21) Логи и алерты
Быстрый дайджест неудачных логинов:
sudo zgrep -h "Failed password" /var/log/auth.log* | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
Fail2Ban:
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 1.2.3.422) Политика обновлений и «гигиена»
Регулярные обновления OpenSSH/ядра:
sudo apt update && sudo apt upgrade -y
Проверяй, что сервер не «слушает» лишнее:
sudo ss -tulpn
Не держи открытым старый порт; закрывай после теста нового.
Разделяй роли: админ-учётка без root входа, sudo с паролем.23) Мини-чеклист перед продом
Парольный вход выключен
PermitRootLogin no
Новый порт проверен и доступен
UFW/iptables ограничивают внешний доступ
Fail2Ban активен и пишет в логи
Ключи — ed25519/FIDO2, с надёжной парольной фразой
Бэкап sshd_config сохранёнесли хочешь — могу подставить твои реальные значения (порт, ключ, список юзеров) и выслать уже «готовый к запуску» файл без правок.
Вы сказали:
Напиши заключение по статье
ChatGPT сказал:
Заключение
SSH — это один из самых надёжных и гибких инструментов для удалённого администрирования серверов, но его безопасность полностью зависит от правильной настройки.
По умолчанию OpenSSH предоставляет базовую защиту, однако без дополнительных мер — таких как отключение входа по паролю, запрет root-доступа, ограничение по IP и использование Fail2Ban — сервер остаётся уязвимым для атак.В ходе этой статьи мы разобрали:
как работает SSH и какие у него возможности;
какие угрозы наиболее часто встречаются;
полный набор команд для повседневной работы;
все ключевые методы защиты — от простых до корпоративного уровня;
готовый безопасный sshd_config и автоматизирующий скрипт.Если вы внедрите хотя бы половину из этих мер, вероятность успешного взлома снизится в десятки раз. А при комплексном подходе SSH становится практически неприступным для автоматических атак.Главное — не настраивать «и забыть», а регулярно проверять логи, обновлять OpenSSH и корректировать политику доступа под текущие задачи.
Безопасность — это процесс, а не разовое действие.
Заключение
SSH уже более 25 лет является стандартом удалённого администрирования серверов и сетевого оборудования. Его популярность объясняется сочетанием безопасности, гибкости и универсальности. Однако, как и любой мощный инструмент, он требует внимательного подхода к настройке.
Правильно сконфигурированный SSH может стать практически неприступным для злоумышленников. Мы рассмотрели не только базовые меры защиты, но и продвинутые техники, включая двухфакторную аутентификацию, ограничения по IP, использование сертификатов и аппаратных ключей.
Главная мысль — безопасность SSH — это не разовая настройка, а постоянный процесс:
- отслеживайте неудачные попытки входа;
- своевременно обновляйте OpenSSH и систему;
- адаптируйте правила доступа под текущие задачи и угрозы;
- минимизируйте количество пользователей с правами входа.
Если следовать рекомендациям из этой статьи, вы сможете свести риск несанкционированного доступа к минимуму и при этом сохранить удобство администрирования. SSH — это ваш надёжный мост к серверу, но прочность этого моста зависит от того, насколько качественно он построен и обслуживается.