Установка и настройка sudo в Debian 7

Список разделов

Sudo - это программа позволяющая администраторам давать ограниченные root права пользователям и вести журнал root активности. Базовая философия заключается в том, чтобы дать так мало прав, как это возможно, но при этом позволить людям нормально выполнять свои задачи. Отличие от команды su в том, что пользователь вводит пароль от своей учетной записи, а не пароль пользователя root.

Sudo в Debian имеет пятнадцатиминутный (может быть переопределен) таймаут после ввода пароля. Это значит, что когда вы первый раз ввели пароль рута, то у вас есть 15 минут в течение которых вы можете выполнить следующую команду без ввода пароля. Таймаут может быть немедленно сброшен с помощью команды sudo -k.

Установка sudo в Debian 7

aptitude install sudo

Во время установки создается конфигурационный файл /etc/sudoers и директория /etc/sudoers.d, о которых мы поговорим чуть позже.

Параметры команды sudo

-k [command] - позволяет сбросить таймаут до момента, когда необходимо будет снова вводить пароль. Если указать команду, которая может потребовать ввода пароля, то таймаут будет сброшен конкретно для этой команды.
-h - будет выведена небольшая подсказка на стандартный выход.
-V - отобразиться версия sudo и плагинов. Если запустить от root, то будут выведены все настройки.
-g group - позволяет задать от какой группы будет запущена команда.
-H - задает директорию, которая будет указана в переменной окружения HOME.
-i [command] - симулирует начальный вход. Если команда не указана, то будет произведен вход в систему, таким образом можно сделаться рутом вместо использования sudo su.
-l[l] [command] - если команда не указана, то будет выведен список доступных команд для вызвавшего пользователя (или пользователя указанного с параметром -U). Если указана команда и она доступна, то будет выведен полный путь до команды и доступные параметры. Если команда не доступна, то sudo закроется со статусом 1. Если использовать параметр -ll или указать -l два раза, то будет использован более подробный формат вывода.
-s [command] - будет запущена оболочка указанная в переменной окружения SHELL. Если указана команда, то она будет передана на исполнения запущенной оболочке.
-U user - совместно с параметром -l позволяет отобразить привилегии определенного пользователя. Доступ спискам привилегий по умолчанию есть у root и пользователей со всеми привилегиями (ALL).
-u user - указанная команда будет запущена от имени указанного пользователя, а не от root.
-v - позволяет продлить таймаут на 15 минут или на тот, который указан в sudoers), но не выполнять каких-либо команд.

Здесь указана большая часть доступных параметров, но не все. Чтобы посмотреть полный список используйте команду man sudo.

Настройка sudo в Debian 7

Рекомендуется все пользовательские настройки задавать в файлах в директории /etc/sudoers.d, а не в основном файле /etc/sudoers. То есть можно создать файл с любым названием в директории /etc/sudoers.d и уже в нем перечислить необходимые настройки.

Файл /etc/sudoers рекомендуется править  с помощью утилиты visudo, так как она блокирует файл и осуществляет проверку правильности написания директив при закрытии. visudo использует текстовый редактор по умолчанию, который можно переопределить в sudoers директивой вида:

Defaults    editor="/usr/bin/vi"

Синхронизация файла sudoers

Вообще говоря, утилита sudo является локальной, в ней нет встроенных механизмов для распространения единых настроек на множество серверов из одного центра. Для синхронизации можно использовать, к примеру, NFS, rsync или LDAP.

Пример содержимого файла sudoers

Когда читаешь руководство по настройке sudo в Debian, то довольно сложно что-то понять, но на примере все становится на свои места. Так что для начала рассмотрим пример из man 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
Runas_Alias    ADMINGRP = adm, oper

# Алиасы для наборов хостов
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_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
Cmnd_Alias     REBOOT = /usr/sbin/reboot
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
Cmnd_Alias     PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less

Далее мы переопределим некоторые значения установленные по умолчанию при компиляции. Мы хотим чтобы sudo вел лог через syslog с использованием auth во всех случаях. Мы мне хотим, чтобы сотрудники работающие полный день получали предупреждение от sudo, пользователь millert не должен вводить пароль и мы не хотим сбрасывать переменные окружения LOGNAME, USER or USERNAME когда выполняем команды от рута. Дополнительно на машинах в Host_Alias SERVERS мы храним дополнительный локальный лог-файл и убеждаемся, что будет логироваться год в каждой линии так как логи будут храниться несколько лет. Напоследок, в целях безопасности для команд в списке PAGERS мы отключаем возможность запускать другие команды.

# Переопределяем встроенные умолчания
Defaults               syslog=auth
Defaults>root          !set_logname
Defaults:FULLTIMERS    !lecture
Defaults:millert       !authenticate
Defaults@SERVERS       log_year, logfile=/var/log/sudo.log
Defaults!PAGERS        noexec

Далее идет часть в которой определяется кто что может запускать.

root           ALL = (ALL) ALL
%wheel         ALL = (ALL) ALL

Мы позволяем руту и всем пользователям в группе wheel запускать любые команды на любом хосте от имени любого пользователя.

FULLTIMERS     ALL = NOPASSWD: ALL

Сотрудники работающие полный день (millert, mikef и dowdy) могут запускать любые команды на любом хосте без ввода пароля.

PARTTIMERS     ALL = ALL

Сотрудники работающие часть дня (bostley, jwfox и crawl) могут исполнять любые команды на любых хостах, но должны вначале пройти процедуру аутентификации.

jack           CSNETS = ALL

Пользователь jack может выполнять любые команды на машинах из списка CSNETS.

operator       ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\
               sudoedit /etc/printcap, /usr/oper/bin/

Оператор может выполнять команды ограниченные простой поддержкой системы. Эти команды связаны с созданием резервных копий, убийством процессов, системой печати, отключением системы и командами в директории /usr/oper/bin/.

joe            ALL = /usr/bin/su operator

Пользователь joe может использовать su только чтобы стать пользователем operator.

pete           HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

%opers         ALL = (: ADMINGRP) /usr/sbin/

Пользователи в группе opers могуть запускать команды из /usr/sbin/ от имени себя в сочетании с любой группой из Runas_Alias ADMINGRP (группы adm и oper).

Пользователь pete может менять пароль любого пользователя за исключением root на любой машине из списка HPPA. В данном случае не получится указать несколько имен пользователей в командной строке.

bob            SPARC = (OP) ALL : SGI = (OP) ALL

Пользователь bob может исполнять любые команды на машинах из групп SPARC и SGI от имени пользователей в Runas_Alias OP (root и operator).

jim            +biglab = ALL

Пользователь jim может запускать любые команды в сетевой группе biglab. Sudo понимает, что biglab - это сетевая группа благодаря префиксу “+”.

fred           ALL = (DB) NOPASSWD: ALL

Пользователь fred может выполнять любые команды от имени пользователей в Runas_Alias DB без авторизации.

john           ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

На машинах в списке ALPHA пользователь john может использовать su чтобы стать любым пользователем кроме рута. При этом он не может использовать какие-либо параметры команды su.

jen            ALL, !SERVERS = ALL

Пользователь jen может запускать любые команды на любой машине кроме входящих в список SERVERS.

jill           SERVERS = /usr/bin/, !SU, !SHELLS

На любых машинах из списка SERVERS, jill может запускать любые команды за исключением содержащихся в списках SU и SHELLS.

steve          CSNETS = (operator) /usr/local/op_commands/

Пользователь steve может запускать любые команды в директории /usr/local/op_commands/ на машинах в сети CSNETS но только в качестве пользователя operator.

matt           valkyrie = KILL

На его персональной рабочей станции пользователю matt требуется возможность убивать процессы.

WEBMASTERS     www = (www) ALL, (root) /usr/bin/su www

На хосте www любой пользователь в списке WEBMASTERS (will, wendy и wim) могут запускать любые команды от пользователя www (который владеет файлами сайтов) или просто становиться пользователем www с помощью команды su.

ALL            CDROM = NOPASSWD: /sbin/umount /CDROM,\
               /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

Любой пользователь может монтировать или отмонтировать CD-ROM на машинах в списке CDROM без ввода пароля.

Далее подробно разберем разные элементы файла /etc/sudoers.

Формат файла sudoers

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

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

В итоге форма спецификации имеет следующий вид:

кто    где = (от имени кого) что

В более полной форме:

кто    где = (от имени кого) что, (от имени кого) что :  где = (от имени кого) что, (от имени кого) что

Также можно указать от какой группы можно запускать команду:

кто    где = (от имени кого : от какой группы) что

Или даже более сложный вариант:

кто    где = (от имени кого, от имени кого : от какой группы, от какой группы) что, что

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

Если вы хотите для одного пользователя задать разные настройки на разных хостах, то для разделения также используются двоеточия.

Пример:

user1    host1 = (op : opgr) /bin/ls

это правило говорит о том, что пользователь user1 может выполнить команду /bin/ls следующим образом:

$ sudo -u op /bin/ls

или

$ sudo -g opgr /bin/ls

или даже

$ sudo -u op -g opgr /bin/ls

Алиасы

Форма записи алиасов

Тип_алиаса    Имя = пункт 1, пункт 2 : Имя = пункт 3, пункт 4

Имя алиаса может состоять из латинских букв обоих регистров, цифр и символа нижнего подчеркивания. Имя обязательно должно начинаться с буквы в верхнем регистре.

Типы алиасов

User_Alias

Может содержать одно или более имен пользователей, id пользователей (с префиксом #), имен групп пользователей и их id (с префиксами % и %#, соответственно), сетевые группы (с префиксом +), не-юникосовые имена групп и ID (с префиксами %: и %:#, соответственно), а также алиасы пользователей (User_Aliases). Каждый пункт может предваряться символом восклицательного знака (“!”).

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

Runas_Alias

Данный алиас может содержать те же пункты, что и User_Alias. Обратите внимание, что имена и группы сравниваются как строки. Другими словами, два пользователя (группы) с разными именами, но с одинаковыми uid (gid) считаются различными. Если вы хотите указать все имена пользователей с одинаковым uid (к примеру, root и toor), вы можете использовать uid (#0 в нашем примере).

Host_Alias

Может состоять из одного или более имен хостов, IP адресов, сетей, сетевых групп (с префиксом +) и других алиасов. Повторимся, значение пункта может задано в отрицательном ключе с помощью символа восклицательного знака. Если вы не задали маску сети вместе с адресом сети, sudo проверит каждый сетевой интерфейс хоста и если адрес сети подойдет к одному из сетевых интерфейсов, будет использована соответствующая сетевая маска. Маска может быть задана либо в виде обычного IP-адреса (вида 255.255.255.0), либо в краткой форме в виден числа (количество бит, к примеру /24). Имя хоста может включать подстановочные знаки (о них чуть позже), но чтобы они работали необходимо, чтобы команда hostname выдавала полностью определенное доменное имя (fqdn). Стоит учесть, что sudo проверяет только реально существующие сетевые интерфейсы и IP-адрес 127.0.0.1 (localhost) использовать не удастся.

Cmnd_Alias

В список могут входить одна или более команд, директорий или других алиасов. Команда - это полностью определенное имя файла (то есть содержащее путь до файла), которое может содержать подстановочные символы. Простое имя файла позволяет пользователю запускать команду с любыми аргументами. Однако вы можете также указать аргументы командной строки (включая подстановочные символы). С другой стороны, можно указать “” чтобы предотвратить использование каких-либо аргументов с данной командой. Директория - это полностью определенный путь заканчивающийся символом '/'. Когда в Cmnd_Alias указана директория, пользователь может запускать любые файлы внутри этой директории (но не в ее поддиректориях).

Переопределение умолчаний

Некоторые опции могут быть изменены во время запуска с помощью одной или более записей Defaults, которые могут влиять на всех пользователей на любом хосте, на всех пользователей на определенном хосте, на определенного пользователя, определенную команду или на команды запускаемые от определенного пользователя. Стоит помнить, что записи для отдельных команд не могут включать аргументы. Если нужно задать аргументы, то задайте Cmnd_Alias и используйте его.

При записи Defaults для различных алиасов используются различные символы указывающие на тип алиаса:

'Defaults' '@' Host_List
'Defaults' ':' User_List
'Defaults' '!' Cmnd_List
'Defaults' '>' Runas_List

Параметрами могут быть флаги, целочисленные значения, строки и списки. Флаги являются булевыми и могут быть отключены с помощью оператора “!”. Значения могут быть заключены в двойные кавычки если они содержат несколько слов. Специальные символы могут быть экранированы с помощью обратной косой черты (\).

Списки имеют два оператора присваивания += и -=. Эти операторы используются для добавления и удаления из списка, соответственно.

Записи 'Defaults' обрабатываются в следующем порядке: вначале основные, для хостов и пользователей, затем runas и, наконец, для команд.

Полный список опций достаточно велик и мы не будем их здесь приводить. Если вы хотите их просмотреть, пожалуйста, воспользуйтесь командой man sudoers.

Ключевые слова

С командой может использоваться ноль или более ключевых слов. Существует восемь ключевых слов: NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT and NOLOG_OUTPUT.

NOPASSWD и PASSWD

По умолчанию, чтобы выполнить команду необходимо предварительно авторизоваться. Такое поведение можно изменить с помощью ключевого слова NOPASSWD. NOPASSWD оказывает влияние на команды, которые идут после ключевого слова. PASSWD же можно использовать чтобы обратить влияние NOPASSWD. Например:

user1    host1 = NOPASSWD: /bin/ls, /bin/ln, PASSWD: /bin/kill

NOEXEC и EXEC

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

user1    host1 = NOEXEC: /usr/bin/more

Информацию об остальных ключевых словах читайте в том же мане.

Подстановочные знаки

sudo позволяет использовать подстановочные знаки (а также, мета или глобальные символы) в именах хостов, путях и аргументах командной строки в файле sudoers. Стоит помнить, что это не регулярные выражения.

* - заменяет ноль или более любых символов.
? - заменяет любой один символ.
[...] - заменяет любой символ в заданном диапазоне.
[!...] - заменяет любой символ НЕ входящий в заданных диапазон.
\ - символ экранирования чтобы в именах можно было использовать специальные символы.

Также можно использовать классы символов. Однако, так как двоеточние (“:”) является специальным символом, то его приходится экранировать:

/bin/ls [[\:alpha\:]]*

это будет обозначать любой файл начинающийся с буквы.

Кроме того, прямая косая черта не заменяется подстановочными знаками. К примеру:

/usr/bin/*

соответствует /usr/bin/who, но не соответствует /usr/bin/X11/xterm.

Чтобы запретить использование аргументов командной строки, можно использовать двойные кавычки - "".

Включение содержимого других файлов в sudoers

Включение (“инклуд” от include) содержимого других файлов возможен с помощью директив #include и #includedir.

Это может использоваться в ситуации, когда у вас есть директивы для sudo общие для всех серверов и особые на каждом сервере. В таком случае можно создать два файла, к примеру, sudoers и sudoers.local. Затем второй инклудится в первый с помощью директивы (вместе со значком решетки):

#include /etc/sudoers.local

Также можно создать файлы с разными частями после точки, соответствующими именам серверов и инклудить их следующим образом:

#include /etc/sudoers.%h

где вместо %h подставляется имя хоста.

Что касается директивы #includedir, то можно создать отдельную директорию, в которую можно складывать файлы и они будут автоматически включаться в файл sudoers. К примеру, в Debian после установки sudo создается директория /etc/sudoers.d/, а в файле /etc/sudoers добавлена директива:

#includedir /etc/sudoers.d

Стоит учесть, что файлы обрабатываются и сортируются лексически, а не по номерам. То есть, к примеру, файл /etc/sudoers.d/01_first будет обработан перед /etc/sudoers.d/10_second, но файл с именем /etc/sudoers.d/1_whoops будет обработан после /etc/sudoers.d/10_second, так как вначале названия отсутствует ноль.

Дополнительные специальные символы

Знак решетки ('#') используется для создания комментариев, за исключением применения в директиве #include. Все символы от знака решетки до конца строки считаются комментарием.

ALL - является зарезервированным словом, которое обозначает все возможные значения. Может использоваться вместо любых алиасов и значений в полях “кто”, “где”, “от кого”, “что”. Не пытайтесь создавать алиасы с именем ALL.

Восклицательный знак ('!') используется как логический оператор отрицания (not) и позволяет исключать определенные значения. К примеру, можно разрешить выполнять любые операции за исключением некоторых используя ALL и “!”.

Длинные строки можно разбивать на подстроки с помощью символа обратной косой черты ('\') стоящего в конце каждой подстроки кроме последней.

Пробелы между элементами '=', ':', '(', ')' не обязательны. То есть их можно использовать, а можно не использовать.

Следующие символы необходимо экранировать с помощью символа обратной косой черты ('\'):

'!', '=', ':', ',', '(', ')', '\'.

sudoedit

Если требуется отредактировать какой-либо текстовый файл, доступ к которому есть доступ только у другого пользователя или рута, то можно воспользоваться утилитой sudoedit, что быстрее, чем запускать редактор с помощью sudo. Также можно использовать ключи -u и -g для запуска от определенного пользователя или группы. По умолчанию будет использовать учетная запись рута.

Наверх

Опубликовано