SSH углублённо [212.3]

Рейтинг: 72.2% · 10 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

SSH углублённо [212.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3] (вы здесь)
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 39. SSH углублённо [212.3]

SSH - это не просто способ зайти на удалённый сервер. Это полноценный транспорт, который умеет аутентифицировать стороны по ключам и сертификатам, гонять через себя любой TCP-трафик и работать вместо VPN на скорую руку. На этом уроке мы перестаём пользоваться SSH как телефоном и начинаем настраивать его как инженеры: жёстко закрываем sshd, раздаём доступ по группам и подсетям, заводим ssh-agent, пробрасываем порты во все стороны и переходим на SSH-сертификаты, чтобы не возиться с authorized_keys на сотне машин.

Изображение

Как это работает

Когда клиент соединяется с сервером, сначала договариваются о ключах шифрования сессии (это host key сервера - его отпечаток вы видите при первом подключении и он лежит в known_hosts). Только потом начинается аутентификация пользователя. Сервер предлагает методы по порядку: publickey, потом password, keyboard-interactive и так далее. Наша задача как админа - оставить только сильные методы и убрать пароли.

Аутентификация по ключу строится на асимметрии. У вас есть пара: приватный ключ на клиенте и публичный на сервере в файле ~/.ssh/authorized_keys. Сервер шлёт случайный вызов, клиент подписывает его приватным ключом, сервер проверяет подпись публичным. Приватный ключ при этом по сети не уходит. В 2026 году дефолт - это ed25519: короткий, быстрый, стойкий. RSA ещё жив, но только от 3072 бит и с SHA-2, а ssh-dss (DSA) давно вырезан и его трогать нельзя.

ssh-agent решает проблему парольной фразы на ключе. Вы один раз вводите пароль от ключа, агент держит расшифрованный ключ в памяти и сам подписывает вызовы. С форвардингом агента (ssh -A) подпись можно делать даже с промежуточного хоста, не копируя туда приватный ключ. Но форвардинг агента опасен на чужих машинах: root на промежуточном узле может через сокет агента подписать что угодно от вашего имени.

Проброс портов превращает SSH-туннель в транспорт. Локальный форвардинг (-L) открывает порт у вас и тащит соединения на адрес, видимый с сервера, - так ходят к закрытой базе через бастион. Удалённый (-R) делает наоборот: открывает порт на сервере и пускает трафик к вам, чем удобно показать локальный сервис наружу. Динамический (-D) поднимает SOCKS-прокси, и тогда любой настроенный на него софт ходит в сеть через сервер.

Сертификаты SSH убирают головную боль с authorized_keys и known_hosts. Вы заводите свой удостоверяющий центр (CA) - обычную ключевую пару, - и подписываете ею публичные ключи пользователей и хостов. Сервер доверяет одному CA, и любой подписанный им ключ проходит, пока не истёк срок. Отзыв делается списком (KRL) или просто коротким сроком жизни сертификата.

Команды и примеры

Генерация современного ключа и добавление в агент:

Код: Выделить всё

ssh-keygen -t ed25519 -C "ops@cyberlake"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l            # что лежит в агенте
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Усиление sshd. Файл /etc/ssh/sshd_config (и подключаемые из /etc/ssh/sshd_config.d/*.conf):

Код: Выделить всё

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers deploy ops
AllowGroups sshusers

Match Group admins Address 10.0.0.0/24
    PermitRootLogin prohibit-password
    X11Forwarding yes
Match-блок применяет правила только к попавшим под условие. Условия идут после ключевого слова: User, Group, Host, Address, LocalAddress. Внутри блока разрешён лишь ограниченный набор директив. Раздавать доступ лучше через AllowGroups и системную группу, а не перечислять людей в AllowUsers.

Проверка и применение по-разному в двух семействах:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
sshd -t                       # синтаксис
sshd -T | grep -i permitroot  # эффективный конфиг
systemctl reload ssh

# RHEL 10 / Fedora 41+
sshd -t
systemctl reload sshd         # юнит называется sshd
Не забывайте: на RHEL включён SELinux, и нестандартный порт надо сначала разрешить: semanage port -a -t ssh_port_t -p tcp 2222.

Проброс портов:

Код: Выделить всё

ssh -L 5432:db.internal:5432 bastion   # к закрытой БД через бастион
ssh -R 8080:localhost:3000 server      # показать свой :3000 на сервере
ssh -D 1080 server                     # SOCKS5-прокси на localhost:1080
Чтобы -R слушал не только на loopback сервера, нужен GatewayPorts clientspecified в sshd_config.

Свой SSH-CA и подпись ключей:

Код: Выделить всё

ssh-keygen -t ed25519 -f user_ca -C "user CA"
ssh-keygen -s user_ca -I "ivanov" -n deploy,ops \
    -V +8h -z 1 user_key.pub
ssh-keygen -L -f user_key-cert.pub   # посмотреть содержимое
Здесь -I это идентификатор для логов, -n - разрешённые принципалы (имена логина), -V срок жизни. На сервере доверие к CA задаётся: TrustedUserCAKeys /etc/ssh/user_ca.pub. Для host-сертификатов клиент доверяет строкой @cert-authority * ssh-ed25519 AAAA... в known_hosts, и предупреждение про отпечаток исчезает навсегда.

Ограничение команды для ключа (точечный доступ под бэкап или git) задаётся префиксом в authorized_keys:

Код: Выделить всё

restrict,command="/usr/local/bin/backup-only" ssh-ed25519 AAAA... backup
restrict выключает разом форвардинги, агент, pty и X11 - это безопасный дефолт, к которому потом точечно добавляют нужное (например pty).

Частые грабли
  • Заблокировать себя: выставили PasswordAuthentication no и PermitRootLogin no, не проверив свой ключ, и закрыли единственную сессию. Всегда держите вторую открытую сессию до reload.
  • Правки тонут в drop-in: дистрибутив кладёт Include /etc/ssh/sshd_config.d/*.conf в начало файла, и файл оттуда переопределяет ваши строки. Проверяйте итог через sshd -T, а не глазами по основному файлу.
  • Права на ~/.ssh: при 0777 на каталоге или 0644 на приватном ключе sshd молча игнорирует ключ. Нужно 0700 на каталоге и 0600 на ключах.
  • AllowUsers и сертификаты: попавший под Allow-список принципал всё равно должен совпасть с реальным именем логина, иначе доступ закроется, хотя сертификат валиден.
  • Форвардинг агента на чужом хосте: ssh -A на скомпрометированном бастионе отдаёт ваш агент атакующему. Используйте ProxyJump (-J) вместо -A там, где можно.
  • known_hosts при пересоздании VM: новый host key ломает подключение MITM-предупреждением. Решение - host-сертификаты и @cert-authority, а не ssh-keygen -R в цикле.
Мини-лаба
  • Сгенерируйте пару ed25519 с парольной фразой, загрузите её в ssh-agent и убедитесь через ssh-add -l.
  • Разложите публичный ключ на тестовый сервер и проверьте вход без пароля.
  • В sshd_config отключите root-логин и пароли, добавьте AllowGroups sshusers, проверьте sshd -t и sshd -T, перезагрузите службу (ssh на Debian, sshd на RHEL), не закрывая запасную сессию.
  • Поднимите динамический прокси ssh -D 1080 и проверьте выход через него (curl --socks5 localhost:1080 ifconfig.me).
  • Создайте user_ca, подпишите свой ключ на 1 час с принципалом своего логина, пропишите TrustedUserCAKeys и зайдите по сертификату.
  • Добавьте ключ с command=... и restrict, убедитесь, что он выполняет только заданную команду.
Контрольные вопросы
  • Чем директива AllowGroups в sshd_config предпочтительнее перечисления людей в AllowUsers и как они взаимодействуют с Deny-списками?
  • Какие условия и какие директивы допустимы внутри Match-блока и в каком порядке sshd их применяет?
  • В чём практическая разница между -L, -R и -D и какой опции sshd требует -R, чтобы слушать на внешнем интерфейсе?
  • Что именно даёт ssh-agent и почему форвардинг агента считается опасным на промежуточных хостах?
  • Как сервер начинает доверять SSH-сертификатам пользователей и хостов и за счёт чего сертификаты убирают возню с authorized_keys и known_hosts?
  • Что делает префикс restrict в authorized_keys и зачем дополнительно указывать command=?
👍5 ❤️2 🔥1 😄 🤔1
Аватара пользователя
oftime
Сообщения: 1
Зарегистрирован: 16 май 2026, 09:27

Re: SSH углублённо [212.3]

Сообщение oftime »

А если у меня и TrustedUserCAKeys, и обычный authorized_keys лежит - что сработает первым? Боюсь сделать CA, а старые ключи перестанут пускать.
👍1 ❤️2 🔥 😄 🤔1
Аватара пользователя
kalatzis
Сообщения: 1
Зарегистрирован: 13 май 2026, 08:39

Re: SSH углублённо [212.3]

Сообщение kalatzis »

Поймал грабли с drop-in: правил sshd_config руками, а sshd -T показывал старое значение. Оказалось 50-cloud-init.conf в sshd_config.d переопределял PasswordAuthentication. Без sshd -T бы не нашёл.
👍1 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
FTP-серверы [212.2]
Следующая глава →
Безопасность, IDS и VPN [212.4 + 212.5]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость