LINUX.ORG.RU

Как выдать non-root юзеру возможность влиять на работу Nginx?

 , ,


0

1

Я решил добавить в Fluxbox отдельный раздел, в котором добавил два блока [exec] с названиями «Перезагрузить Энжиникс» и «Повалить Энжиникс». Проблема в том, что если кастовать nginx -s stop/reload, то ничего не произойдёт, потому что нерутованный юзер не может управлять процессами. Можно как-то это обойти? Не хочу постоянно вводить пароль от рута

P.S: Ни на каком сервере Энжиникс не хостится - это всё десктоп(лэптоп), причём 70% времени находящийся вне сети.



Последнее исправление: Tyse_EX (всего исправлений: 1)
Ответ на: комментарий от Dimez

sudo требует ввода пароля, чего совсем не хочется. Можно как-то вынести только Nginx на обычного юзера?

Tyse_EX
() автор топика
Ответ на: комментарий от Tyse_EX

Ты man sudo, man sudoers читал? Яндекс хотя бы пробовал спросить о том, как дать пользователю право без пароля определённые команды выполнять? В первых строчках ответы же. JFGI

mogwai ★★★★★
()
Последнее исправление: mogwai (всего исправлений: 1)
Ответ на: комментарий от Tyse_EX

Можно. Пишешь имя бинарника с нужными ключами и запускаешь.

mogwai ★★★★★
()
Ответ на: комментарий от Tyse_EX

пропиши в /etc/sudoers

%user%  ALL=(ALL) NOPASSWD: nginx -s stop
%user%  ALL=(ALL) NOPASSWD: nginx -s reload

и тогда %user% будет будет доступен беспарольных запуск под рутом только для двух данных строчек
$ sudo nginx -s stop
$ sudo nginx -s reload
все остальное будет по другому

ну и редактировать sudoers надо аккуратно. ибо может жопа произойти.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от Tyse_EX

Можно как-то вынести только Nginx на обычного юзера?

Можно, это обычная программа. Единственное что надо будет доделать - это разрешить ему случать 80/443 порты (по умолчанию это разрешено только руту).

setcap cap_net_bind_service=ep /usr/bin/nginx

отменить это разрешение так:

setcap -r /usr/bin/nginx
Вообще, такой способ не очень хорош в плане безопасности, но, поскольку на десктопе прослушивание портов угроз не несёт - не страшно. Это ограничение было сделано для многопользовательнских серверов чтобы какой-нить пользователь не захватил себе серверный порт веб-сервера.

nginx запускаешь так:

/usr/bin/nginx -c /путь/к/конфигу
выключаешь так:
/usr/bin/nginx -c /путь/к/конфигу -s stop
(или так) killall -9 nginx
перечитать конфиг так
/usr/bin/nginx -c /путь/к/конфигу -s reload
(или так) killall -HUP nginx

Конфиг надо будет скопировать из /etc/nginx (всю директорию) куда-нить себе в $HOME и заменить там некоторые пути (какое-нить /var/run/nginx.pid доступно только руту например - замени тоже на путь в $HOME). Да и вообще раз ты запускаешь nginx от своего юзера - конфиг удобнее редактировать тоже от него же без перелогина в рута.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от Tyse_EX

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

!!! тут заменяешь пути на другие если у тебя другие
#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload]\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Пути в define в начале ставишь те которые у тебя, но учти: в случае запуска nginx от рута конфиг тоже должен лежать у рута (т.е. например в /etc), иначе ты создашь очень плохую уязвимость по незапланированному повышению привилегий.

Компилируешь её и кладёшь на место (от рута):

gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего_юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit

Учти только что если у тебя nginx запускается из systemd то скорее всего start он будет делать ему сам автоматически и команда start отсюда всегда будет ругаться что он уже запущен. Можно отключить в systemd его целиком и тогда управление останется целиком у юзера (если надо).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)

Могу предложить запускать nginx через докер, а своего юзера добавить в группу docker.

dicos ★★☆
()
Ответ на: комментарий от dicos

Это хуже, чем sudo. sudo ещё как-то может ограничивать пользователя (хотя дыр не счесть). Дать доступ к докеру - значит, дать доступ ко всей системе.

Chiffchaff
()
Ответ на: комментарий от Chiffchaff

Явно речь идёт о рабочей станции и скорее всего @Tyse_EX является там единственным пользователем.

ugoday ★★★★★
()

Подними его в rootless докере, все в классе обзавидуются

Pierre_Dolle
()
Ответ на: комментарий от firkax

Ой, надо заменить

-  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
+  envp[0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
хотя вообще конкретно nginx-у пофиг на это

firkax ★★★★★
()
Ответ на: комментарий от Dimez

А да, про обновления то я забыл. Ну, вариантов много, выбирать автору.

firkax ★★★★★
()

У вас в Линуксах веб сервер от рута работает??? А я думал там о безопасности думают.

X512 ★★★★★
()
Ответ на: комментарий от X512

Нет, он работает от своего юзера, но запускалка рутовая.

firkax ★★★★★
()
Ответ на: комментарий от firkax

setcap

Хорошо бы где-то такого рода действия протоколировать, потому что через какое-то время напрочь забудешь о том, что и почему работает или не работает, и будешь долго разбираться…

yars068 ★★★★★
()

Интересные тут советы конечно. Sudo, полкит на сервере и т.п.

Делаешь демон, который выполняется от рута, читает пайп и запускает нужные команды.

Даёшь юзеру права на запись в этот пайп.

Lrrr ★★★★★
()

А почему бы и не запустить nginx прямо от пользователя, раз тебе е надо в сеть и это чисто для себя?

Aceler ★★★★★
()
Ответ на: комментарий от Lrrr

полкит на сервере

И флуксбокс :)

На ноутбуке же, я так понимаю для локальнотыканья вебни же.

frunobulax ★★★★
()
Ответ на: комментарий от Chiffchaff

Это хуже, чем sudo. sudo ещё как-то может ограничивать пользователя (хотя дыр не счесть). Дать доступ к докеру - значит, дать доступ ко всей системе.

А есть ли какой-то пример такой уязвимости, что запустил докер от локального юзера и, к примеру, отредактировал через него /etc/passwd?

dicos ★★☆
()
Ответ на: комментарий от dicos

А есть ли какой-то пример такой уязвимости, что запустил докер от локального юзера и, к примеру, отредактировал через него /etc/passwd?

$ docker run --rm -it -v /:/mnt thinca/vim
root> vim /mnt/etc/passwd
Chiffchaff
()
Ответ на: комментарий от paddlewan

Подозреваю, что это почти то же самое, что podman. И так же, как с podman, придётся возиться с capabilities, чтобы дать возможность nginx забиндиться на 80 порту.

Chiffchaff
()
Ответ на: комментарий от Dimez

Sudo плюс шаманство с башни. Приду домой напишу как на баше написать проброс команд в рут(требуется ввод пароля на старте)

ckotctvo
()
Ответ на: комментарий от Lrrr

Это на баше делается. Но именно на баше, он умеет в красоту

ckotctvo
()

Ну так запускай от своего пользователя, не совсем понятна сама проблема-то в чем? О_о

Anoxemian ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.