Как разрешить использование find, но запретить find -exec в sudoers

Вопрос или проблема

Я пытаюсь разрешить команду 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. Этот файл позволяет администратору определять, какие команды пользователь может выполнять от имени суперпользователя или любого другого пользователя. Формат записей в файле чувствителен к порядку, что означает, что первая запись, соответствующая команде пользователя, определяет, разрешено ли это действие.

Основные принципы, которые следует учитывать:

  1. Порядок записей: Когда возникают конфликты в разрешениях, применяется последнее совпавшее правило. Таким образом, порядок записей в файле критически важен.

  2. Определение команд: Каждой записи может предшествовать знак восклицания !, который указывает, что правило запрещает выполнение команды.

  3. Исключения: Важно по возможности предусматривать исключения или особые случаи, которые могут нарушить безопасность.

Пример

Учитывая предоставленное описание проблемы и конфигурацию, представленную в файле 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, предотвращая возможные нарушения безопасности, сохраняя при этом удобство использования для разрешённых операций.

Оцените материал
Добавить комментарий

Капча загружается...