Я пишу графический интерфейс веб-сайта для администрирования устройства сервера данных под управлением CentOS. Многие приборы делают это; Поставщик по существу создает графический интерфейс для изменения только определенных параметров конфигурации и блокирует все остальное. Но я почти уверен, что у меня проблемы с разрешениями, и я ищу самый безопасный способ сделать это. то есть кажется, что когда пользователь отправляет изменение имени хоста через графический интерфейс, команда shell_exec запускается как apache. Apache, вероятно, не имеет прав на изменение имени хоста, поэтому это не работает. Предоставление Apache этих прав может быть небезопасным, верно? Так в чем же решение? Как все поставщики устройств могут писать графические интерфейсы, которые меняют имена хостов, как они это делают (безопасно)?
Выдержки из кода:
<form action="Settings.php" method="get">
<div class="box">
<h1>Device Settings</h1>
Hostname: <input type="text" name="Hostname" label="Hostname" value="<?php echo $Hostname; ?>"><br />
<input type="submit" value="Set"><br />
</div>
</form>
$Hostname=shell_exec("hostname"); /*gethostname**/
if (isset($_GET['Hostname'])){
$Hostname=$_GET['Hostname'];
$output1=shell_exec("sudo hostname ". $Hostname. " 2>&1");*/
}
Конечно, небезопасно давать apache такие привилегии. В этом случае любой пользователь на этом сервере может запустить sudo и сделать то, что он хочет. Лучший способ — написать системный демон, управляемый с другого защищенного сервера.
Если вам нужно решение с одним сервером, вы можете запустить другой привилегированный Apache, который не обслуживает виртуальные хосты пользователя. Это будет намного безопаснее.
Я бы никогда не связал Apache напрямую с системными командами. Любое использование shell_exec()
следует считать запах кода. Я бы пошел на это, если бы ваш GUI ничего не делал, кроме сохранения его значений в каком-то простом непривилегированном хранилище, например, в файле JSON, сохраненном где-то в выделенном каталоге, или, возможно, в базе данных SQLite. Это устраняет необходимость предоставлять Apache какие-либо специальные разрешения и дает дополнительное преимущество, заключающееся в том, что вы можете сохранять несколько версий конфигурации с метками времени, что позволяет вам просто вернуться к любой предыдущей конфигурации в случае ошибки. Затем я бы создал отдельный процесс, не связанный с веб-службой, который читает конфигурацию и вносит соответствующие изменения на уровне системы. Только этот процесс требует повышенных разрешений, а не весь веб-сервер. Он может быть написан на любом языке, который вам нравится, и может быть выполнен вручную по желанию, как cron, который запускается с определенным интервалом, или как демон, который активно следит за изменениями.
Вы можете настроить sudo
чтобы разрешить выполнение всех команд, одну определенную команду или шаблон команды (также можно использовать регулярное выражение) от имени другого пользователя (например, www-данные, например) без запроса пароля.
Проверить руководство.