Найти в Дзене
Ivan-Yurievich

SSH: Полное руководство по использованию и защите

SSH: Полное руководство по использованию и защите. SSH (Secure Shell) — это криптографический сетевой протокол, который обеспечивает защищённый доступ к удалённым системам.
Он позволяет: Главная особенность — передача данных происходит в зашифрованном виде, что защищает от перехвата паролей и другой информации. SSH использует клиент-серверную архитектуру: Аутентификация может быть: Стандартный порт SSH — 22, но его можно изменить для повышения безопасности. Хотя SSH надёжен, при неправильной настройке есть риски: ssh user@ip_address Пример: ssh root@192.168.0.10 ssh -p 2222 user@ip_address scp localfile.txt user@server:/path/to/destination
scp user@server:/path/to/file.txt /local/path sftp user@server
# После входа:
# get file.txt — скачать файл
# put file.txt — загрузить файл ssh-keygen -t rsa -b 4096 -C "your_email@example.com" Ключи сохраняются в ~/.ssh/id_rsa (приватный) и ~/.ssh/id_rsa.pub (публичный). ssh-copy-id user@server В файле /etc/ssh/sshd_config: Port 2222 После измене
Оглавление

SSH: Полное руководство по использованию и защите.

1. Что такое SSH и зачем он нужен

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

Он позволяет:

  • Подключаться к серверу удалённо
  • Выполнять команды в терминале
  • Передавать файлы по защищённому каналу (SCP, SFTP)
  • Настраивать туннели и порт-форвардинг

Главная особенность — передача данных происходит в зашифрованном виде, что защищает от перехвата паролей и другой информации.

2. Как работает SSH

SSH использует клиент-серверную архитектуру:

  • Клиент (ваш компьютер) инициирует соединение
  • Сервер (удалённая машина) принимает соединение и проверяет аутентификацию

Аутентификация может быть:

  • По паролю (менее безопасно)
  • По SSH-ключу (рекомендуется)
  • По сертификатам (в корпоративных системах)

Стандартный порт SSH22, но его можно изменить для повышения безопасности.

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-ключи вместо пароля

  1. Генерируем ключ:
    ssh-keygen -t ed25519
  2. Копируем на сервер:
    ssh-copy-id user@server
  3. Включаем вход только по ключам в /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 — это ваш надёжный мост к серверу, но прочность этого моста зависит от того, насколько качественно он построен и обслуживается.