как мне заявить порт с низким номером как некорневой "правильный путь" - PullRequest
3 голосов
/ 04 апреля 2010

У меня есть скрипт, который я хочу запустить как демон, прослушивающий порт с низким номером (<1024) </p>

Скрипт написан на python, хотя ответы на Perl также приемлемы.

Скрипт демонизируется с использованием start-stop-daemon в скрипте запуска, что может усложнить ответ

Что я действительно ( думаю ) не хочу, так это набрать ps -few и увидеть, как этот процесс выполняется с "root" в его строке.

Как мне это сделать?

(с моей точки зрения «не совсем образованный о системных вызовах» я вижу 3 пути,

  1. Запустите сценарий от имени пользователя root (без --user / - group / - chuid to start-stop-daemon) и попросите деэскалацию своего пользователя после утверждения порта
  2. Установить root на сценарии (chmod u + s) и запустить сценарий от имени запущенного пользователя (через --user / - group / - chuid для start-stop-daemon, сценарий запуска по-прежнему должен называться root), в сценарии получить привилегии root, запросить порт и затем вернуться к обычному пользователю
  3. что-то еще, о чем я не знаю

)

Ответы [ 4 ]

2 голосов
/ 04 апреля 2010

На этой странице был какой-то код, который привел меня к этому, http://antonym.org/2005/12/dropping-privileges-in-python.html

Я полагаю, что установка umask необходима для завершения работы, это единственное, что, похоже, делает этот код, если мои попытки не были выполнены (я не уверен, какие настройки действительно делает umask, в контексте применения процесс)

Я немного порвал его пример, и, кроме того, эта страница с 2005 года, поэтому я публикую здесь свое рабочее решение,

def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name)[2]
    running_gid = grp.getgrnam(gid_name)[2]

    # Try setting the new uid/gid
    try:
        os.setgid(running_gid)
    except OSError, e:
        logging.error('Could not set effective group id: %s' % e)
        exit()

    try:
        os.setuid(running_uid)
    except OSError, e:
        logging.error('Could not set effective user id: %s' % e)
        exit()

    # Ensure a very convervative umask
    new_umask = 077
    old_umask = os.umask(new_umask)
    logging.info('drop_privileges: Old umask: %s, new umask: %s' % \
             (oct(old_umask), oct(new_umask)))

    final_uid = os.getuid()
    final_gid = os.getgid()
    logging.info('drop_privileges: running as %s/%s' % \
             (pwd.getpwuid(final_uid)[0],
              grp.getgrgid(final_gid)[0]))    
2 голосов
/ 04 апреля 2010

«Что-то, о чем вы не знаете» - это «возможности», но, как уже упоминалось, в других местах возможности не очень хорошо работают со сценариями, использующими метод Шебанга, поэтому здесь нет большого ответа,Я хотел бы пойти с методом «связать порт, затем отбросить привилегии».

1 голос
/ 04 апреля 2010

Вариант 1 - это маршрут Apache httpd. И если он достаточно хорош для самого популярного в мире веб-сервера, то стоит серьезно подумать о собственных демонах.

0 голосов
/ 04 апреля 2010

Вы можете установить библиотеку, которая, если LD_PRELOAD -ed, будет подделывать права root для любого исполняемого файла (сценария или иного): http://fakeroot.alioth.debian.org/

Установка разрешений на закрепление битов в скрипте (по крайней мере, по моему опыту) не будет иметь никакого эффекта; это двоичный интерпретатор ELF (/ usr / bin / python, / bin / sh, / usr / bin / perl и т. д.), для работы которого требуются липкие разрешения. Что вы можете сделать, это скопировать двоичный файл в другое место, установить на него закрепленный бит, а затем указать на него строку взрыва скрипта.

Если у вас нет доступа с правами root в системе, в которой вы выполняете, вы можете изменить настройки маршрутизатора, чтобы направить внешний порт <1024 на внутренний порт> = 1024.

РЕДАКТИРОВАТЬ: я забыл упомянуть этот маленький инструмент: redir . Это служба перенаправления локальных портов. Это даже дружественно к inetd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...