Начну с того, что запускать httpd от имени root - очень плохая идея.
Самый безопасный способ сделать это - иметь полное разделение привилегий между пользовательским интерфейсом веб-сервера и эффектором - один из очевидных способов сделать это - запустить сервер в качестве пользователя root, принимающего только локальные соединения, которые пользовательский интерфейс отправляет своему запросы к (простой способ сделать это через inetd / xinetd - это означает, что вам не нужно беспокоиться обо всех сложностях создания процесса демона).
Вам также понадобится какой-то механизм доверия между пользовательским интерфейсом и эффектором - достаточно общего секрета, чтобы другие программы в системе не могли вызывать эффектор. Использование системы доверия, которая основывается на аутентификации на основе вызовов или асимметричном шифровании, означает, что вам больше не нужно беспокоиться об ограничении локального соединения.
Наконец, вам нужен четко определенный протокол, по которому пользовательский интерфейс и эффектор взаимодействуют.
Это намного сложнее, чем использование sudo, но более безопасно (например, sudo просто позволяет пользователям запускать определенные файлы в качестве другого uid - вы надеетесь, что файл содержит нужную программу).
У Setuid есть много тех же недостатков, что и у sudo, с дополнительным усложнением, заключающимся в том, что (в большинстве случаев), если он запускает другую программу - он будет делать то же, что и исходный uid.
НТН
С