2009-02-08 10 views
17

Хотелось бы узнать, возможно ли для пользователя без полномочий root использовать Linux (я использую openSUSE) для запуска apache без использования команды sudo. Учтите, что пользователь находится в той же группе, что и apache (wwwrun).
Спасибо заранее.Есть ли способ запустить/перезапустить/остановить сервер apache на linux как пользователь без полномочий root?

+0

ЕСЛИ Я знал, что я отвечу, но вместо этого я скажу вам, что это не вопрос программирования :) Серьезно, однако, я не знаю ответа. На самом деле это отличный вопрос. –

+1

Спасибо и да, я не был уверен, подходит ли этот вопрос в программировании, однако я попробовал :). – Adriana

+4

Возможно, это связано с программированием, поскольку, по моему опыту, самая распространенная причина для этого, заключается в том, что программист может более легко перезапустить apache в своей коробке разработки. –

ответ

3

Проблемы, отмеченные выше benlumley, то есть файлы журнала и зарезервированные порты, могут быть легко преодолены путем настройки каталога журнала и порта в вашем httpd.conf.

+2

Нет ограничений доступа к привилегированным портам без привилегированных аксессуаров. – kmkaplan

+0

«Настройка порта ... в вашем httpd.conf» - это способ ограничения привилегированных портов, так как вы можете выбрать не-привилегированный порт для прослушивания. –

+0

О, хорошо, я не понял, что нестандартный порт подойдет perfectDay. – kmkaplan

1

две проблемы, которые я могу думать о том, что вам необходимо преодолеть, являются:

  1. Права доступа к файлам журнала - это вполне может быть уже установлен, чтобы позволить wwwrun получить к ним доступ, но часто является проблемой.

  2. Пользователи без прав доступа к привилегированному порту (80) - не уверены, что/как вы можете это изменить.

10

Вы можете запускать Apache как любой пользователь. Просто убедитесь, что он настроен только на использование разрешенных ресурсов (каталогов, файлов и, самое главное, прослушивания на не привилегированном порту).

Чтобы он отображался на стандартном порту HTTP 80 (который является привилегированным), вам нужно будет установить как root перенаправление на ваш настоящий сервер Apache. Самый простой способ - использовать iptables. Например, если ваш сервер Apache прослушивает порт 8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080 

Если вы не можете настроить сервер так (или ваш сисадмин сделать это один раз для всех), вы должны будете использовать не привилегированный порт (что-то как Listen 8080) и доступ к нему с помощью URL, который выглядит как http://www.example.com:8080/

+0

Проблема в том, что я не могу стать root, поэтому я ищу способ преодолеть все, что нужно сделать как root. Но спасибо за ваш ответ. – Adriana

0

Я думаю, вы должны быть в состоянии сделать это путем предоставления выполнить доступ к группе, владеющей управляющую программу Apache (например, «CHMOD г + х apachectl»). Если это не работает само по себе, попробуйте также установить бит SUID владельца в программе (что-то вдоль строк «chmod u + s apachectl»).

Первый шаг позволяет пользователям вашей группы wwwrun выполнить программу apachectl. Второй шаг делает так, что когда группа запускает программу, она запускается с привилегиями владельцев программ.

Сообщите мне, если это работает, я немного ржавый с выполнением файла SUID, но я могу помочь изучить его дальше, если у вас все еще есть проблемы.

Убедитесь, что вы понимаете последствия установки бит SUID, прежде чем делать это.

5

Короткий ответ: Нет

Причина этого является то, что только корень может связать порты ниже 1024.

Длинный ответ: проверить http://www.debian-administration.org/articles/386

После преодоления проблемы с портами, я не думаю, что будет больше неприятностей. Просто помните, что пользователь, которому выполняется apache, должен иметь доступ на запись к файлам журнала и, возможно, некоторые другие файлы.

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

Но по какой причине вы не хотите запускать sudo?Процесс запуска выполняется только как root, остальные выполняются под пользователем apache.

0

Вы можете «setuid», чтобы позволить пользователям, не являющимся root, запускать apachectl как root (без аутентификации под root).

Example

Edit: Следует отметить, что вам требуется корневой доступ, чтобы установить это в первую очередь :-)

+0

Я думал то же самое.Пробовал это, и он не летает. (13) Разрешено: make_sock: не удалось привязать к адресу [::]: 80 (13) Разрешение отклонено: make_sock: не удалось привязать к адресу 0.0.0.0:80 –

+0

Моя ошибка - setuid обычно игнорируется для сценариев оболочки (по соображениям безопасности). Проверьте ответ Эмануэля. – Nick

+0

Ответ Эмануэля действительно летает. –

5

Если Sudo установлен, вы можете создать файл: /etc/suduers.d/apache2reload со следующим содержанием:

username ALL=NOPASSWD:/usr/bin/service apache2 reload 
+0

Не сделал бы этого. Не могу понять, почему так много людей разместили этот вариант. По умолчанию, как только вы выполняете команду sudo, вам не нужно вводить пароль для запуска другой команды sudo, тем самым предоставляя им бесплатный root-доступ. – dtc

+0

Это не было «по умолчанию» для двух систем, которые я только что попробовал (Ubuntu 14.04, SLES 11) - стоит проверить себя. – Nick

+0

Правильный ответ. Изменение пользовательского apache выполняется как (обычно это не root), не имеет значения. Возражение @ dtc основано на непонимании о том, как работает sudoers conf. – jwg

0

вы можете просматривать свои привилегии с SUDO -l, отсюда вы можете обнаружить, что у вас есть доступ к команде повторного запуска, но, возможно, не запускать и останавливать.

0

Некоторые ссылки, которые я нашел, дали для этого наиболее полезный ответ. Технически, он по-прежнему действует как root, но вы можете chmod u + s файлы apache2 и apache2ctl (если вы также используете второй). Это позволяет вам запускать их с правами root, но все равно быть пользователем, который имеет те же права доступа, сохраняя целостность системы (если apache или apache2ctl не будут делать более сумасшедшие вещи, которые, я сомневаюсь, что они есть).

-1

вы можете использовать супервизора для запуска Апач

3

Если вы не хотите выдавать доступ SUDO, вы также можете создать Setuid программу-оболочку. Например:

httpdctrl.c

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
#include <strings.h> 

// allow start/stop/restart of apache by non-root users 

int main(int argc, char **argv) 
{ 
    char *cmd, *cmd2, *usage; 

    // UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 
    cmd2 = "apachectl"; 
    usage = "Usage: COMMAND [start|stop|restart]\n"; 

    if (argc != 2) { 
    printf(usage); 
    exit(1); 
    } 

    setegid(0); 
    seteuid(0); 
    setgid(0); 
    setuid(0); 

    if (strncmp(argv[1], "start", 5) == 0) { 
    if (execl(cmd, cmd2, "start", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "stop", 4) == 0) { 
    if (execl(cmd, cmd2, "stop", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "restart", 7) == 0) { 
    if (execl(cmd, cmd2, "restart", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else { 
    printf(usage); 
    exit(1); 
    } 
    exit(0); 
} 

Обновление путь по адресу:

// UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 

Затем компилировать и изменить permisions с

gcc -o httpdctrl httpdctrl.c 
sudo chown root:root httpdctrl 
sudo chmod u+s httpdctrl 

Теперь httpdctrl принадлежит корню, и setuid будет запускать его как root.

ВАЖНО: Убедитесь, что скрипт начала/остановки и все родительские директории принадлежат также и root. Также удалите доступ для записи к файлам и dirs для «other». В принципе, вы не хотите, чтобы кто-то мог редактировать или изменять файлы/файлы, которые выполняются с помощью root.

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

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