Почему рискованно предоставлять доступ к sudo vim обычным пользователям?

30

Я хотел бы создать нового пользователя и дать ему доступ sudo. Если быть точным, я хочу, чтобы он использовал sudo vimи отредактировал httpd.conf. Я написал это в sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Я, однако, слышал, что это может быть рискованно. Почему это проблематично? Насколько серьезна проблема?

mi0pu
источник
16
Например, ваша команда предоставит пользователю доступ для чтения и записи ко всем файлам на компьютере. После vimэтого пользователь может свободно открывать и записывать любые файлы, которые ему нравятся.
John1024
4
Кроме того, вы можете создать новую группу, чтобы добавить любого пользователя, нуждающегося в доступе /etc/httpd/confs/httpd.conf. Затем используйте, chgrp [OPTION] GROUPNAME FILEчтобы изменить владельца группы /etc/httpd/confs/httpd.conf. Что-то вроде groupadd vimportantсоздания новой группы и chgrp -v vimportant /etc/httpd/confs/httpd.confсмены владельца группы. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin
4
Обратите внимание, что из-за всех проблем, упомянутых в ответах, в sudo есть способ, позволяющий пользователям редактировать файлы с помощью редактора, работающего со своими собственными привилегиями. Ищите «Безопасное редактирование» на sudoersстранице руководства .
Михал Политовски,
2
(Не уверен, что то, что я говорю, правильно) Поскольку вы предоставляете sudoдоступ к vim, пользователь сможет использовать vim от имени пользователя root. В Vim вы можете запускать команды UNIX ( Как запускать команды Unix внутри Vim? ) , Так что пользователь сможет сделать вещь , как useradd <myuser>, rm -rf /или многое другое.
Федорки
6
Это своего рода неправильный вопрос. Когда вы рассматриваете вопрос о предоставлении каких-либо повышенных привилегий, вы не хотите думать: «Я сделаю это, если я не придумаю причину, по которой это опасно». Вы хотите думать: «Я не буду этого делать, если не смогу доказать себе, что это безопасно».
Нейт Элдридж

Ответы:

60

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

HBruijn
источник
Я этого не знал sudo tarи sudo unzipтоже вызывал проблемы. Спасибо.
mi0pu
5
Хороший ответ. Было бы еще лучше, если бы в нем также упоминалось побег из vim в оболочку. Как только вы попадаете в оболочку, она становится бесплатной для всех, и все же все, что будет отображаться в журналах, это то, что пользователь редактирует ваш файл конфигурации Apache.
CVn
2
Дополнительно? Если вы используете vim, вы можете сделать что-то ужасное, типа :!rm -rf /ой!
Уэйн Вернер
1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcИ бум. Корневой доступ к tar является уязвимостью.
Qix
1
@ MichaelKjörling, это ответ, который я ожидал, а :shзатем бум, корневая оболочка
Крик
5

Эта конфигурация позволяет этому пользователю редактировать этот файл. Для этого он запускает vimредактор с правами root.

После vimзапуска команды пользователь может делать с редактором все, что ему нравится. - Он может открыть другой файл или даже запустить оболочку из VIM.

Поэтому пользователь теперь может просматривать и редактировать произвольные файлы и выполнять произвольные команды в вашей системе.

Михась
источник
Что вы подразумеваете под "Эта конфигурация позволяет всем пользователям редактировать этот файл"? Имеет ли «пользователь» особое значение?
mi0pu
Упс, не обратил внимания. исправил ответ.
Михас
5

Замки безопасности

Некоторые программы, такие как, например less, vi, vimи more, чтобы другие программы для запуска из командной оболочки , что , как известно , как Shell побег или бежать к командному интерпретатору. В этих случаях вы можете использовать, NOEXECчтобы запретить некоторым программам запускать права других программ. Пример:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

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

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

Если в файле определено, /etc/sudoersчто пользователь может работать с привилегиями /usr/bin/vim, то есть что-то вроде следующего:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudoпозволяет определенному обычному пользователю запускаться /usr/bin/vimследующими способами:

sudo /usr/bin/vim
sudo vim

Но не позволяйте запускать vim следующим образом:

cd /usr/bin
sudo ./vim
Паван Кумар
источник
2
Это должен быть ответ или ошибка вырезания и вставки?
Джейсонвриан
1
Большая часть этого не связана с вопросом.
Хауке Лагинг
4

Простой ответ:

Ниже приведена команда Vim:

:shell

У них теперь есть корневая оболочка.

Wildcard
источник
1

Одним из возможных дополнительных улучшений безопасности будет замена:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

с

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

а затем запустить пользователя sudo rvim /etc/httpd/confs/httpd.conf вместо этого.

Vim поддерживает ограниченный режим, запускаемый с параметром командной строки -Z или запуском программы от имени rvim. Когда включен ограниченный режим, «все команды, использующие внешнюю оболочку, отключены». Этот подход не помешает пользователю использовать :split fileкоманду ex для открытия других файлов, но, по крайней мере, должен предотвратить намеренно вредоносные команды оболочки, такие как :!rm -rf /.

Johann
источник
1
К сожалению, это также на 100% небезопасно. Если пользователю удастся отредактировать / etc / sudoers, чтобы стать всемогущим в системе, он может выполнить любую команду от имени пользователя root.
vurp0
0

Я согласен с ответом HBruijn, что запуск vim от имени root действительно открывает систему очень широко, и sudoedit будет более безопасным решением.

Но даже тогда ваша система, скорее всего, все еще будет довольно открытой. По крайней мере, предполагая, что какой-то процесс apache с привилегиями root будет запущен на основе этой конфигурации. Существует миллион способов настроить Apache таким образом, чтобы он выполнял внешние программы. В качестве одного примера рассмотрим аргумент pipe для директивы CustomLog . В руководстве четко говорится:

Безопасность:

Если программа используется, то она будет запущена как пользователь, который запустил httpd. Это будет root, если сервер был запущен root; убедитесь, что программа безопасна.

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

По этой причине я недавно взломал способ использования возможностей таким образом, чтобы apache мог получить специальную возможность привязки к привилегированному порту, даже если в противном случае он работает как обычный пользователь. Таким образом, пользователи могут редактировать конфигурацию и даже запускать сервер, и все еще в основном безопасны. Единственная проблема заключается в том, что они могут связать любой процесс на любом IP. Сохраняется определенная степень доверия, поскольку они могут найти способ сбить систему sshd, а затем запустить собственную версию в попытке получить пароль root.

MVG
источник
0

Следует отметить, что даже это sudoedit {.../whatever.conf}может представлять угрозу безопасности.

Создать сценарий оболочки /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

и вызовите этот скрипт в вашем конфигурационном файле. Я знаю несколько примеров, где этот подход работает:

samba -> команда log nt token

log nt token command = /tmp/make_me_root.sh

syslog-ng -> program: отправка сообщений во внешние приложения

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Я предполагаю, что можно расширить этот список до бесконечности.

Все, что вам нужно сделать, это перезапустить службу. Конечно, как только вы станете пользователем root, вы вернете такие строки конфигурации, чтобы стереть следы.

Вернфрид Домшайт
источник
0

Конечно, это совсем не безопасно. Как уже говорилось, sudoedit - это самый простой и удобный способ сделать это.

Я хочу добавить, что vim позволяет запускать оболочку, поэтому он не только может редактировать любой системный файл, но также позволяет запускать оболочку и делать все, что он захочет.

Просто попробуйте запустить vim и наберите: sh

Lauskin
источник