Библиотека сайта 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.
А это иллюстрация с соответствующим выводом:
Не стоит лишний раз говорить о том, что при использовании описанной конфигурации вместо возможности редактирования отдельного системного файла пользователь получит возможность делать в системе все, что ему угодно.
Давайте рассмотрим другие варианты данной конфигурации. Существует тэг 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"
. Если политика безопасности позволяет пользователю редактировать файлы, осуществляются следующие действия:
- Создаются временные копии редактируемых файлов, принадлежащие вызывающему текстовый редактор пользователю.
-
Для редактирования временных копий файлов запускается определяемый политикой безопасности текстовый редактор. Стандартная политика, описанная в файле
sudoers
, предусматривает использование переменных окруженияSUDO_EDITOR
,VISUAL
иEDITOR
(в приведенном порядке). Если значения переменных окруженияSUDO_EDITOR
,VISUAL
иEDITOR
не заданы, вызывается первая программа, заданная с помощью параметраeditor
в файле конфигурацииsudoers
. - Если временные файлы были модифицированы, они перемещаются и заменяют собой оригинальные версии файлов.
Если указанного файла не существует, он будет создан. Обратите внимание на то, что в отличие большинства запускаемых с помощью sudo команд, текстовый редактор запускается с неизменным окружением вызывающего пользователя. В том случае, если по какой-то причине sudo не удается обновить содержимое файла, приведя его в соответствие с модифицированной версией, пользователь увидит предупреждение, а модифицированная версия файла будет сохранена.
Заключение
Теперь вы должны иметь хотя бы базовое представление о команде sudoedit, а именно, знать о том, когда следует использовать эту команду и почему ее следует использовать вместо sudo при возникновении необходимости в редактировании одного или нескольких файлов. Конечно же, как и любой инструмент, работающий с повышенными привилегиями, sudoedit подвергается атакам, но при этом он все еще рекомендуется к использованию в различных ситуациях.