sudoers - требуется простое объяснение

24

Каждый раз, когда я хочу иметь возможность запускать что-то, что требует от меня sudoerслишком много раз, мне нужно гуглить для форматирования, /etc/sudoersчтобы напоминать мне снова, что именно является правильным способом написать это.

Теперь я вижу разные стили написания в моем sudoersфайле, что является следствием разных результатов Google за месяцы. Я также заметил, что второй пример (ниже), кажется, работает в XFCE, но не в Cinnamon (Gnome 3). Это может быть совершенно не связано, но, тем не менее, я хотел бы знать раз и навсегда, какова правильная грамматика линии sudoer и в чем разница между приведенными примерами?

  1. redsandro ALL=NOPASSWD:/path/to/command
  2. redsandro ALL=(ALL) NOPASSWD:/path/to/command
  3. redsandro ALL=(ALL:ALL) NOPASSWD:/path/to/command

Кроме того, для чего все это ALL? Один пользователь, одна команда, но мне нужно использовать ALLключевое слово до трех раз? Я делаю это неправильно?

Конечно, опуская NOPASSWD:заставляет вас ввести пароль , прежде чем разрешено выполнить команду, но одна точка путаницы является использование =и :для окончательной команды , которая является предметом линии может быть префиксом либо =, :, , или ), запутанная грамматика для подобной семантики.

Redsandro
источник
3
Я также чувствую себя очень расстроенным sudoersсинтаксисом. Чтение справочной страницы было еще более удручающим: она описывает так называемый лаконичный и точный язык EBNF, примеры излишне длинны. Поэтому я не удивлен, найдя здесь столько тем относительно этого файла.
м-рик
1
Спасибо за это. Я хотел задать этот вопрос с тех пор, как несколько лет назад я натолкнулся на файл sudoers :-)
vahidg

Ответы:

35

Это больше, чем просто пользователь и команда:


redsandro host=(user:group) tag:commands
  • hostуказывает имена хостов, для которых эта строка действительна. Если вы не разделяете файл asudoers между разными хостами, которым нужны разные правила, используйте специальное значение, ALLозначающее, что «все хосты» - хороший выбор.

  • userуказывает, каких пользователей вы можете использовать с -uопциями для запуска команды. Если вы пропустите это, вы не сможете использовать эту -uопцию.

  • groupуказывает, какие группы вы можете использовать с -gопциями. Если вы опустите его, вы не сможете использовать эту -gопцию.

И то, userи другое groupпонимают ALLкак «все пользователи / группы».

Если опустить все , (user:group)что вы не можете использовать -uи -gно только выполнить команду с правами администратора.

  • tag позволяет указать некоторые параметры, такие как NOPASSWD

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

В примере 2. вы можете запустить команду как пользователь root или использовать -uее как любой другой пользователь.

С помощью 3. вы можете запустить команду от имени пользователя root или использовать -uили -gдля запуска команды от имени любого другого пользователя или группы.

Флориан Диш
источник
Это именно то, что я искал. Я принял ваш ответ, и спасибо за вашу работу.
Redsandro
1
Последняя мысль, можно ли использовать 127.0.0.1или localhostкак hostдля тривиальной дополнительной безопасности?
Redsandro
5
На странице руководства написано: «Примечание. Sudo проверяет только реальные сетевые интерфейсы; это означает, что IP-адрес 127.0.0.1 (localhost) никогда не будет совпадать. Кроме того, имя хоста «localhost» будет совпадать только в том случае, если это фактическое имя хоста, что обычно имеет место только для не сетевых систем ».
Флориан Диш,
1
Спасибо. Для меня нет имени хоста, тем более что я хочу иметь возможность копировать sudoersfile на несколько машин. ALLэто.
Redsandro
9

Давайте разберем это на части:
redsandro ALL=(ALL:ALL) NOPASSWD:/path/to/command

redsandro - это имя пользователя, которому мы даем разрешение. Поместите% на передний план, чтобы применить его к группе.

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

= не нуждается в объяснении

ALL: ALL читается как (who_to_run_it_as: what_group_to_run_it_as). Таким образом, вы можете разрешить запуск команды, но только в контексте определенного пользователя или группы.

NOPASSWD: говорит отключить запрос пароля.

/ path / to / command позволяет вам указать конкретные команды path_to_commmand, another_command

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

RobotHumans
источник
1
Спасибо за дополнительные %и , another_commandзаметки. Теперь я понимаю %wheelлинию в дистрибутиве Fedora.
Redsandro