3

Как запустить определенную программу с правами суперпользователя (ОС Ubuntu), когда в систему не вошел ни один пользователь sudo? Программа нуждается в привилегиях суперпользователя для правильной работы. Обычный пользователь не должен быть в состоянии остановить этот процесс. Например, у меня есть два пользователя, Admin и Client; Программа должна запускаться только тогда, когда клиент входит в систему. Ему нужны привилегии суперпользователя, и клиент не должен быть в состоянии остановить этот процесс.

2 ответа2

7

Есть несколько способов сделать это. Графический вход в Ubuntu обеспечивается GDM (или KDM, если вы используете Kubuntu). GDM запускается подсистемой Upstart.

Процесс запуска выполняется следующим образом:

  1. Системные ботинки. Upstart запускает службы, включая GDM (/etc/init/gdm).
  2. GDM запускается, инициализирует X-сервер (/etc/gdm/Init/*) и представляет окно входа в систему с графическим интерфейсом.
  3. Пользователь входит в систему.
    1. Происходит авторизация PAM (/etc/pam.d/gdm)
    2. GDM запускает скрипт PostLogin (/etc/gdm/PostLogin/*).
    3. GDM запускает скрипт PreSession (/etc/gdm/PreSession/*).
    4. GDM запускает скрипты Xsession и xinit
      (/etc/gdm/Xsession, /etc/X11/xinit/xinitrc.d/*, /etc/X11/Xsession, /etc/X11/Xsession.d/*)
  4. Появится рабочий стол пользователя.

Где запустить свой скрипт

Все до XSession запускается как root. /etc/gdm/Xsession и все остальное после запуска от имени пользователя. Это оставляет вам три реальных варианта, где запустить ваш скрипт.

  1. Измените сценарии GDM/KDM PostLogin или PreSession для запуска вашей программы. Имя пользователя доступно в переменных среды USER или USERNAME.

  2. Используйте PAM для выполнения вашего скрипта. PAM установит авторизующего пользователя в переменную окружения PAM_USER . Добавьте это в /etc/pam.d/gdm, чтобы запустить ваш скрипт:

    auth  required  pam_exec.so   /path/to/your/script
    
    • Возможно, вы сможете использовать PAM для сопоставления с конкретным пользователем (как в этом ответе), поэтому сценарий будет запускаться только для этого пользователя и не должен будет сопоставлять пользователей сам. У меня нет опыта PAM, чтобы объяснить, как это сделать.

  3. Напишите скрипт Upstart для запуска вашей программы. Ваш скрипт будет запускаться при входе пользователя в систему, поэтому мы ищем сигнал запуска сеанса рабочего стола , генерируемый скриптом PreSession GDM.

    Таким образом, скрипт Upstart определит этот сигнал как триггер запуска:

    # start when GDM's PreSession script runs
    start on desktop-session-start
    

    Сигнал от PreSession не передается по имени пользователя, поэтому вам нужно настроить сигнал. В /etc /gdm /PreSession /Default найдите строку initctl и измените ее на эту. Вы также можете использовать USERNAME вместо USER.

    # add USER variable so Upstart script can find it
    initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
    

    Посмотрите man-страницы для Upstart и его стартового события для более подробной информации.


Как избежать пользователя Admin

Ваш сценарий должен проверить имя пользователя / пользователя в переменных среды, которые он получает от одного из этих методов, и использовать его, чтобы определить, следует ли прервать или продолжить. Стандартные методы сценариев оболочки будут работать. В зависимости от того, какое начальное местоположение вы выбрали из приведенного выше списка, имя пользователя может быть доступно в переменных среды USER, USERNAME или PAM_USER .

1

Вы можете использовать setuid, чтобы всегда запускать программу от имени пользователя root. С точки зрения безопасности, это, вероятно, очень, очень плохая идея. Если одному из ваших пользователей удалось использовать программу setuid, он предоставит им root-доступ ко всему серверу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .