LINUX.ORG.RU
решено ФорумAdmin

dnf NOPASSWD в sudoers

 , ,


0

1

Добрый день.

Хочу некоторые частые операции с пакетным менеджером выполнять без пароля:

# cat /etc/sudoers.d/40-nopasswd

%wheel ALL = NOPASSWD: /usr/sbin/iotop-c, /usr/sbin/iotop

%wheel ALL = NOPASSWD: /usr/sbin/nethogs

%wheel ALL = NOPASSWD: /usr/sbin/iftop

%wheel ALL = NOPASSWD: /usr/bin/mount

# restart tor service
%wheel ALL = NOPASSWD: /usr/bin/systemctl restart tor.service

# dnf
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly search
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly provides
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly list installed
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repolist
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --list
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly history list --reverse
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly history info
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --requires --resolve
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly info

Все, что до # dnf – пароль не требует. search, history info, info (те команды, что требуют рут) пароль требуют. Пользователь конечно в группе wheel. Ну и с синтаксисом должно быть все в порядке, т.к. iotop, nethogs, iftop, systemctl restart требуют рут для работы, но с этими строчками в sudoers.d пароль не просят. Помогите Даже разобраться.

Имя файла пробовал менять на abc – результат тот же (оказывается файлы с точкой в имени не работают в sudoers.d (например что-то типа user.nopasswd).

В /etc/sudoers ничего не менял. Дистрибутив Fedora 34.

Ну и

User USER may run the following commands on PECKA:
    (ALL) ALL
    (root) NOPASSWD: /usr/sbin/iotop-c, /usr/sbin/iotop
    (root) NOPASSWD: /usr/sbin/nethogs
    (root) NOPASSWD: /usr/sbin/iftop
    (root) NOPASSWD: /usr/bin/mount
    (root) NOPASSWD: /usr/bin/systemctl restart tor.service
    (root) NOPASSWD: /usr/bin/dnf --cacheonly search
    (root) NOPASSWD: /usr/bin/dnf --cacheonly provides
    (root) NOPASSWD: /usr/bin/dnf --cacheonly list installed
    (root) NOPASSWD: /usr/bin/dnf --cacheonly repolist
    (root) NOPASSWD: /usr/bin/dnf --cacheonly repoquery --list
    (root) NOPASSWD: /usr/bin/dnf --cacheonly history list --reverse
    (root) NOPASSWD: /usr/bin/dnf --cacheonly history info
    (root) NOPASSWD: /usr/bin/dnf --cacheonly repoquery --requires --resolve
    (root) NOPASSWD: /usr/bin/dnf --cacheonly info

★★★★★

Последнее исправление: Im_not_a_robot (всего исправлений: 2)

Буквально на днях тоже самое делал, надоело pacman, fdisk -l, fbgrab и всему такому пароль вводить. Вот так у меня:

user ALL=(ALL) NOPASSWD: /usr/lib/openrc/bin/reboot, /bin/fdisk, /bin/pacman, /bin/fbgrab

Но я wheel не пользуюсь, просто юзера прописываю. На 99,9% уверен, что с wheel будет тоже самое.

UPD2 Я не правильно написал, та строка вообще тебе судо для всего, кроме этих команд вырубит (но они пароль просить не будут, да). Чтоб работало, нужны две строки, та, что выше, и сверху над ней вот такая:

user ALL=(ALL) ALL

Вместо юзер также можно %wheel или любую другую группу. Она дает юзеру (или группе) доступ ко всем командам через судо (а можно,например, запретить некоторые - то есть, чтобы определенные пользователи могли делать любые команды с судо, кроме указанных явно).

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

У меня написано тоже самое, кроме (ALL) – насколько я понимаю, эта часть необязательная. Есть подозрения, что конкретно dnf в Федоре настроен по хитрому.

Im_not_a_robot ★★★★★
() автор топика

Попробуй команды с параметрами

комманд --параметр

Взять в ковычки.

Ещё ты можешь написать скрипты в которых прописать нужную тебе команду и уже эти скрипты разрешить вызывать через sudo.

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

Т.е. комманд --параметр комманд -а

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

Я про это в курсе, они у меня одинаково вызываются через алиасы:

$ cat ~/.zshrc | grep dnf.
230:alias dnf.upgrade="sudo dnf upgrade --assumeyes && flatpak update --assumeyes && yt-dlp -U"
231:alias dnf.install="sudo dnf install"
232:alias dnf.remove="sudo dnf remove"
233:alias dnf.search="sudo dnf --cacheonly search"
234:alias dnf.provides="sudo dnf --cacheonly provides"
235:alias dnf.list_installed="sudo dnf --cacheonly list installed"
236:alias dnf.repolist="sudo dnf --cacheonly repolist"
237:alias dnf.list_package_files="sudo dnf --cacheonly repoquery --list"
238:alias dnf.history_list="sudo dnf --cacheonly history list --reverse"
239:alias dnf.history_info="sudo dnf --cacheonly history info"
240:alias dnf.requires="sudo dnf --cacheonly repoquery --requires --resolve"
241:alias dnf.info="sudo dnf --cacheonly info"

Кроме того, iotop-c, nethogs, systemctl restart tor.service требуют рут, вызываются точно так же, как dnf и все работает.

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

Обязательная, я не написал случайно в первый раз и не работало нифига. И два вопроса, почему /etc/sudoers.d а не /etc/sudoers? И нафига на каждую команду строчку говордить? А, и у тебя там команды с опциями, попробуй в кавычки взять. А еще может быть, что через sudoers можно выключить пароль только к вызову бинарника как такового, безотносительно опций.

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

Как вариант для установки пакетов можно еще PackageKit использовать.

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

В любом случае:

%wheel ALL=(ALL) NOPASSWD: /usr/bin/dnf --cacheonly search

Все равно просит пароль.

С кавычками нельзя:

40-nopasswd:14:60: syntax error
%wheel ALL=(ALL) NOPASSWD: "/usr/bin/dnf --cacheonly search"
                                                           ^
What now? e
Im_not_a_robot ★★★★★
() автор топика
Последнее исправление: Im_not_a_robot (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это мало-того что не бинарник, это еще и символическая ссылка на скрипт /usr/bin/dnf-3:

from __future__ import unicode_literals
import sys


def suppress_keyboard_interrupt_message():
    """Prevent unsightly KeyboardInterrupt tracebacks.

    Nothing will be printed to the terminal after an uncaught
    :class:`exceptions.KeyboardInterrupt`.

    """
    old_excepthook = sys.excepthook

    def new_hook(type, value, traceback):
        if type != KeyboardInterrupt:
            old_excepthook(type, value, traceback)
        else:
            pass

    sys.excepthook = new_hook


# do this ASAP to prevent tracebacks after ^C during imports
suppress_keyboard_interrupt_message()

if __name__ != "__main__":
    sys.stderr.write('The executable DNF module must not be imported.')
    sys.exit(1)

here = sys.path[0]
if here != '/usr/bin':
    # git checkout
    import os
    dnf_toplevel = os.path.dirname(here)
    sys.path[0] = dnf_toplevel

from dnf.cli import main
main.user_main(sys.argv[1:], exit_code=True)

Теперь я не очень понимаю что надо добавить в sudoers.

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

лучше сначала просто на юзере а не на группе [code]имяюзера ALL=(ALL) NOPASSWD: /usr/bin/dnf

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

Да нет, это не работает. Я предполагаю, что питонскрипт что-то там вызывает и именно это что-то и надо добавлять в sudoers. Посмотрел в htop что он там конкретно вызывает, добавил в sudoers и по прежнему требует пароль лол:

%wheel ALL = (ALL) NOPASSWD: /usr/bin/python3 /usr/bin/dnf --cacheonly search

лучше сначала просто на юзере

Same shit.

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

Ну попробовать еще шаблон мож прокатит. Идеи кончились

имяюзера	ALL=(ALL)       NOPASSWD: /usr/bin/dnf *

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

У меня там dnf offline-upgrade download и dnf offline-upgrade reboot. Сейчас попробую search. Кстати с search тебе там звездочку надо где-то поставить. dnf search bla != dnf search.

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

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

%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly search *
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --list *

Причем, если команда принимает может вызываться как с аргументом, так и без – нужно добавить запись и со звездочкой и без. В общем, выглядит это у меня так теперь:

$ cat /etc/sudoers.d/40-nopasswd | grep dnf
## DNF
# dnf.upgrade
%wheel ALL = NOPASSWD: /usr/bin/dnf upgrade --assumeyes
# dnf.search
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly search *
# dnf.provides
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly provides *
# dnf.list_installed
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly list installed
# dnf.repolist
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repolist
# dnf.list_package_files
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --list
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --list *
# dnf.history_list
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly history list --reverse
# dnf.history_info
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly history info
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly history info *
# dnf.requires
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --requires --resolve
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly repoquery --requires --resolve *
# dnf.info
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly info
%wheel ALL = NOPASSWD: /usr/bin/dnf --cacheonly info *
Im_not_a_robot ★★★★★
() автор топика
Последнее исправление: Im_not_a_robot (всего исправлений: 1)
Ответ на: комментарий от Dog

И два вопроса, почему /etc/sudoers.d а не /etc/sudoers?

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

В федоровском /etc/sudoers (а может во всех так) в конце строчка

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Т.е. любой файл из директории sudoers.d автоматом инклюдится (но в имени не должно быть точки).

Отдельная петюня авторам sudo за непротиворечивый синтаксис, когда # может начинать и коммент, и директиву :)

Im_not_a_robot ★★★★★
() автор топика

Так как это разрешает выполнение произвольного кода без пароля — разрешай все команды без пароля.

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

Выше перечислены конкретные команды из моего sudo. Сочини команду, которая позволит «выполнение произвольного кода без пароля».

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

Тьфу, невнимательно прочитал вопрос.

Не, так пластаться можно, если хочется пластаться. Непонятно зачем, но можно.

Тут в соседнем треде выяснили, что %wheel через packagekit и так все может ставить из коробки, и это правильно.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.