Порядок настроек в sshd_config

Гуляй рука — балдей писюн!

Как на самом деле работает порядок настроек в sshd_config

Собственно тут и есть важный нюанс, который зачастую не укладывается в головах людей, либо они просто вслепую используют то, что используют.

В большинстве конфигов работает понятная логика — последнее значение параметра переопределяет предыдущее.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
В sshd_config важнее не последнее объявление параметра, а первое.

 читать первым в телеграм    читать первым в макс

Но в sshd_config для большинства параметров, всё так, но наоборот — используется первое найденное значение. Охуеть? Именно!

Рассмотри пример:

Создаём файл: /etc/ssh/sshd_config.d/00-security.conf с содержимым:

PermitRootLogin no

А рядом создаем: /etc/ssh/sshd_config.d/01-somename.conf и прописываем:

PermitRootLogin yes

Можно предположить, что второй файл переопределит первый, потому что он обрабатывается позже. Но хуй там плавал! Этого не произойдёт.

Файлы, подходящие под маску /etc/ssh/sshd_config.d/*.conf, обрабатываются в лексикографическом порядке:

00-security.conf
01-somename.conf
10-bashdays.conf
50-linuxfactory.conf

Сначала SSH прочитает PermitRootLogin no, значение параметра уже будет установлено, а когда позже встретится PermitRootLogin yes, оно будет проигнорировано, потому что для PermitRootLogin уже найдено первое значение.

И итоговая настройка останется такой PermitRootLogin no.

Но всегда есть НО. В основном файле /etc/ssh/sshd_config директива Include тоже обрабатывается в том месте, где она указана.

Например, такой вариант будет работать:

Include /etc/ssh/sshd_config.d/*.conf

PermitRootLogin yes

Сначала будет прочитан 00-security.conf с PermitRootLogin no, после этого объявление из основного конфига уже ничего не изменит:

PermitRootLogin yes

В итоге всё равно будет PermitRootLogin no. Но если порядок обратный:

PermitRootLogin yes

Include /etc/ssh/sshd_config.d/*.conf

то первым найденным значением станет PermitRootLogin yes, а настройка из 00-security.conf уже не сможет её переопределить.

То есть файл 00-security.conf — рабочее решение, но только при соблюдении двух условий:

  1. Директива Include /etc/ssh/sshd_config.d/*.conf находится раньше других объявлений PermitRootLogin в основном конфиге.
  2. До 00-security.conf нет другого подключаемого файла, который уже задаёт этот параметр.

Проверять результат лучше не глазами по файлам, а через сам sshd:

sshd -T | grep permitrootlogin

В ожидаемых результатах увидишь permitrootlogin no/yes. Также перед перезапуском ssh стоит проверить синтаксис:

sshd -t

По-любому ты такое игнорируешь, просто возьми за правило, это как с nginx -t после каждой правки конфигов. Тут даже ключ -t запоминать не нужно.

Главный вывод:

В sshd_config важнее не последнее объявление параметра, а первое. Поэтому настройки безопасности нужно размещать как можно раньше — и среди подключаемых файлов, и относительно директив в основном конфиге.

Такие вот дела, ставь лайк, пиши коммент…

Комментарии