Ruby on Rails - как запустить скрипт bash от имени пользователя root? - PullRequest
3 голосов
/ 24 октября 2009

То, что я хочу сделать, это использовать button_to и друзей, чтобы запускать разные сценарии на сервере Linux. Не все сценарии должны быть корневыми, но некоторые будут, так как они будут запускать «apt-get dist-upgrade» и тому подобное.

PassengerDefaultUser установлен на www-данные в apache2.conf

Я уже пробовал запускать скрипты из контроллера, которые занимаются мелочами, такими как запись в текстовые файлы и т. Д., Просто чтобы я знал, что у меня Rails правильно выполняет скрипт. (другими словами, я знаю, как запустить скрипт из контроллера) Но я не могу понять, как запустить скрипт, который требует root-доступа. Кто-нибудь может дать мне руководство?

Примечание по безопасности: Спасибо за все предупреждения против взлома, которые были даны. Вам не нужно терять сон, потому что A) веб-приложение не доступно из общедоступного Интернета, оно будет только в частных интрасетях, B) приложение защищено паролем и C) потому что пользователь не будет возможность предоставлять пользовательский ввод, делать выбор только из формы, которая будет передана в качестве переменных в сценарий. Однако, поскольку я говорю, что это не означает, что я игнорирую ваши рекомендации по безопасности, я буду очень внимательно их учитывать в своем проекте.

1 Ответ

6 голосов
/ 24 октября 2009

Вы должны использовать бит setuid для достижения той же функциональности без sudo. Но вы не должны запускать скрипты Bash. Setuid намного более безопасен, чем sudo. Используя sudo или setuid, вы запускаете программу от имени пользователя root. Но только setuid (с помощью определенных языков) предлагает некоторые дополнительные меры безопасности.

По сути, вы будете использовать сценарии, которым временно разрешено работать от имени владельца, а не от пользователя, который их вызвал. Ruby и Perl могут определять, когда скрипт запускается от имени другого пользователя, чем вызывающий, и применяют меры безопасности для защиты от небезопасных вызовов. Это называется Taint mode. Bash вообще не работает в режиме taint.

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

Настройка:

Используйте chmod, чтобы установить разрешения для скрипта, который вы хотите запустить как 4755, и установить его владельца как root:

$ chmod 4755 script.rb
$ chown root script.rb

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

См. Документацию Ruby по безопасным уровням и порче , чтобы понять санитарные требования Ruby для защиты от испорченного ввода, наносящего вред. Или perlsec faq , чтобы узнать, как то же самое делается в Perl.

Снова. Если у вас не получается установить сценарии от имени пользователя root из автоматизированной системы. Не используйте Bash! Используйте Ruby или Perl вместо Bash. Режим Taint заставляет вас серьезно относиться к безопасности и может избежать многих ненужных проблем в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...