Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Организация безопасного редактирования системных файлов с помощью sudoedit в Linux

Оригинал: How to let users securely edit files using sudoedit on Linux
Автор: Himanshu Arora
Дата публикации: 24 февраля 2017 г.
Перевод: А.Панин
Дата перевода: 23 марта 2017 г.

Представьте, что вы являетесь системным администратором в компании, в которой несколько команд разработчиков используют Linux для совместной работы над файлами проекта, причем каждый из разработчиков обладает ограниченными привилегиями в системе. А теперь представьте, что участникам одной из команд понадобилось приступить к новой работе, связанной с необходимостью периодического редактирования файлов, для модификации которых требуются привилегии пользователя root. Что бы вы сделали в этом случае?

Одним из вариантов является предоставление этим разработчикам доступа к функциям утилиты sudo, но это эквивалентно предоставлению ключей от вашего дома случайному человеку с улицы, хотя он просит лишь временно пожить в одной из комнат; я хотел сказать о том, что предоставление доступа к утилите sudo по умолчанию подразумевает возможность выполнения всех требующих привилегий пользователя root действий, хотя все, что нужно пользователям - это иметь возможность редактирования определенного системного файла.

Принимая во внимание гибкость конфигурации sudo, можно рассмотреть другой вариант, заключающийся в настройке политики sudo с ограничением спектра возможных действий запуском текстового редактора с передачей пути к интересующему файлу. Например, для этого может использоваться аналогичная директива:

%newsudo ALL = vim /путь/к/файлу

Хотя данный вариант конфигурации, без каких-либо сомнений, является более безопасным, чем предоставление пользователям неограниченного доступа к утилите sudo, все же существует одна лазейка, с помощью которой может быть нарушено корректное функционирование системы.

Для лучшего понимания того, о чем я говорю, следует рассмотреть гипотетический сценарий, в соответствии с которым описанная возможность ограниченного доступа к утилите sudo была предоставлена группе пользователей, после чего один из пользователей открыл файл с заданным именем с помощью утилиты sudo для редактирования.

Находчивый пользователь, имеющий опыт работы с текстовым редактором vim, сразу же поймет, что у него имеется возможность запуска командной оболочки непосредственно из текстового редактора - все, что для этого нужно - это выполнить с помощью текстового редактора следующую команду vim:

:shell

В результате пользователь переместится в интерактивную командную оболочку. Если вы попытаетесь повторить описанную конфигурацию на своем компьютере и исполните команду whoami, вы сразу же поймете, о какой лазейке шла речь - да, вы окажитесь в интерактивной командной оболочке, запущенной от лица пользователя root.

А это иллюстрация с соответствующим выводом:

sudoedit

Не стоит лишний раз говорить о том, что при использовании описанной конфигурации вместо возможности редактирования отдельного системного файла пользователь получит возможность делать в системе все, что ему угодно.

Давайте рассмотрим другие варианты данной конфигурации. Существует тэг NOEXEC, который может использоваться в файле конфигурации sudoers:

%newsudo ALL = NOEXEC: vim /путь/к/файлу

По сути, тэг NOEXEC позволяет предотвратить запуск силами запущенной с помощью утилиты sudo программы любых других программ. То есть, рабочее решение найдено? К сожалению, нет. Для иллюстрации данного утверждения следует привести выдержку со страницы руководства файла конфигурации sudoers.

noexec

Во многих системах, поддерживающих разделяемые библиотеки, имеется возможность переназначения стандартных библиотечных функций путем передачи пути к альтернативной реализации разделяемой библиотеки посредством переменной окружения (обычно она носит имя LD_PRELOAD). В таких системах технология noexec может использоваться для предотвращения запуска силами запущенных с помощью sudo программ любых других программ. Однако, следует помнить о том, что данная технология работает лишь в случае использования динамически связанных бинарных файлов для используемой системы. Статически связанные бинарные файлы для используемой системы и любые бинарные файлы для других систем, запускаемые с помощью бинарных эмуляторов, не подпадают под ее действие.

Описанная технология работоспособна в таких системах, как SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX версии 11.x, а также AIX версии 5.6 и более новых версий.

...

Чтобы активировать технологию noexec для заданной команды следует использовать тэг NOEXEC таким образом, как описано в приведенном выше разделе "Пользовательские спецификации". А это пример:

aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi

В данном случае пользователю с именем aaron разрешается запускать бинарные файлы /usr/bin/more и /usr/bin/vi с активацией технологии noexec. Эта технология позволяет предотвратить исполнение силами упомянутых программ других программ (таких, как командная оболочка). Если вы не уверены в том, поддерживается ли технология noexec вашей системой, вы всегда можете самостоятельно проверить возможность использования функций командной оболочки в текстовом редакторе vi, запущенном с тэгом для активации noexec.

Учтите, что запрет использования командной оболочки в vi не является панацеей. Программы, запущенные от лица пользователя root потенциально могут выполнить огромное количество опасных операций (например, модифицировать или перезаписать системные файлы), что может использоваться для повышения привилегий в системе.

...

Если вы внимательно прочитали выделенный жирным шрифтом текст, вы наверняка поняли, что тэг NOEXEC имеет ряд ограничений.

Итак, в чем же состоит наиболее безопасное решение? Ну, достаточно использовать sudoedit. Этот инструмент рекомендуется к использованию даже не странице руководства файла конфигурации sudoers:

При возникновении необходимости работы с текстовым редактором наиболее безопасным решением является предоставление пользователю возможности запуска sudoedit.

Sudoedit

Sudoedit является встроенным в утилиту sudo механизмом запуска текстового редактора для безопасной модификации файлов. В соответствии со страницей руководства sudo, исполнение команды sudoedit эквивалентно исполнению команды sudo с параметром -e.

Почему описанное решение является предпочтительным

При работе с sudoedit у пользователей есть возможность выбора предпочтительного текстового редактора, что выгодно отличает рассматриваемое решение от решения, описанного в начале статьи и подразумевающего принудительное использование текстового редактора vim без возможности его замены путем модификации каких-либо системных настроек. А главное преимущество решения на основе sudoedit заключается в том, что пользователь редактирует системный файл самостоятельно, а не от лица пользователя root.

Принцип работы sudoedit

Для использования sudoedit в файле конфигурации sudoers должна быть размещена аналогичная директива:

%newsudo ALL = sudoedit /путь/к/файлу

После этого все пользователи из группы newsudo будут иметь возможность редактировать файл после исполнения следующей команды:

sudoedit /путь/к/файлу

В результате исполнения данной команды в первую очередь создается временная копия указанного файла. После этого осуществляется поиск переменных окружения SUDO_EDITOR, VISUAL и EDITOR (в указанном порядке) для выяснения пути к бинарному файлу текстового редактора, который будет задействован для редактирования только что созданной временной копии файла. После того, как пользователь закончит редактирование файла, изменения будут скопированы в оригинальный файл.

А это детальное описание соответствующего параметра со страницы руководства sudo:

-e, --edit

Отредактировать один или несколько файлов вместо исполнения команды. При описании политики безопасности вместо пути может использоваться строка "sudoedit". Если политика безопасности позволяет пользователю редактировать файлы, осуществляются следующие действия:

  1. Создаются временные копии редактируемых файлов, принадлежащие вызывающему текстовый редактор пользователю.
  2. Для редактирования временных копий файлов запускается определяемый политикой безопасности текстовый редактор. Стандартная политика, описанная в файле sudoers, предусматривает использование переменных окружения SUDO_EDITOR, VISUAL и EDITOR (в приведенном порядке). Если значения переменных окружения SUDO_EDITOR, VISUAL и EDITOR не заданы, вызывается первая программа, заданная с помощью параметра editor в файле конфигурации sudoers.
  3. Если временные файлы были модифицированы, они перемещаются и заменяют собой оригинальные версии файлов.

Если указанного файла не существует, он будет создан. Обратите внимание на то, что в отличие большинства запускаемых с помощью sudo команд, текстовый редактор запускается с неизменным окружением вызывающего пользователя. В том случае, если по какой-то причине sudo не удается обновить содержимое файла, приведя его в соответствие с модифицированной версией, пользователь увидит предупреждение, а модифицированная версия файла будет сохранена.

Заключение

Теперь вы должны иметь хотя бы базовое представление о команде sudoedit, а именно, знать о том, когда следует использовать эту команду и почему ее следует использовать вместо sudo при возникновении необходимости в редактировании одного или нескольких файлов. Конечно же, как и любой инструмент, работающий с повышенными привилегиями, sudoedit подвергается атакам, но при этом он все еще рекомендуется к использованию в различных ситуациях.