Thank you for reading this post, don't forget to subscribe!
Благодаря Sudo, вы можете запустить некоторые или все команды как под root-ом. Когда Sudo установлен (пакет: Sudo), вы можете настроить его при помощи команды 'visudo' под root-ом. В основном он редактирует (Vim по умолчанию) /etc/sudoers, но это не рекомендуется делать вручную.
Неправильный синтаксис, добавленный в этот файл, может полностью нарушить распределение прав между пользователями. Потому для работы с этим файлом используется команда visudo. Команда visudo открывает файл в обычном текстовом редакторе, но во время сохранения файла проверяет его синтаксис. Это позволяет избежать ошибок в конфигурации.
Дальше полномочия описываются строчками вида:
1 2 3 |
[пользователь] [хост]=([кем может стать]) [что может сделать] рассмотрим пример: demo ALL=(ALL:ALL) ALL |
- Первое поле задаёт имя пользователя, к которому нужно применить данное правило (в данном случае это demo).
- Первое ALL значит, что правило будет применяться ко всем хостам.
- Второе ALL значит, что указанный пользователь может запускать команды в сессии любого пользователя.
- Третье ALL значит, что указанный пользователь может запускать команды в любой группе.
- Последнее ALL указывает, что эти правила нужно применять ко всем командам.
Это значит, что пользователи root и demo могут запускать все команды при помощи sudo, указав свой пароль.
Параметры привилегий групп
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
Последние две строки похожи на параметры привилегий пользователей, однако они отвечают за права групп.
Имена групп начинаются с символа %.
Как видите, группа admin может выполнять любую команду как любой пользователь или хост. Аналогичные права имеет группа sudo, однако она также может запускать команду как любая группа.
Создание алиасов
Файл sudoers можно более удобно структурировать при помощи различных алиасов
К примеру, можно создать три разные группы пользователей с совмещёнными правами:
User_Alias GROUPONE = user11, user12, user13
User_Alias GROUPTWO = user21, user22, user23,
User_Alias GROUPTHREE = user31, user32, user33
Имена групп должны начинаться с большой буквы. После этого можно дать пользователям GROUPTWO право на изменение БД apt-get:
GROUPTWO ALL = /usr/bin/apt-get update
Если в правиле не указан пользователь и группа, по умолчанию sudo использует root.
Затем можно разрешить пользователям группы GROUPTHREE выключать и перезапускать машину; для этого нужно создать алиас команды:
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
Алиас команды POWER содержит команды для отключения и перезапуска машины.
Также можно создать алиас Run as, который заменяет часть правила, указывающую пользователя, в сессии которого нужно выполнить команду.
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
Теперь любой пользователь группы GROUPONE может выполнять команды в сессиях пользователей www-data или apache.
Примечание: Помните, что созданные ранее правила имеют более высокий приоритет в случае конфликта правил.
___________________
Мы можем позволить пользователю или группе пользователей запускать только одну команду или группу команд. Давайте вернемся к нашему sudoers файлу. Начнем с alex и alisa, членов группы administrator. Если мы хотим, чтобы все пользователи из группы"administrator" были в состоянии запустить каждую команду в качестве суперпользователя, мы должны изменить наш пример:
1 |
%admin ALL=(ALL)ALL |
Alex так же может выполнить суперпользовательскую команду, и alisa получила право запускать Sudo, с теми же правами и со своим паролем. Если alex и alisa не члены одной группы, мы можем определить псевдоним пользователя в файле sudoers:
1 |
User_Alias ADMINS = alisa,alex |
Здесь мы определили алиас под названием ADMINS, с членами alisa и alex.
Тем не менее, мы не хотим, чтобы alex и alisa могли запускать с правами суперпользователя любую програму. Мы хотим, чтобы они могли запускать только 'updatedb'. Давайте определим команду псевдоним:
1 |
Cmnd_Alias LOCATE = /usr/sbin/updatedb |
Но этого мало! Мы должны сказать Sudo, что пользователи, определенные как ADMINS, могут запускать команды заданные в LOCATE. Чтобы сделать это, мы заменим строки с "%admin" на эти:
1 |
ADMINS ALL = LOCATE |
Это означает, что пользователи входящие в алиас ADMINS могут запускать все команды в алиасе LOCATE.
На этот раз, /etc/sudoers выглядит следующим образом:
1 2 3 |
User_Alias ADMINS = alisa, alex Cmnd_Alias LOCATE = /usr/bin/updatedb ADMINS ALL = LOCATE |
В результате alex и alisa могут запускать updatedb, как root, введя свой пароль.
Если последнюю строчку в файле изменить:
1 |
ADMINS ALL = NOPASSWD:LOCATE |
тогда alex и alisa смогут выполнить 'sudo updatedb' без ввода пароля.
Можно добавить другие команды в командный алиас и более алиасов в правило. Например мы можем создать алиас NETWORKING содержащий некоторые сетевые команды типа: ifconfig, route или iwconfig:
1 2 |
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhcclient, /usr/bin/net, sbin/iptables, /usr/bin/rfcom, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool |
Давайте все это добавим в наш /etc/sudoers файл (с помощью visudo!). А также предоставим нашей ADMINS групе права на выполнение программ и из алиаса NETWORKING:
1 2 3 4 5 |
User_Alias ADMINS = alice, bob Cmnd_Alias LOCATE = /usr/bin/updatedb Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net,/sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool ADMINS ALL = LOCATE, NETWORKING |
Проверка, авторизуйтесь как alisa (или alex), и наберите:
1 |
$ping -c 10 -i localhost |
Ответ должен вернуться быстро:
1 2 |
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. ping: cannot flood; minimal interval, allowed for user, is 200ms |
Теперь, тоже-самое но с Sudo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$sudo ping -c 10 -i 0 localhost PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.034 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.021 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=4 ttl=64 time=0.030 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=5 ttl=64 time=0.017 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=6 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=7 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=8 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=9 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=10 ttl=64 time=0.016 ms --- localhost.localdomain ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1ms rtt min/avg/max/mdev = 0.016/0.023/0.049/0.010 ms, ipg/ewma 0.187/0.028 ms |
Sudo часто используется для предоставления определенным пользователям частичного доступа к привелигированным командам, чтобы они могли выполнять ограниченные административные функции. Одно из удобств Sudo в том, что все команды записываются в /var/log/secure. Приведенный выше пример будет описан строчкой в журнале:
1 |
Apr 18 11:23:17 localhost sudo: alex : TTY=pts/0 ; PWD=/home/alex ; USER=root ; COMMAND=/bin/ping -c 10 -i 0 localhost |
___________________
Блокировка правил
Существует ряд способов контроля поведения и реакции sudo на вызов.
К примеру, команда updatedb в сочетании с пакетом mlocate относительно безвредна. Чтобы обычный пользователь мог выполнять её с привилегиями суперпользователя, не вводя пароль, можно создать такое правило:
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
Команда NOPASSWD значит, что система не будет запрашивать пароль. Также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию.
NOPASSWD распространяется на всё правило, если команда PASSWD не отменяет его. Например, строка может выглядеть так:
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
Ещё одна удобная команда – NOEXEC, которая используется для предотвращения опасного поведения определенных программ. К примеру, некоторые команды, такие как less, могут вызывать другие команды:
!command_to_run
Эта команда выполняет любую команду с привилегиями пользователя, запускающего less, а это может быть очень опасно.
Чтобы запретить такое поведение, можно использовать следующую строку:
username ALL = NOEXEC: /usr/bin/less
Дополнительные сведения
В данном разделе собраны различные полезные советы по работе с sudo.
Если вы указали пользователя или группу в параметре Run as, вы можете выполнять команды в сессии этого пользователя при помощи флагов -u и –g соответственно:
sudo -u run_as_user command
sudo -g run_as_group command
По умолчанию sudo сохраняет учётные данные в одном терминале на некоторое время. Это означает, что в течение этого периода вам не придется вводить пароль снова.
Если в целях безопасности вы хотите сбросить этот таймер, используйте команду:
sudo -k
Чтобы узнать права пользователя, введите:
sudo -l
Эта команда выведет все права, указанные в файле /etc/sudoers для данного пользователя.
Если обычный пользователь попытается запустить команду администратора без префикса sudo, команда не сработает. Чтобы избежать необходимости повторного ввода команды, используйте функцию bash, которая повторяет команду:
sudo !!
Двойной восклицательный знак повторит последнюю команду.
при наличии ошибки вывод будет следующий:
[root@centos64 ~]# visudo
visudo: >>> /etc/sudoers: syntax error near line 113 <<<
visudo: >>> /etc/sudoers: syntax error near line 115 <<<
visudo: >>> /etc/sudoers: syntax error near line 113 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
What now? Q