Как ограничить доступ к SSH для конкретных пользователей и IP
Что проверяют
Знаете ли вы, что доступ ограничивают в нескольких слоях, и умеете ли менять конфигурацию, не отрезав себя от сервера. Следом обычно спрашивают, как проверить правило до перезапуска и что делать, если доступ всё-таки потерян.
Как отвечать
Разложите защиту по уровням:
- сеть: порт 22 открыт только нужным подсетям. В облаке это security group, на хосте
nftables,ufwилиiptables. Вufwправила проверяются по порядку, и общееallow 22выше по списку перечеркнёт ограничение; - пользователи в
sshd_config:AllowUsers,AllowGroups,DenyUsers. Удобнее группа:AllowGroups ssh-users, доступ выдаётся добавлением в неё. Порядок проверки:DenyUsers,AllowUsers,DenyGroups,AllowGroups; - пользователь плюс адрес:
AllowUsers deploy@10.0.0.0/24 admin@203.0.113.5пускает каждого только со своих адресов; - блоки
Match:Match AddressилиMatch Userменяют настройки для части подключений, например разрешают пароль только из внутренней сети; - ключи:
PasswordAuthentication no,PermitRootLogin no, а опцияfrom="10.0.0.0/8"вauthorized_keysпривязывает конкретный ключ к адресам.
Безопасный порядок: правка drop-in файла в /etc/ssh/sshd_config.d/, проверка синтаксиса sshd -t, просмотр итоговых настроек для конкретного подключения sshd -T -C user=deploy,host=example,addr=10.0.0.5, reload без закрытия текущей сессии и проверка входа из второго терминала. Сверху fail2ban против перебора.
Где спотыкаются
Перезапускают сервис, закрывают единственную сессию и узнают об ошибке, когда зайти уже нельзя. Дальше только консоль облака или восстановление сервера.
Не знают, что в sshd_config для большинства директив действует первое найденное значение. Файлы из sshd_config.d подключаются в начале основного конфига, и строка оттуда, например от cloud-init, молча перебивает вашу правку ниже.
Ограничиваются AllowUsers и забывают про сетевой слой. Тогда порт по-прежнему открыт всему интернету: для перебора паролей и для уязвимостей самого OpenSSH.