How to edit files in GUI text editors as root?
This time and another I need to edit some files that are supposed to be edited by root only. I would very much prefer to do it in a GUI text editor rather than using command line tools like nano or vi. Yes, it is perfectly possible to do editing using either one of them or the likes, I am merely dissatisfied with this option, because it is inconvenient when compared to working with kate or gedit (personal opinion; it is totally fine if you have the opposite, but I stick to mine). That being said, I would not like to completely compromise security with a nuclear option xhost si:localuser:root . Is there any middle ground solution (like sudo that, unfortunately, have intentionally been crippled when it comes to running GUI stuff)?
@mikewhatever Did not work. Unable to init server: Could not connect: Connection refused (gedit:1647550): Gtk-WARNING **: 22:26:54.534: cannot open display:
Have you tried sudo gedit /path/to/file ? It’s probably not the greatest way to do it, but it works for me.
@moep Thank for you suggestion. I has tested your script and I can confirm it working, but. I see that it is based on what I called the nuclear option in my original post ( xhost si:localuser:root ). This solution does work, but it poses a serious security risk. And the latter is what I would prefer to avoid, if possible.
2 Answers 2
1. The admin:// URI
In Ubuntu, the official way to edit system files as root with a graphical editor is to use the admin:// URI. For example, to edit /etc/fstab , issue the following command in the run dialog you obtain after pressing Alt + F2 or on the terminal:
In older Ubuntu versions (prior to 20.10), the very first time you do this, you need to supply your user password two times in a row. This has been fixed in 20.10.
Of course, your user needs to belong to the root group in order to edit system files.
2. Using sudoedit
An approach valid for any desktop environment with any editor would be to use sudoedit . Setup the SUDO_EDITOR environment variable to point to the binary of your graphical editor, for example: export SUDO_EDITOR=»/usr/bin/gedit» . Then, you can use the command sudoedit or sudo -e to open a system file in your graphical editor. Much the way the admin:// URI does, this will create a temporary copy, which you edit as a normal user. Once the editor is closed, the modified temporary copy is copied back over the system file.
This can actually be combined in a single command:
env SUDO_EDITOR="/usr/bin/gedit" sudoedit
Thus, the environment is changed only when you explicitly want to use the graphical editor. You create an alias or create a small script to edit system text files in a graphical editor with a single command.
3. Discouraged: using pkexec
These two options do not at any time run your graphical editor as root, which is preferred. Still, it is possible to run a graphical editor as root using pkexec . You can install a PolicyKit file, but you also may run it with some environment variables. For nautilus users, the package nautilus-admin installs a PolicyKit file for gedit and provides a right-click menu option in nautilus to launch a text file in gedit with root permissions. However, these options, where a graphical application is run as root are, according to man pkexec , discouraged:
As a result, pkexec will not allow you to run X11 applications as another user since the $DISPLAY and $XAUTHORITY environment variables are not set. These two variables will be retained if the org.freedesktop.policykit.exec.allow_gui annotation on an action is set to a nonempty value; this is discouraged, though, and should only be used for legacy programs.
Linux sudo edit file
Библиотека сайта rus-linux.net
whoami , вы сразу же поймете, о какой лазейке шла речь — да, вы окажитесь в интерактивной командной оболочке, запущенной от лица пользователя root.
А это иллюстрация с соответствующим выводом:
Не стоит лишний раз говорить о том, что при использовании описанной конфигурации вместо возможности редактирования отдельного системного файла пользователь получит возможность делать в системе все, что ему угодно.
Давайте рассмотрим другие варианты данной конфигурации. Существует тэг NOEXEC , который может использоваться в файле конфигурации sudoers :
%newsudo ALL = NOEXEC: vim /путь/к/файлу
По сути, тэг NOEXEC позволяет предотвратить запуск силами запущенной с помощью утилиты sudo программы любых других программ. То есть, рабочее решение найдено? К сожалению, нет. Для иллюстрации данного утверждения следует привести выдержку со страницы руководства файла конфигурации sudoers .
Во многих системах, поддерживающих разделяемые библиотеки, имеется возможность переназначения стандартных библиотечных функций путем передачи пути к альтернативной реализации разделяемой библиотеки посредством переменной окружения (обычно она носит имя 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 будут иметь возможность редактировать файл после исполнения следующей команды:
В результате исполнения данной команды в первую очередь создается временная копия указанного файла. После этого осуществляется поиск переменных окружения SUDO_EDITOR , VISUAL и EDITOR (в указанном порядке) для выяснения пути к бинарному файлу текстового редактора, который будет задействован для редактирования только что созданной временной копии файла. После того, как пользователь закончит редактирование файла, изменения будут скопированы в оригинальный файл.
А это детальное описание соответствующего параметра со страницы руководства sudo:
Отредактировать один или несколько файлов вместо исполнения команды. При описании политики безопасности вместо пути может использоваться строка «sudoedit» . Если политика безопасности позволяет пользователю редактировать файлы, осуществляются следующие действия:
- Создаются временные копии редактируемых файлов, принадлежащие вызывающему текстовый редактор пользователю.
- Для редактирования временных копий файлов запускается определяемый политикой безопасности текстовый редактор. Стандартная политика, описанная в файле sudoers , предусматривает использование переменных окружения SUDO_EDITOR , VISUAL и EDITOR (в приведенном порядке). Если значения переменных окружения SUDO_EDITOR , VISUAL и EDITOR не заданы, вызывается первая программа, заданная с помощью параметра editor в файле конфигурации sudoers .
- Если временные файлы были модифицированы, они перемещаются и заменяют собой оригинальные версии файлов.
Если указанного файла не существует, он будет создан. Обратите внимание на то, что в отличие большинства запускаемых с помощью sudo команд, текстовый редактор запускается с неизменным окружением вызывающего пользователя. В том случае, если по какой-то причине sudo не удается обновить содержимое файла, приведя его в соответствие с модифицированной версией, пользователь увидит предупреждение, а модифицированная версия файла будет сохранена.
Заключение
Теперь вы должны иметь хотя бы базовое представление о команде sudoedit, а именно, знать о том, когда следует использовать эту команду и почему ее следует использовать вместо sudo при возникновении необходимости в редактировании одного или нескольких файлов. Конечно же, как и любой инструмент, работающий с повышенными привилегиями, sudoedit подвергается атакам, но при этом он все еще рекомендуется к использованию в различных ситуациях.