Intereting Posts
Настройка часового пояса в Linux генерировать имена файлов в цикле Проблема BTRFS – исчезновение / повторное появление содержимого? Две независимые версии файловой системы в зависимости от монтируемого субблока Почему `sed` не возвращает статус выхода, если регулярное выражение не соответствует? Двойное SSH-туннелирование для общей папки SMB Создает ли каталог / etc только плохую идею? xterm подсветка всегда белая, а не обратная Приложение запущено в / etc / X11 / xdm / Xsetup не может получать нажатия клавиш восстановить поврежденный каталог из раздела ext3 Установите настройки звука на 152% при загрузке (LMDE) Как установить парольную фразу на USB-накопитель? Является ли Просветление полноценным DE или просто WM? директория cp с разрешениями, но не рекурсивно Перенумеровать зашифрованный раздел – sda3 на sda5 «226 Transfer complete» гарантирует согласованность между локальными и удаленными файлами при использовании ftp?

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

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

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

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

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

Пользователь может запустить sudo vim /etc/httpd/conf/httpd.conf а затем

  • очистить весь текст из буфера редактирования
  • то для удобства источника существующий файл (хотя это даже не требуется): например, конфигурация sudo
    :r /etc/sudoers ПРИМЕЧАНИЕ. Если это не запрещено SELinux, пользователь может прочитать любой файл таким образом!
  • предоставить себе больше привилегий user ALL=(ALL) NOPASSWD: ALL sudo user ALL=(ALL) NOPASSWD: ALL
  • перезаписать старую конфигурацию :w /etc/sudoers

Я могу представить десятки подобных способов, которыми ваш пользователь может теперь получить доступ, изменить или уничтожить вашу систему.

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

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


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

  • :!/bin/bash даст вам интерактивную корневую оболочку
  • :!/bin/rm -rf / сделает для хороших рассказов в пабе.

Что делать вместо этого?

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

В вашей конфигурации sudoers вы можете установить специальную зарезервированную команду sudoedit за которой следует полный (wildcard) путь к файлам, которые пользователь может редактировать:

 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 не установлен, используется первая программа, указанная в опции редактора sudoers (5).
  • Если они были изменены, временные файлы копируются обратно в исходное местоположение и удаляются временные версии.
    Если указанный файл не существует, он будет создан.
    Обратите внимание: в отличие от большинства команд, выполняемых sudo, редактор запускается с немодифицированной средой вызывающего пользователя. Если по какой-либо причине sudo не сможет обновить файл с его отредактированной версией, пользователь получит предупреждение, а отредактированная копия останется во временном файле.

В руководстве sudoers также есть целый раздел, как он может обеспечить ограниченную защиту от RESRICT оболочки с параметрами RESRICT и NOEXEC .

restrict Не предоставлять пользователям доступ к командам, которые позволяют пользователю выполнять произвольные команды. Многие редакторы имеют ограниченный режим, в котором экраны оболочки отключены, хотя sudoedit – лучшее решение для запуска редакторов через sudo. Из-за большого количества программ, которые предлагают экраны оболочки, ограничение пользователей на множество программ, которые этого не делают, часто не работает.

а также

noexec
Многие системы, поддерживающие общие библиотеки, имеют возможность переопределять библиотечные функции по умолчанию, указывая переменную среды (обычно LD_PRELOAD) на альтернативную общую библиотеку. В таких системах функциональность noexec от sudo может использоваться для предотвращения выполнения программой sudo от выполнения каких-либо других программ. Обратите внимание, ... ...
Чтобы включить noexec для команды, используйте тег NOEXEC как NOEXEC в разделе «Спецификация пользователя» выше. Вот еще один пример:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Это позволяет пользователю aaron запускать /usr/bin/more и /usr/bin/vi с включенным noexec. Это предотвратит выполнение этими двумя командами других команд (например, оболочки).

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

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

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

Защитные замки

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

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

Это позволило бы пользователю редактировать или так и привилегировать просматривать любой файл в системе, на которой работает vim и более, но отключает возможность запуска других программ с привилегиями из командной 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 

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

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

 :shell 

Теперь они имеют корневую оболочку.

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

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 / .

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

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

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

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

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

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

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

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

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

Надеюсь, поможет!