Хотя вы ограничиваете аргументы командной строки, ничто не мешает пользователю использовать vim для открытия, редактирования и перезаписи любого случайного файла, когда он запускается от имени пользователя root.
Пользователь может запустить, sudo vim /etc/httpd/conf/httpd.conf
а затем
- очистить весь этот текст из буфера редактирования
- затем для удобства создайте источник существующего файла (хотя это даже не требуется): например, конфигурация sudo.
:r /etc/sudoers
ПРИМЕЧАНИЕ: Если пользователь SELinux не ограничен, пользователь может читать любой файл таким образом!
- предоставь себе больше привилегий sudo
user ALL=(ALL) NOPASSWD: ALL
- переписать старую конфигурацию
:w /etc/sudoers
Я могу представить десятки подобных способов, которыми ваш пользователь теперь может получить доступ, изменить или уничтожить вашу систему.
У вас даже не будет контрольного журнала, какие файлы были изменены таким образом, поскольку вы увидите, как он редактирует вашу конфигурацию Apache в сообщениях журнала sudo. Это угроза безопасности при предоставлении sudo
прав любому редактору.
Это более или менее та же самая причина, по которой предоставление прав корневого уровня sudo таким командам, как tar
и unzip
часто небезопасно, ничто не мешает вам включать в архив замены системных двоичных файлов или файлов конфигурации системы.
Второй риск, как отмечали многие другие комментаторы, заключается в том, что он vim
допускает экранирование оболочки , при котором вы можете запустить вложенную оболочку из vim, которая позволяет вам выполнить любую произвольную команду . Из вашего сеанса sudo vim они будут работать как root, например, оболочка escape:
:!/bin/bash
даст вам интерактивную корневую оболочку
:!/bin/rm -rf /
сделает для хороших историй в пабе.
Что делать вместо этого?
Вы все еще можете использовать его, sudo
чтобы разрешить пользователям редактировать файлы, которые им не принадлежат, безопасным способом.
В вашей конфигурации sudoers вы можете установить специальную зарезервированную команду, sudoedit
за которой следует полный (подстановочный) путь к файлам, которые пользователь может редактировать:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Пользователь может затем использовать -e
переключатель в своей командной строке sudo или использовать sudoedit
команду:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Как объяснено в справочной странице :
-e (edit)
Опция указывает на то, что вместо выполнения команды, пользователь хочет редактировать один или несколько файлов. Вместо команды строка "sudoedit" используется при обращении к политике безопасности.
Если пользователь авторизован политикой, предпринимаются следующие шаги:
- Временные копии делаются из файлов, которые будут редактироваться с владельцем, установленным для вызывающего пользователя.
- Редактор, указанный в политике, запускается для редактирования временных файлов. Политика sudoers использует переменные среды SUDO_EDITOR, VISUAL и EDITOR (в этом порядке). Если ни один из параметров SUDO_EDITOR, VISUAL или EDITOR не установлен, используется первая программа, указанная в параметре editor
sudoers
(5).
- Если они были изменены, временные файлы копируются обратно в исходное местоположение, а временные версии удаляются.
Если указанный файл не существует, он будет создан.
Обратите внимание, что в отличие от большинства команд, запускаемых sudo, редактор запускается с неизменной средой вызывающего пользователя. Если по какой-то причине sudo не может обновить файл с его отредактированной версией, пользователь получит предупреждение, и отредактированная копия останется во временном файле.
sudoers
Руководство также имеет целый раздел , как она может предложить ограниченную защиту от побегов оболочки с RESRICT
и NOEXEC
опциями.
restrict
Избегайте предоставления пользователям доступа к командам, которые позволяют пользователю выполнять произвольные команды. Многие редакторы имеют ограниченный режим, в котором экранирование отключено, хотя sudoedit - лучшее решение для запуска редакторов через sudo. Из-за большого количества программ, которые предлагают экранирование оболочки, ограничение пользователей набором программ, которые обычно не работают, является неработоспособным.
а также
noexec
Многие системы, поддерживающие разделяемые библиотеки, имеют возможность переопределять функции библиотеки по умолчанию, указывая переменную среды (обычно LD_PRELOAD) на альтернативную разделяемую библиотеку. В таких системах функциональность sudo noexec может использоваться для предотвращения запуска других программ программами, запускаемыми sudo. Примечание. ... ...
Чтобы включить noexec для команды, используйте NOEXEC
тег, как описано в разделе «Спецификация пользователя» выше. Вот снова этот пример:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
это позволяет пользователю aaron работать /usr/bin/more
и /usr/bin/vi
с включенным noexec. Это предотвратит выполнение этими двумя командами других команд (например, оболочки).
vim
этого пользователь может свободно открывать и записывать любые файлы, которые ему нравятся.