На каком дистрибутиве Linux вы работаете? Или даже Unix?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidне будет работать со сценариями - в настоящее время он отключен из соображений безопасности в большинстве дистрибутивов * nix. Вы можете установить его, но он будет проигнорирован. Может быть, вы можете объяснить больше о вашей реальной проблеме, чтобы мы могли помочь вам решить ее вместо этого? Что это за сценарий? Зачем вам нужно, чтобы он выполнялся от имени пользователя root? Используете sudoальтернативу?
slhck
Ты пробовал sudo -s?
Нам Пхунг
Ответы:
29
Будьте очень осторожны: сценарии в сочетании с setuid опасны!
Если вы все еще хотите выполнить свой сценарий с помощью setuidset, вы можете написать короткую программу на C в качестве оболочки и установить setuidбит в скомпилированном двоичном файле.
Пример Wrapper:
int main(void) {
setuid(0);
clearenv();
system("/absolute/path/to/your/script.sh");
}
Другое решение с использованием sudo(упомянуто здесь ):
От имени пользователя root запретите запись (и, возможно, другое) в ваш скрипт:
Убедитесь, что никто, кроме root, не может заменить скрипт , например, изменив права доступа родительской папки:
chown root / absolute / path / to / your /
CHMOD 755 / абсолютный / путь / к / ваш /
Измените права доступа sudo /etc/sudoersс помощью visudo:
ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
Более подробную информацию о настройках (например, ограничение доступа для определенных пользователей или групп) можно найти на странице руководства sudoers.
После этого все пользователи могут запускать скрипт от имени пользователя root без пароля:
sudo /absolute/path/to/your/script.sh
Это похоже на использование решения обертки / setuid выше.
Конкретные опасности не очень очевидны, но они сильно вращаются вокруг окружающей среды. В отличие от большинства программ, поведение сценария оболочки может быть существенно изменено десятками переменных среды, и этого достаточно, чтобы без широких мер защиты такой сценарий можно было легко обмануть для выполнения произвольного кода.
@ Стефани Я, должно быть, делаю что-то не так, потому что все это выглядит слишком сумасшедшим для обычной задачи. Вот что я пытаюсь сделать: serverfault.com/questions/401405/…
HappyDeveloper
@HappyDeveloper Не слишком сумасшедший сценарий для setuid, так как плохо защищенный - это путь к root для любого, кому удастся его запустить.
Стефани
4
sudoможет использоваться для предоставления всем пользователям доступа к определенной программе (или сценарию). В этом смысле он действует как необычная оболочка setuid. Кажется, что это, как правило, будет лучшим выбором, чем написание вашей собственной оболочки setuid.
jjlin
4
Самый простой и безопасный способ - использовать биты SETUID в правах доступа к файлу. таким образом, права доступа к команде будут повышены до разрешений владельца файла.
чтобы не допустить сценария из редакции, не устанавливайте запись для всех битов.
setuid
не будет работать со сценариями - в настоящее время он отключен из соображений безопасности в большинстве дистрибутивов * nix. Вы можете установить его, но он будет проигнорирован. Может быть, вы можете объяснить больше о вашей реальной проблеме, чтобы мы могли помочь вам решить ее вместо этого? Что это за сценарий? Зачем вам нужно, чтобы он выполнялся от имени пользователя root? Используетеsudo
альтернативу?sudo -s
?Ответы:
Будьте очень осторожны: сценарии в сочетании с setuid опасны!
Во-первых, пожалуйста, посмотрите на этот вопрос / ответы , особенно на этот ответ и предупреждение безопасности .
Если вы все еще хотите выполнить свой сценарий с помощью
setuid
set, вы можете написать короткую программу на C в качестве оболочки и установитьsetuid
бит в скомпилированном двоичном файле.Пример Wrapper:
Другое решение с использованием
sudo
(упомянуто здесь ):От имени пользователя root запретите запись (и, возможно, другое) в ваш скрипт:
Убедитесь, что никто, кроме root, не может заменить скрипт , например, изменив права доступа родительской папки:
Измените права доступа sudo
/etc/sudoers
с помощьюvisudo
:Более подробную информацию о настройках (например, ограничение доступа для определенных пользователей или групп) можно найти на странице руководства sudoers.
После этого все пользователи могут запускать скрипт от имени пользователя root без пароля:
Это похоже на использование решения обертки / setuid выше.
источник
sudo
может использоваться для предоставления всем пользователям доступа к определенной программе (или сценарию). В этом смысле он действует как необычная оболочка setuid. Кажется, что это, как правило, будет лучшим выбором, чем написание вашей собственной оболочки setuid.Самый простой и безопасный способ - использовать биты SETUID в правах доступа к файлу. таким образом, права доступа к команде будут повышены до разрешений владельца файла.
чтобы не допустить сценария из редакции, не устанавливайте запись для всех битов.
источник
Я не знаю, может ли это быть полезным, но, чтобы скрипт работал только как root, вы могли бы использовать этот shebang в первой строке скрипта:
источник