Подтвердить что ты не робот

Есть ли способ запустить/перезапустить/остановить сервер apache в Linux как пользователь без полномочий root?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

Если вы не хотите выдавать доступ к 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";

Затем скомпилируйте и измените разрешения с помощью

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

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

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

Ответ 6

Две проблемы, о которых я могу думать, нужно преодолеть:

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

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

Ответ 7

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

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

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

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

Ответ 8

Вы можете "setuid" разрешить пользователям без полномочий root запускать apachectl как root (без проверки подлинности как root).

Пример

Изменить: следует упомянуть, что вам нужен root-доступ, чтобы установить это в первую очередь: -)

Ответ 9

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

Ответ 10

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

Ответ 11

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