Как запустить конкретную программу от имени пользователя root без запроса пароля?

170

Мне нужно запустить что-то как sudo без пароля, поэтому я использовал visudoи добавил это в свой sudoersфайл:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Тогда я попробовал это:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Почему он спрашивает пароль? Как я могу запускать / использовать команды от имени пользователя root без пользователя root, не спрашивая пароль?

LanceBaynes
источник

Ответы:

91

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

Сделав это, sudoбудет запрашивать пароль, как правило, для всех команд, кроме /path/to/my/program, который он всегда позволит вам работать без запроса пароля.

Уоррен Янг
источник
6
Будет ли это работать, если бы /path/to/my/programбыл сценарий Python?
sadmicrowave
Может ли программа вместо этого быть псевдонимом, установленным для bash (т.е. в .bashrc)? Или даже сценарий оболочки внутри /usr/local/sbin? Попробовать.
Никос Александрис
Никос - нет, это не может быть псевдоним. Это должно указывать на реальный путь.
Пол Хеддерли
sudoers? где? умею использовать ваш ответ (
Василий Суриков
@VasiliiSuricov: Обычно он есть /etc, но некоторые системы помещают его в другое место. Если вы не можете его найти, попробуйте man sudoers. Локальное местоположение для этого файла должно быть подставлено в manстраницу во время создания sudoэтой системы.
Уоррен Янг
135

Если есть несколько совпадающих записей /etc/sudoers, sudo использует последнюю. Поэтому, если вы можете выполнить какую-либо команду с запросом пароля, и вы хотите иметь возможность выполнить определенную команду без запроса пароля, вам понадобится последнее исключение.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Обратите внимание на использование (root), чтобы позволить программе запускаться от имени пользователя root, но не от имени других пользователей. (Не предоставляйте больше разрешений, чем требуется минимум, если вы не продумали последствия.)

Примечание для читателей, которые не используют Ubuntu или которые изменили конфигурацию sudo по умолчанию (sudo в Ubuntu по умолчанию приемлемо) : запускать сценарии оболочки с повышенными привилегиями рискованно, вам нужно начинать с чистой среды (после запуска оболочки, слишком поздно (см. Разрешить setuid для сценариев оболочки ), поэтому вам нужно sudo, чтобы позаботиться об этом). Убедитесь , что у вас есть Defaults env_resetв /etc/sudoersили что этот параметр во время компиляции по умолчанию ( sudo sudo -V | grep envдолжен включать Reset the environment to a default set of variables).

жилль
источник
3
ex, чтобы получить root от jhon с sudo su без прохода -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
5
@adrian Если вы хотите разрешить произвольные команды от имени root, сделайте это john ALL=(ALL) NOPASSWD: all. Нет смысла проходить через su.
Жиль
Вопрос: я должен изменить разрешения моего сценария оболочки так, чтобы он мог быть изменен и прочитан только пользователем root, для безопасности? Я думаю о том, как злоумышленник модифицирует скрипт, который имеет все разрешения, предоставленные без необходимости ввода пароля, чтобы он делал то, что он / она хочет. Очевидно, что злоумышленник не может даже прочитать файл sudoers, чтобы узнать, какие сценарии имеют эту привилегию, но он все равно может попробовать все мои пользовательские сценарии, как только найдет папку, в которой они хранятся, в надежде, что некоторые из них разрешены или что-то в этом роде. ,
Джеффри Лебовски
1
@JeffreyLebowski Если у вас есть правило sudo, которое запускает сценарий (прямо или косвенно), тогда крайне важно, чтобы только root (или люди, которые в любом случае имели права root) могли писать в файл сценария и в каталог, содержащий файл сценария, и его родительский каталог и так далее. Не имеет значения, что кто-либо может прочитать файл сценария (если он не содержит пароль или что-то еще, но это плохая идея, если пароль есть в его собственном файле, в противном случае существует слишком большой риск случайной утечки, например, путем скопируйте этот раздел кода в вопросе на этом сайте).
Жиль
1
@alper Нет. Очень немногие вещи требуют перезагрузки. После изменения sudoersвам не нужно делать ничего особенного: sudoпроверяйте это каждый раз.
Жиль
24

ВНИМАНИЕ : Этот ответ считается небезопасным. Смотрите комментарии ниже

Полное решение: следующие шаги помогут вам достичь желаемого результата:

  1. Создайте новый файл скрипта (замените его create_dir.shна желаемое имя скрипта):

    vim ~/create_dir.sh
    

    Скрипт будет создан в домашнем каталоге пользователя

  2. Добавьте некоторые команды, которые может выполнять только пользователь rootили, sudoнапример, создав папку на уровне корневого каталога:

    mkdir /abc
    

    Примечание: не добавляйте sudoк этим командам. Сохранить и выйти (используя :wq!)

  3. Назначьте ему разрешения на выполнение, используя:

    sudo chmod u+x create_dir.sh
    
  4. Внесите изменения, чтобы этот скрипт не требовал пароля.

    1. Откройте sudoersфайл:

      sudo visudo -f /etc/sudoers
      
    2. Добавьте следующую строку в конце:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Замените ahmadна то, что ваше имя пользователя. Также убедитесь, что это последняя строка. Сохранить и выйти.

  5. Теперь при запуске команды добавьте sudoперед этим:

    sudo ./create_dir.sh
    

    Это запустит команды внутри файла скрипта без запроса пароля.

Следуйте простым шагам, упомянутым здесь http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

М. Ахмад Зафар
источник
Было бы лучше, если бы вы предоставили соответствующие шаги здесь и использовали ссылку в качестве резервной копии для получения более подробной информации. Таким образом, ваш ответ сохраняет возможное значение, даже если эта ссылка больше не будет действительной.
Anthon
15
Этот совет небезопасен. Эта sudoчасть sudo chmod u+x create_dir.shне нужна, поскольку пользователь (предположительно) владеет своим домашним каталогом. Поскольку пользователь может писать create_dir.sh, вы фактически предоставили ему бесплатную корневую оболочку.
Лекенштейн
1
@Lekensteyn Это также означает, что любая программа работает от имени пользователя. Можно просто позволить пользователю запускать что-либо с помощью sudo без пароля.
pydsigner
2
Я что-то пропустил? Я считаю, что все chmodэто не нужно, поскольку вы полагаетесь на sudoповышение своих привилегий.
G-Man
10

Я думаю, что ваш синтаксис неправильный. По крайней мере, я использую следующее, которое работает для меня:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
Musikk
источник
6
Эта (ALL)часть является необязательной, оставляя ее, имеет точно такой же эффект. Иметь (root)было бы лучше, но его отсутствие не объясняет проблему.
Жиль
+1 за sudo для этой команды и ничего больше! Нет причин ломать всю систему ...
Йохан,
3
@Johan: Это уже было в вопросе.
Жиль
5

Если вы хотите избежать необходимости использовать sudo или изменять конфигурационный файл sudoers, вы можете использовать:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Это заставит команду работать от имени пользователя root без необходимости использования sudo.

linuxgnuru
источник
Ничего себе, я никогда не слышал об этом решении прежде, ошеломляющее
кое-что
Почему мне нужно прокрутить до конца эти вещи, чтобы найти лучший ответ? Спасибо за это простое безопасное решение.
RyanNerd
5

Если у вас есть дистрибутив, такой как Manjaro, вы должны сначала иметь дело с файлом, который переопределяет определение / etc / sudoers, вы можете удалить его или работать непосредственно с этим файлом, чтобы добавить свои новые конфигурации.

Этот файл:

sudo cat /etc/sudoers.d/10-installer

ЕДИНСТВЕННЫЙ способ увидеть, что он находится под привилегиями root, вы не можете перечислить этот каталог без него, этот файл специфичен для Manjaro, вы можете найти эту конфигурацию с другим именем, но в том же каталоге.

В выбранном вами файле вы можете добавить следующие строки, чтобы получить желаемую конфигурацию (и):

Игнорировать аутентификацию для группы

%group ALL=(ALL) NOPASSWD: ALL

или игнорировать аутентификацию для пользователя

youruser ALL=(ALL) NOPASSWD: ALL

или игнорировать аутентификацию исполняемого файла для конкретного пользователя

youruser ALL=(ALL) NOPASSWD: /path/to/executable

БЫСТРОЕ ПРИМЕЧАНИЕ: Вы открываете дверь для использования SUDO без аутентификации, это означает, что вы можете запускать все, что изменяет все из вашей системы, и использовать это с ответственностью.

Lyoneel
источник
4

Убедитесь, что у sudo нет псевдонимов. Беги так

/usr/bin/sudo /path/to/my/program

Например псевдоним оболочки, как этот:

alias sudo="sudo env PATH=$PATH"

может вызвать это поведение.

Sepero
источник
Вы правы, мой комментарий был из того здесь , извините за это. Тем не менее, я заинтригован - как вы ожидаете, что aliasing изменит обработку sudoersby sudo. Или вы говорите о перенаправлении sudoна что-то, что всегда печатает это сообщение об ошибке, чтобы выкопать пароли? Это маловероятно, здесь ...
Петер
2
У меня была та же проблема, что и у ОП. Это оказалось вызвано тем, что alias sudo="sudo env PATH=$PATH"у меня ~/.bashrc. Вместо того, чтобы просто решать это для себя и слепо заниматься своими делами, я представил свой ответ как возможное решение для всех, кто придет по этой теме.
Сеперо
1
Это хорошо, но когда это неочевидно (что в данном случае не так, по крайней мере, для некоторых людей), хорошо добавить объяснение в ответ, чтобы обеспечить некоторый контекст и не дать людям слепо использовать магические заклинания. +2 (- (- 1) + +1). :)
Петер
2

Когда вы выполняете свой скрипт, вам нужно запустить его как sudo /path/to/my/script.

Изменить: на основе вашего комментария к другому ответу, вы хотите запустить это из значка. Вам нужно будет создать .desktopфайл, который выполняет вашу программу с помощью sudo, как в терминале.

Вы также можете рассмотреть возможность использования gtk-sudoдля визуального запроса пароля.

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

Калеб
источник
7
Не делайте сценарии оболочки setuid . См. Разрешить setuid для сценариев оболочки .
Жиль
Я даже не упомянул об этом, потому что это плохой вариант. Я просто удалил его, потому что боюсь, что этот спрашивающий может использовать этот совет даже с предупреждением, что это плохой совет!
Калеб
2

Это решило проблему для меня (также попробовал некоторые другие ответы, которые могли бы помочь):

Сценарий, в который я звонил, находился в /usr/binкаталоге, к которому у меня нет прав записи (хотя я обычно могу читать любые файлы там). Сценарий был chmodded + x (исполняемый файл permisison), но он все еще не работал. Переместив этот файл по пути в моем домашнем каталоге, вместо этого /usr/binя наконец смог вызвать его с помощью sudo без ввода пароля.

Также кое-что, в чем я сомневался (уточняю для будущих читателей): вам нужно запустить свой скрипт как sudo. Введите sudoпри вызове сценария. Не используйте sudoдля команды в вашем скрипте, которая на самом деле нуждается в root (в моем случае это изменение подсветки клавиатуры). Возможно, это тоже работает, но вам не нужно, и, кажется, лучшее решение не делать этого.

Люк
источник
Во втором абзаце был ответ на мою проблему
М. Ахмед Зафар
@MuhammadAhmadZafar Рад, что это помогло!
Люк
4
На самом деле использование sudoвнутри скрипта прекрасно, если у вас есть соответствующие права (настроенные sudoers) для запуска рассматриваемой команды без пароля. Это делает вещи немного более безопасными.
Петер
мог бы действительно использовать этот ответ, переписанный как пошаговое «вот как вы это делаете», а не как диалог с другими ответами
Walrus the Cat
@WalrustheCat Хороший вопрос. Перечитывая мой ответ, я думаю, что, возможно, сам немного смутился. Хотя сейчас я не помню, какова была точная ситуация, поэтому я не могу лучше написать. Если вы выясните это, возможно, сочетание нескольких ответов, непременно отправьте новый ответ!
Люк
1

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

super /path/to/your/script

Если вы хотите запустить некоторый двоичный исполняемый файл (например , что вы скомпилирован в ELF двоичном из некоторого исходного кода C) -Какой это не script- как корень, вы можете рассмотреть возможность сделать это УИП (а на самом деле /bin/login, /usr/bin/sudoи /bin/suи superвсе используют эту технику ). Однако будьте очень осторожны, вы можете открыть огромную дыру в безопасности .

Конкретно, ваша программа должна быть параноически закодирована (поэтому проверяйте все аргументы, а также условия и внешние условия перед тем, как «действовать», предполагая потенциально враждебного пользователя), тогда вы можете осторожно использовать seteuid (2) и друзей (см. Также setreuid (2) ) (см. также возможности (7) и учетные данные (7) и execve (2) ...)

Вы будете использовать chmod u+s(читайте chmod (1) ) при установке такого двоичного файла.

Но будь очень осторожен .

Прочитайте много вещей о setuid , включая Advanced Linux Programming , прежде чем писать такие вещи.

Обратите внимание на то, что сценарий, или любой притон -ed вещь, не может быть УИП. Но вы можете закодировать (в C) небольшую setuid-двоичную оболочку.

Василий Старынкевич
источник
0

В идеале, если вы настраиваете, какие команды можно запускать через, sudoвы должны вносить эти изменения в отдельный файл, /etc/sudoers.d/а не редактировать sudoersфайл напрямую. Вы также должны всегда использовать visudoдля редактирования файла (ов). Вы никогда не должны давать NOPASSWDна ALLкоманды.

Пример: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Вставьте свою строку, предоставив разрешение: myuser ALL= NOPASSWD: /path/to/your/program

Затем сохраните и выйдите, и visudoпредупредит вас, если у вас есть какие-либо синтаксические ошибки.

Вы можете запустить, sudo -lчтобы просмотреть разрешения, которые были предоставлены вашему пользователю, если какая-либо из пользовательских NOPASSWDкоманд появляется перед любой %groupyouarein ALL=(ALL) ALLкомандой в выходных данных, вам будет предложено ввести пароль.

Если вы обнаружите, что создаете много этих файлов sudoers.d, то, возможно, вы захотите создать их по имени для каждого пользователя, чтобы их было проще визуализировать. Имейте в виду, что порядок ИМЕН ФАЙЛОВ и ПРАВИЛ в файле очень важен, выигрывает ПОСЛЕДНЯЯ загрузка, независимо от того, разрешено ли оно БОЛЕЕ или МЕНЬШЕ, чем предыдущие записи.

Вы можете управлять порядком имен файлов, используя префикс 00-99 или aa / bb / cc, хотя также имейте в виду, что если у вас есть ЛЮБЫЕ файлы без числового префикса, они будут загружаться после пронумерованных файлов, переопределяя настройки. Это связано с тем, что в зависимости от ваших языковых настроек в «лексической сортировке» оболочка сначала использует числа сортировки, а затем может перемежать прописные и строчные буквы при сортировке в «возрастающем» порядке.

Попробуйте запустить printf '%s\n' {{0..99},{A-Z},{a-z}} | sortи printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortпосмотреть, печатает ли ваш текущий язык и AaBbCcт. Д., Или ABCзатем abcопределить, какой будет наилучший префикс «последней» буквы.

dragon788
источник
0

Чтобы позволить любому пользователю запускать программу как sudo без запроса пароля, вы можете добавить следующую строку

%sudo ALL=(root) NOPASSWD: /path/to/your/program

в /etc/sudoers

Обратите внимание, что % sudo делает это.

ultimatex
источник
Хотя это один из способов выполнения правила sudo, он не отвечает на вопрос о том, почему установка флага NOPASSWD для этого правила все же вызвала запрос пароля. Посмотрите принятый ответ для идеи, почему это произошло.
Джефф Шаллер
0

Следующее относится к случаю, когда вы хотите выполнить команду без пароля, только если она имеет определенный набор параметров, где часть параметров является переменной . AFAIK невозможно использовать переменные или диапазоны значений в объявлениях sudoers, т.е. вы можете явно разрешить доступ, command option1но не command option2используя:

user_name ALL=(root) /usr/bin/command option1

но если структура command option1 value1, где value1могут варьироваться, вам нужно будет иметь явную sudoers линию для каждого возможного значения value1. Сценарий оболочки предоставляет способ обойти это.

Этот ответ был вдохновлен ответом Ахмада Зафара и устраняет проблему безопасности.

  1. Создайте сценарий оболочки, в котором вы вызываете команду без sudo.
  2. Сохраните сценарий в папке с правами суперпользователя (например /usr/local/bin/), сделайте файл корневым (например chown root:wheel /usr/local/bin/script_name) без прав на запись для других (например chmod 755 /usr/local/bin/script_name).
  3. Добавьте исключение для sudoers, используя visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name,

  4. Запустите ваш скрипт sudo script_name.

Например, я хочу изменить время ожидания для отображения в macOS. Это делается с помощью:

sudo pmset displaysleep time_in_minutes

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

Итак, у меня есть следующий скрипт /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

В конце sudoersфайла у меня есть следующая строка:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Чтобы установить тайм-аут на 3 минуты, я запускаю свой скрипт из учетной записи обычного пользователя user_name:

sudo ds 3

PS Большая часть моего сценария является проверкой ввода, которая не является обязательной, поэтому также будет работать следующее:

#!/bin/bash
pmset displaysleep $1 
Коит Сааревет
источник