2017-02-06 2 views
3

Я хотел бы иметь возможность запускать определенные скрипты Perl в моей системе как root, даже если вызывающий их пользователь не работает как root.Perl-скрипт для запуска от имени root (обобщенный)

Для каждого сценария я могу написать оболочку C, установив корень setuid для этой оболочки; оболочка изменит UID на 0, а затем вызовет скрипт Perl, который не будет иметь установленный бит setuid. Это позволяет избежать неудачных препятствий при попытке запустить скрипты rootuid root.

Но я не хочу писать C-обертку для каждого скрипта. Я просто хочу, чтобы одна обертка C выполняла работу для всей системы. Я также не хочу, чтобы какой-либо скрипт мог использовать эту оболочку C; сама оболочка C должна иметь возможность проверять некоторые специфические характеристики скрипта Perl, чтобы убедиться, что изменение UID в корневой директории является приемлемым.

Я еще не вижу вопроса о переполнении стека, который решает эту проблему.

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

ответ

1

После некоторого мозгового штурма:

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

Шаг первый. Поскольку каждый скрипт, который должен быть запущен как root, должен каким-то образом быть помечен пользователем root (в противном случае любой пользователь мог бы это сделать), системный администратор использует свой привилегированный статус для выбора идентификатора пользователя, который никогда не будет назначен кому-либо , В этом примере мы используем идентификатор пользователя 9999.

Шаг второй. Скомпилируйте конкретную C-оболочку и пусть код объекта выполняется suid root. Исходный код для этой оболочки можно найти here.

Затем следующие два шага выполняются один раз для каждого скрипта Perl, выполняемого как root.

Шаг первый. Начните каждый скрипт Perl со следующего кода.

if($>) 
{ 
    exec { "/path-to-wrapper-program" } 
     ("/path-to-wrapper-program",$0,@ARGV); 
} 

Шаг второй. Как root (очевидно), измените владельца скрипта Perl на пользователя 9999. Вот и все. Нет обновления баз данных или текстовых файлов. Все требования для запуска скрипта Perl в качестве корня принадлежат самому скрипту.

Комментарий на шаге: я на самом деле место выше Perl фрагмент кода после того, как эти строки:

use strict; 
use warnings FATAL=>"all"; 

... но одевают.

1

Итак, используйте единую оболочку, возьмите скрипт perl для выполнения в качестве аргумента и сравните длину скрипта и SHA-3 или SHA-2 хэша содержимого скрипта с ожидаемыми значениями.

+0

Это предлагаемое решение является хорошим, поскольку оно требует, чтобы что-то было сделано от root, чтобы благословить предложенный скрипт, чтобы C-оболочка знала, что выполняет его как root. Но я хотел бы, чтобы благословение (по-прежнему выполняемое только root) было как-то частью самого скрипта Perl, так что отдельный список хешей не нужно поддерживать каждый раз, когда скрипт добавляется, удаляется или изменяется. –

+0

Затем вы хотите, чтобы скрипт perl развернулся и вызвал оболочку, чтобы вызвать себя, если она еще не root. Но тогда любой скрипт perl может это сделать, и у вас практически нет безопасности. – ysth

+0

Как я вижу, пользователю командной строки не нужно было знать, что какой-либо C-оберткой был задействован. Он просто запускает скрипт Perl, и да, он будет вызывать оболочку. Трюк заключается в том, чтобы каким-то образом пометить скрипт Perl (таким образом, что может выполняться только root), чтобы обертка C знала, что скрипт Perl имеет право запускать как UID 0. –

5

То, что вы пытаетесь сделать, очень сложно, даже экспертами. Обертка setuid, которая раньше использовалась с perl, больше не существует из-за этого и потому, что в наши дни она больше не нужна. Linux и я предполагаю, что другие современные Unix-системы поддерживают скрипты setuid, поэтому вам не нужны высоко-хрупкие и сложные оболочки.

Если вам действительно нужна обертка, не заново изобретайте колесо; просто используйте sudo!

Смежные вопросы