2016-04-03 5 views
1

Я использую Apache 2.4 на Ubuntu. Я написал один модуль на языке C и интегрировал его в сервер Apache с помощью инструментов расширения Apache (apxs). Есть часть моего кода, где я вызываю исполняемый файл с помощью функции exec, но я хочу назвать этот исполняемый файл суперпользователем. поэтому я хочу запустить свой модуль с привилегиями суперпользователя, но по умолчанию Apache работает как пользователь www-data и запрашивает пароль для www-данных.Как запустить модуль Apache с привилегиями суперпользователя?

Есть ли способ запустить этот модуль с использованием привилегий суперпользователя?

В противном случае есть ли другой способ запустить команду root в C внутри модуля Apache?

Можно ли использовать для этого модуль suExec?

+1

Почему бы просто не сделать root владельцем вызываемого исполняемого файла, а также сделать chmod u + s на исполняемом файле? Однако будьте осторожны при запуске двоичных файлов как root при вызове с веб-сервера, к которому любой сможет получить доступ! –

ответ

0

Нет, невозможно запустить модуль Apache под другим пользователем с самого сервера Apache. Но есть несколько стратегий для устранения этого ограничения.

1) Вы можете установить «setuid bit» на исполняемый файл, который требуется для запуска из Apache, как это:

chown root:root executable 
chmod 06755 executable 

Затем, когда вы запустите этот исполняемый файл (скажем, с fork + exec или с system) из модуля Apache, исполняемый файл будет запускаться из-под пользователя root, с правами root.

2) Вы можете настроить файл /etc/sudoers таким образом, чтобы www-данные могли запускать исполняемый файл с соответствующими привилегиями root с помощью команды sudo.

3) У вас может быть отдельный процесс, выполняющийся с привилегиями root и принимающими командами модуля Apache с любым видом IPC/RPC.

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

+0

Я применил второй вариант, и теперь он работает нормально –