sudoers - список пользователей, с указанием того, что они могут выполнять
Файл sudoers содержит два типа данных: псевдонимы (в основном переменные) и определения пользователей (где определяется кто что может выполнять). Грамматика sudoers будет описана ниже в Расширенной Форме Бэкуса-Наура (EBNF). Не отчаивайтесь, если вы не знаете,что такое EBNF; это довольно просто, и к определениям, приводимым далее, будут даваться пояснения.
-1EBNF это краткий и точный способ описания грамматики языка. Каждое определение -1EBNF происходит из последовательности правил. Т.е.
символ ::= определение | альтернатива1 | альтернатива2 ...
Каждая последовательность правил ссылается на другие и, таким образом, образует грамматику языка. -1EBNF также содержит следующие операторы, которые наверняка покажутся знакомыми многим читателям. Однако, не спутайте их со знаками подстановки, которые имеют другое значение.
Круглые скобки могут использоваться для объединения символов в группы. Для ясности, мы будем использовать одинарные ('') кавычки для выделения выражений, которые следует читать и понимать буквально (в противоположность символическим именам).
Имеется четыре типа псевдонимов: User_Alias, Runas_Alias, Host_Alias и Cmnd_Alias.
Псевдоним ::= 'User_Alias' User_Alias (':' User_Alias)* |
'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
'Host_Alias' Host_Alias (':' Host_Alias)* |
'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)*
User_Alias ::= NAME '=' User_List
Runas_Alias ::= NAME '=' Runas_User_List
Host_Alias ::= NAME '=' Host_List
Cmnd_Alias ::= NAME '=' Cmnd_List
NAME ::= [A-Z]([A-Z][0-9]_)*
Каждое определение псевдонима имеет форму
Тип_Псевдонима НАЗВАНИЕ = элемент1, элемент2, ...
где Тип_Псевдонима является одним из User_Alias, Runas_Alias, Host_Alias, или Cmnd_Alias. НАЗВАНИЕ это набор символов, набранных в верхнем регистре, цифр, и символов подчеркивания ('_'). НАЗВАНИЕ должно начинаться с символа, набранного в верхнем регистре. Это позволяет размещать несколько определений псевдонимов одного типа в одной строке, разделенных знаком двоеточия (':'). Т.е.
Тип_Псевдонима НАЗВАНИЕ = элемент1, элемент2, элемент3 : НАЗВАНИЕ = элемент4, элемент5
За определением следует допустимое значение псевдонима.
User_List ::= User |
User ',' User_List
User ::= '!'* username |
'!'* '%'group |
'!'* '+'netgroup |
'!'* User_Alias
User_List состоит из одного, или более, имени пользователя (username), идентификатора пользователя (uid), начинающегося со знака #', cистемной группы (group), начинающейся со знака %'), сетевой группы (netgroup), начинающейся со знака +', и других псевдонимов (User_Alias). Каждый элемент списка может начинаться с одного, или более, оператора !. Отрицающее значение оператора ! отрицает значение элемента; положительное значение только отменяет значение другого.
Runas_List ::= Runas_User |
Runas_User ',' Runas_List
Runas_User ::= '!'* username |
'!'* '#'uid |
'!'* '%'group |
'!'* +netgroup |
'!'* Runas_Alias
Runas_List аналогичен User_List, за исключением того, что хоть в нём и присутствуют идентификаторы пользователей uid (начинающиеся со знака '#'), однако вместо User_Alias он содержит Runas_Alias
Host_List ::= Host |
Host ',' Host_List
Host ::= '!'* hostname |
'!'* ip_addr |
'!'* network(/netmask)? |
'!'* '+'netgroup |
'!'* Host_Alias
Host_List состоит из одного, или более, имен машин (hostname), -1IP адресов (ip_addr), номеров сетей (network), сетевых групп (netmask, начинающихся со знака +') и других псевдонимов (Host_Alias). Опять-же, значение может отрицаться оператором !. Если вы не укажете маску сети с номером сети, то будет использоваться подходящая сетевая маска внешнего сетевого интерфейса машины. Сетевая маска может быть указана либо четырьмя группами чисел, разделенных между собой точками, (т.е. 255.255.255.0) или указанием -1CIDR (числом бит, т.е. 24). Имя машины может содержать символы подстановки в стиле интерпретатора команд (см. ниже секцию `Символы подстановки), но если команда hostname на вашей машине возвращает полное имя машины, то для использования маски вы должны будете использовать опцию fqdn.
Cmnd_List ::= Cmnd |
Cmnd ',' Cmnd_List
commandname ::= filename |
filename args |
filename '""'
Cmnd ::= '!'* commandname |
'!'* directory |
'!'* Cmnd_Alias
Cmnd_List это список имен комманд (commandnames), каталогов (directory), и других псевдонимов (Cmnd_Alias). Имя команды это полное имя файла, которое может содержать символы подстановки используемые интерпретатором команд (см. секцию `Символы подстановки). Простое имя файла позволяет пользователю выполнять команду с любыми аргументами, какие он пожелает. Также вы можете использовать аргументы командной строки (включая символы подстановки). Дополнительно вы можете использовать "" для указания, что эта команда может быть выполнена без параметров командной строки. Каталог, это полное имя имя пути, заканчивающееся с /. Если вы укажите каталог в Cmnd_List, то пользователь сможет выполнить любой файл, в пределах того каталога (но не в его подкаталогах).
Если Cmnd имеет ассоциированные аргументы командной строки, то аргументы, указанные пользователем в Cmnd, должны точно соответствовать аргументам в командной строке (или соответствовать символам подстановки, если таковые имеются). Обратите внимание, что следующие символы должны начинаться с \, если они используются в аргументах команд: ,, :, =, \.
Некоторые значения параметров конфигурации по умолчанию могут быть изменены во время выполнения через одну или несколько записей Default_Entry. Они могут касаться всех пользователей на любом компьютере, всех пользователей на определенном компьютере, или только определенного пользователя. Когда имеется множество значений, то они применяются поочередно. Если имеются конфликтующие значения, то эффект будет иметь последнее из них в строке.
Default_Type ::= 'Defaults' ||
'Defaults' ':' User ||
'Defaults' '@' Host
Default_Entry ::= Default_Type Parameter_List
Parameter ::= Parameter '=' Value ||
Parameter '+=' Value ||
Parameter '-=' Value ||
'!'* Parameter ||
Параметры могут быть флагами, целочисленными значениями, выражениями или списками. Флаги являются булевыми и могут быть выключены при помощи оператора !. Некоторые параметры, целочисленные, выражения и списки, могут быть так же использованы в булевом контексте для его отключения. Значения могут быть заключены в двойные кавычки ("), если они содержат повторяющиеся слова. Специальные символы могут начинаться с символа "обратный слэш" (\).
Флаги:
Целые числа:
Целые числа, которые могут быль использованы в булевом контексте:
Строчные значения:
Выражения, которые могут быть использованы в булевом контексте:
all Все пользовательские записи в sudoers
для данного компьютера должны иметь установленный
флаг NOPASSWD во избежание ввода пароля.
any Хотя бы одна пользовательская запись для данного
компьютера в sudoers должна иметь
установленный флаг NOPASSWD во избежание
ввода пароля.
never Для использования флага -v пользователь
не должен использовать пароль.
always Пользователь должен всегда вводить пароль для
использования флага -v.
Значение по умолчанию `all.
all Все пользовательские записи в sudoers
для данного компьютера, должны иметь установленный
флаг NOPASSWD во избежание ввода пароля.
any Хотя бы одна пользовательская запись для данного
компьютера в sudoers должна иметь
установленный флаг NOPASSWD, во избежание
ввода пароля.
never Для использования флага -l пользователь
не должен использовать пароль.
always Пользователь должен всегда вводить пароль для
использования флага -l.
По умолчанию принято значение `any.
User_Spec ::= User_list Host_List '=' User_List Cmnd_Spec_List \
(':' User_Spec)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? ('NOPASSWD:' | 'PASSWD:')? Cmnd
Runas_Spec ::= '(' Runas_List ')'
Спецификация пользователя определяет какие команды может выполнять пользователь (и какой пользователь) на определенной машине. По умолчанию, команды выполняются от имени супер-пользователя (root), но это может быть изменено на уровне по-командного доступа.
Давайте разберем это детальнее:
Runas_Spec это просто Runas_List (как определено выше) заключенный в круглые скобки. Если вы не определяете Runas_Spec в спецификации пользователя, то по умолчанию будет использован Runas_Spec супер-пользователя (root). Runas_Spec устанавливает значение по умолчанию для команд следующих после него. Вот что это означает в записи:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who
Пользователь dgb может выполнять /bin/ls, /bin/kill, и /usr/bin/lprm -- но только как operator. Т.е.
sudo -u operator /bin/ls.
Также возможно отменить Runas_Spec далее, в той же строке. Если мы изменим запись вот так:
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
Пользователю dgb теперь разрешено выполнять /bin/ls как operator, но /bin/kill и /usr/bin/lprm как root.
По умолчанию sudo требует чтобы пользователь аутентифицировал себя заранее, до выполнения команды. Это поведение может быть изменено через тэг NOPASSWD. Как и Runas_Spec, тэг NOPASSWD устанавливает значение по умолчанию для команд, следующих за Cmnd_Spec_List. Тэг PASSWD может использоваться в целях изменения значений наоборот. Например:
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
позволило бы пользователю ray выполнять /bin/kill, /bin/ls, и /usr/bin/lprm как супер-пользователю (root) на машине rushmore без аутентификации. Если мы хотим разрешить ray выполнять без пароля только /bin/kill, то запись должна быть:
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
Обратите внимание, что тэг PASSWD не возымеет эффекта на пользователях, указанных в группе, определенной опцией exempt_group.
По умолчанию, если к какой-либо записи пользователя на данной машине применен тэг NOPASSWD, он или она сможет выполнять sudo -l без указания пароля. Также, пользователь может выполнять без пароля только sudo -v, если отметка NOPASSWD присутствует для всех пользователей, которые относятся к данному компьютеру. Это поведение может быть изменено при помощи параметров verifypw и listpw.
sudo позволяет использовать знаки подстановки, подобные знакам подстановки оболочки, для использования в именах пути также, как в параметрах командной строки в файле sudoers. Знаки подстановки соответствуют -1POSIX fnmatch(3). Обратите внимание, что это не регулярные выражения.
Обратите внимание, что знак слэша ('/') не будет соответствовать символам подстановки используемым в имени пути. Однако, если сравнивать с параметрами командной строки, слэш будет соответствовать символу подстановки. Это делает путь подобный:
/usr/bin/*
соответствующим /usr/bin/who, но не /usr/bin/X11/xterm.
К вышеприведенным правилам применимы следующие исключения:
Знак фунта ('#') используется для обозначения комментария (если это происходит не в контексте имени пользователя, сопровождается одной или более цифр и обрабатывается как универсальный идентификатор пользователя (uid)). И знак комментария, и любой текст после него, игнорируются до конца строки.
Зарезервированное слово -1ALL является встроенным псевдонимом, которое всегда имеет определение. Это может использоваться везде, где было бы уместно использование псевдонимов Cmnd_Alias, User_Alias, Runas_Alias, или Host_Alias. Вы не должны пытаться назначить свой собственный псевдоним с именем -1ALL, поскольку встроенный псевдоним будет использоваться вместо вашего собственного. Помните, что использование -1ALL в контексте команды опасно, так как позволит пользователю выполнить любую команду в системе.
Знак восклицания (!') может быть использован как логический оператор не, как в псевдониме, так и перед Cmnd. Это позволяет исключать некоторые значения. Обратите внимание, что использование ! в сочетании с встроенным псевдонимом ALL для разрешения выполнения пользователем всего кроме нескольких команд не всегда работает должным образом (см. -1БЕЗОПАСНОСТЬ -1ПРИМЕЧАНИЯ ниже).
Длинные строки могут быть перенесены при помощи обратного слэша (\'), если он является последним символом в строке.
Пробелы между элементами описания, также как и специальные синтаксические символы в Спецификации пользователя ('=, :, (, )'), являются необязательными.
Следующие символы должны начинаться с символа обратного слэша (\'), когда используются как часть слова (т.е. имя пользователя или имя компьютера): '@, !, =, :, ,, (, ), \.
Ниже приведены примеры записей sudoers. Возможно, некоторые из них являются выдуманными. Сначала мы определяем свои псевдонимы:
# Определение псевдонимов пользователя
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Определение псевдонимов Runas (Выполнить как)
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
# Определение псевдонимов машин
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Определение псевдонимов Cmnd (команд)
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Здесь мы переопределим некоторые встроенные значения по умолчанию. Мы хотим, чтобы sudo регистрировал события при помощи syslog(3), во всех случаях используя метод auth. Мы не хотим, что бы sudo читало лекции всем пользователям, и пользователь millert не должен указывать пароль. В добавок, на машинах в SERVERS Host_Alias мы держим дополнительный локальный файл журнала и удостоверимся, что мы регистрируем год в каждой строке файла журнала, так как записи журнала будут сохраняться в течение нескольких лет.
# Переопределяем встроенные значения по умолчанию
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
Определение пользователя является частью, которая фактически определяет кто что может выполнять.
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
Мы позволим супер-пользователю (root) и любому пользователю в группе wheel выполнить любую команду на любой машине от имени любого пользователя.
FULLTIMERS ALL = NOPASSWD: ALL
Системные администраторы занятые полный рабочий день (millert, mikef и dowdy) могут выполнить любую команду на любой машине без аутентификации.
PARTTIMERS ALL = ALL
Системные администраторы занятые не полный рабочий день (bostley, jwfox и crawl) могут выполнить любую команду на любом компьютере, но сначала должны себя аутентифицировать (так как в записи отсутствует тэг NOPASSWD).
jack CSNETS = ALL
Пользователь jack может выполнить любую команду на машинах с псевдонимом CSNETS (сети 128.138.243.0, 128.138.204.0 и 128.138.242.0). Из этих сетей только <128.138.204.0> имеет явную сетевую маску (в соответствии с CIDR) означающую сеть класса C. Для остальных сетей в CSNETS в случае соответствия будет использоваться сетевая маска машины.
lisa CUNETS = ALL
Пользователь lisa может выполнять любую команду на любой машине с псевдонимом CUNETS (сеть класса B 128.138.0.0).
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/
Пользователь operator может выполнять команды ограничивающиеся простым обслуживанием. В данном случае таковыми являются резервное копирование, уничтожение процессов, система печати, выключение системы и любая команда в каталоге /usr/oper/bin/.
joe ALL = /usr/bin/su operator
Пользователь joe может выполнять только su(1) оператору.
pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
Пользователю pete разрешено изменять любой пароль, за исключением пароля супер-пользователя (root) на машинах HPPA. Учтите, что passwd(1) не воспринимает несколько имен пользователей подряд в одной командной строке.
bob SPARC = (OP) ALL : SGI = (OP) ALL
Пользователь bob может выполнять любые команды на машинах SPARC и SGI, как пользователь описанный в Runas_Alias в OP (root и operator).
jim +biglab = ALL
Пользователь jim может выполнить любую команду на машинах в сетевой группе biglab. Sudo знает, что biglab является сетевой группой из-за префикса +.
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
Пользователи в сетевой группе secretaries должны как помогать в управлении принтерами, так и добавлять или удалять пользователей. Таким образом им позволено выполнять эти команды на всех машинах.
fred ALL = (DB) NOPASSWD: ALL
Пользователь fred может выполнять команды от имени любого пользователя в Runas_Alias DB (oracle или sybase), без указания пароля.
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
На машинах ALPHA пользователь john может выполнить su любому пользователю, за исключением супер-пользователя (root), но не имеет права задавать su(1) какие-либо флаги.
jen ALL, !SERVERS = ALL
Пользователь jen может выполнить любую команду на любой машине, за исключением машин в Host_Alias SERVERS (master, mail, www и ns).
jill SERVERS = /usr/bin/, !SU, !SHELLS
Для любой машины в Host_Alias SERVERS jill может выполнить любую команду в каталоге /usr/bin/, за исключением команд относящихся к Cmnd_Aliases SU и SHELLS.
steve CSNETS = (operator) /usr/local/op_commands/
Пользователь steve может выполнить любую команду в каталоге /usr/local/op_commands/, но только как пользователь operator.
matt valkyrie = KILL
На своей персональной рабочей станции, valkyrie, matt необходима возможность уничтожать зависшие процессы.
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
На машинах www, любой пользователь в User_Alias WEBMASTERS (will, wendy и wim), может выполнить любую команду как пользователь www (который является владельцем web-страниц) или просто su(1) к www.
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
Любой пользователь может монтировать или размонтировать CD-ROM на машинах в Host_Alias CDROM (orion, perseus, hercules) без ввода пароля. Ввод этого несколько утомителен для пользователей, поэтому это первейший кандидат для включения в сценарий оболочки.
В целом исключение команд из ALL, с использованием оператора !, не эффективно. Пользователь может тривиально это обойти, копируя желаемые команды с разными именами, и затем их выполнять. Например:
bill ALL = ALL, !SU, !SHELLS
В действительности не реально предотвратить выполнение bill команд, перечисленных в SU или SHELLS, так как он может запросто их скопировать под разными названиями, или использовать расширения оболочки из редактора или другой программы. Поэтому этот вид ограничений должен быть тщательно изучен (и подкреплен системной политикой).
Файл sudoers должен редактироваться только командой visudo, которая блокирует файл и осуществит проверку грамматики. Это обязательно, во избежание возникновения ошибок в синтаксисе sudoers, так как sudo не будет работать при наличии ошибок в sudoers.
Если используются сетевые группы или машины (в противоположность пользователям), если вы сохраняете полностью определенные имена машин в сетевой группе (что, бывает, случается), то имена машин должны быть полностью определенными, и соответствовать именам, возвращаемым командой hostname, или должна использоваться опция fqdn в sudoers.
/etc/sudoers,
/etc/sudo.d/* Cписок пользователей, с указанием того, что они могут выполнять
/etc/group Файл локальных групп
/etc/netgroup Список сетевых групп
rsh(1), sudo(8), visudo(8), su(1), fnmatch(3).
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |