Вопрос или проблема
Я пытаюсь разрешить команду find в sudoers, но запретить find ... -exec rm
или find ... -delete
.
Вот что я сделал:
$ sudo grep find /etc/sudoers.d/myUser
myUser ALL=!/usr/bin/find * -exec *
myUser ALL=!/usr/bin/find * -delete *
myUser ALL=/usr/bin/find *
$
Но когда я пытаюсь выполнить команду find * -exec, она работает, вместо того чтобы быть запрещенной:
$ sudo su - myUser
$ sudo find var/www/html/ ! -type d -exec ls -l {} +
lrwxrwxrwx 1 adn adn 23 Mar 21 2023 var/www/html/index.html -> index.nginx-debian.html
$
Как я могу это сделать?
Когда для пользователя подходит несколько записей, они применяются по порядку. Если есть несколько совпадений, используется последнее совпадение (которое не обязательно является наиболее специфическим).
(источник: man 5 sudoers
)
В вашем случае myUser ALL=/usr/bin/find *
является последним совпадением, когда вы используете -exec
или -delete
, поэтому оно применяется.
Измените порядок:
myUser ALL=/usr/bin/find *
myUser ALL=!/usr/bin/find * -exec *
myUser ALL=!/usr/bin/find * -delete *
Мои тесты (с sudo
1.9) показывают, что вам дополнительно нужно
myUser ALL=!/usr/bin/find * -delete
чтобы запретить использование, где -delete
находится в самом конце (похожая строка для -exec
не нужна, так как -exec
всегда требует дополнительных аргументов). И если ваш find
спроектирован так, чтобы работать с нулевым количеством стартовых путей, вам также нужно:
myUser ALL=!/usr/bin/find -exec *
myUser ALL=!/usr/bin/find -delete *
Я думаю, вы, вероятно, также хотите запретить -ok
. В зависимости от реализации find
могут быть и другие аргументы, которые вы хотите запретить: -execdir
, -okdir
, -fprint
, -fprintf
, -fprint0
, возможно, и другие.
Все эти дополнительные строки должны быть размещены после myUser ALL=/usr/bin/find *
.
Недостаток в определении всех аргументов и синтаксисов, которые могут быть использованы во зло, очевидно, приведет к проблеме безопасности.
.
Ответ или решение
Конфигурация прав доступа посредством файла sudoers
является важной задачей для обеспечения безопасности сервера, особенно когда дело касается разрешения выполнения определённых команд с повышенными привилегиями. В задаче, о которой идёт речь, необходимо разрешить пользователю выполнять команду find
, запрещая при этом использование небезопасных подкоманд, таких как -exec rm
или -delete
. В этой статье разберём теоретические аспекты, дадим пример решения и предложим дополнительные применения для данной задачи.
Теория
В системе sudoers, возможность управления правами пользователей осуществляется через конфигурационный файл /etc/sudoers
. Этот файл позволяет администратору определять, какие команды пользователь может выполнять от имени суперпользователя или любого другого пользователя. Формат записей в файле чувствителен к порядку, что означает, что первая запись, соответствующая команде пользователя, определяет, разрешено ли это действие.
Основные принципы, которые следует учитывать:
-
Порядок записей: Когда возникают конфликты в разрешениях, применяется последнее совпавшее правило. Таким образом, порядок записей в файле критически важен.
-
Определение команд: Каждой записи может предшествовать знак восклицания
!
, который указывает, что правило запрещает выполнение команды. -
Исключения: Важно по возможности предусматривать исключения или особые случаи, которые могут нарушить безопасность.
Пример
Учитывая предоставленное описание проблемы и конфигурацию, представленную в файле sudoers
:
myUser ALL=/usr/bin/find *
myUser ALL=!/usr/bin/find * -exec *
myUser ALL=!/usr/bin/find * -delete *
Обратите внимание, что разрешающие правила применяются после запрещающих, что делает разрешение последним правилом, эффективно отменяя предыдущие запреты. Проблему можно решить перестановкой строк:
myUser ALL=/usr/bin/find *
myUser ALL=!/usr/bin/find * -exec *
myUser ALL=!/usr/bin/find * -delete
myUser ALL=!/usr/bin/find -exec *
myUser ALL=!/usr/bin/find * -delete *
Здесь разрешение первой строки всё ещё применимо, но специфицированные запреты делаются более точечными и стоят после него.
Применение
Расширение конфигурации
При настройке конфигурации sudoers
важно предусмотреть все потенциальные варианты использования команды find
, которые могут быть использованы в обход ограничений. Например:
-
find
можно использовать с различными потенциально опасными флагами, такими как-execdir
,-fprint
,-fprintf
и др. Каждое из этих использований потенциально может быть использовано для нарушения безопасности системы. -
Следует рассмотреть возможность запрета использования флага
-ok
вместе сfind
, который может выполнять команды только после подтверждения пользователем, но все равно может представлять угрозу.
Вот обновлённый пример конфигурации, принимающий во внимание эти моменты:
myUser ALL=/usr/bin/find *
myUser ALL=!/usr/bin/find * -exec *
myUser ALL=!/usr/bin/find * -execdir *
myUser ALL=!/usr/bin/find * -delete
myUser ALL=!/usr/bin/find * -fprint *
myUser ALL=!/usr/bin/find * -fprintf *
myUser ALL=!/usr/bin/find -exec *
myUser ALL=!/usr/bin/find -ok *
myUser ALL=!/usr/bin/find * -okdir *
myUser ALL=!/usr/bin/find * -fprint0 *
Постоянный мониторинг
Необходимо также следить за изменениями в версии утилиты find
, так как дополнительные функции или методы использования могут быть добавлены в следующих версиях.
Логирование
Рассмотрите возможность ведения журнала выполняемых команд find
, это позволит в оперативном порядке удостовериться, что пользователи не нарушают установленные ограничения.
Заключение
Обеспечение безопасности посредством точечной настройки конфигурации sudoers
требует как внимания к деталям в управление правами, так и понимания общей архитектуры системы. Описанные подходы и примеры предоставляют надежный метод реализации строгого контроля за использованием команды find
, предотвращая возможные нарушения безопасности, сохраняя при этом удобство использования для разрешённых операций.