Системные администраторы в отличие от обычных пользователей являются членами отдельной группы пользователей. Которым доступен полный контроль над системой. Эта мера не является достаточной для обеспечения высокой безопасности системы. Однако она необходима. В Linux-системах существует механизм, который позволяет любому пользователю получить привилегии суперпользователя. Но при соблюдении конкретных и строгих условий. Такая модель является (как показывает многолетняя практика) точно выверенным компромиссом. Между удобством и безопасностью во всех системах UNIX и Linux, который реализован в виде утилиты sudo.
Зачем разделять привилегии?
Учётная запись root в Linux является самой полновластной — ей доступны любые действия. С помощью которых можно как сломать систему, так и полностью её восстановить. Все остальные учётные записи не обладают такими полномочиями. И как-то навредить системе не могут, разве что сами себе в своих домашних каталогах.
Сложные сети с большим количеством серверов и разветвлённой периферией обслуживают большое количество пользователей. Вместе с тем и сами эти системы в силу своей сложности и масштабов нуждаются в обслуживании не одним, и довольно часто, даже не двумя системными администраторами. В таких случаях очень удобно использовать механизм, предоставляемый утилитой sudo для получения привилегий суперпользователя для любого пользователя на любом компьютере, тем более, что безопасность от этого не страдает. Если учётная запись root будет доступна нескольким системным администраторам, то, во-первых, администрирование системы будет крайне неудобным, во-вторых, невозможно будет отслеживать, кто именно производил те или иные действия по администрированию системы. Утилиты sudo легко решает эти проблемы.
Как работает утилита sudo?
В Linux принято (и небезосновательно) как можно меньше работать в системе от суперпользователя. И это считается ещё и хорошим тоном. По сути, утилита sudo является универсальным инструментом для достижения этой цели. Позволяющая выполнять важные административные задачи максимально осознанно. В обычном понимании команда sudo предоставляет временные разрешения на использование привилегий суперпользователя. По истечении определённого промежутка времени (который можно настраивать) эти разрешения отнимаются. Очевидно, что это сделано, чтобы каждый раз эти разрешения не запрашивать. А также чтобы система слишком долго не оставалась без присмотра и без защиты от необдуманных или намеренных вредительских действий.
Утилита sudo при своей работе читает файл /etc/sudoers, в котором хранятся список пользователей. Которым доступны суперпользовательские привилегии, а также список команд, которые им можно выполнять. Команда sudo в качестве параметра принимает строку, содержащую требуемую команду. Сначала она определяет, является ли пользователь, запускающий команду членом группы sudoers (имеется соответствующая запись в /etc/sudoers). Далее проверяется, разрешена ли выполняемая команда и если да, то выводится приглашение ввести собственный пароль пользователя (не суперпользователя, он не должен быть известен). А далее производится выполнение команды уже от имени суперпользователя. Последующие команды (с утилитой sudo) в течение некоторого времени (обычно по-умолчанию 5 минут) можно выполнять без ввода пароля.
Также утилита sudo записывает в журнал некоторые действия, такие как: пользователи, выполнившие команды, компьютеры, на которых они выполнялись, сами выполненные команды, а также и каталоги, из которых выполнялись команды. Все эти данные могут регистрироваться и в файлах регистрации системы Syslog, либо в произвольно заданных файлах.
Файл /etc/sudoers
Содержимое файла /etc/sudoers может быть следующим:
# Define aliases for machines in CTRLS & SRV departments Host_Alias CTRLS = ctrl1, ctrl2 Host_Alias SRV = srv1, srv2 # Define collections of commands Cmnd_Alias DUMP = /sbin/dump, /sbin/restore Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm Cmnd_Alias SHELLS = /bin/sh, /bin/tcsh, /bin/bash, /bin/ksh, /bin/bsh # Permissions john, michael SRV = ALL bob CTRLS = /usr/sbin/tcpdump : SRV = (alex) DUMP alisa ALL = (ALL) ALL, !SHELLS %wheel ALL, ! SRV = NOPASSWD: PRINTING
В синтаксисе sudoers используются алиасы (псевдонимы), чтобы сделать спецификации более понятными и простыми при редактировании. Как можно видеть, первые пять строк (за исключением строк комментариев) задают списки компьютеров. А также перечни используемых (разрешённых) программ и командных оболочек. Последние четыре строки представляют собой спецификации предоставляемых привилегий, на основе объектных наборов, заданных алиасами.
Так например, из приведённого листинга следует, что пользователи john и michael могут авторизовываться в системе используя компьютеры srv1 и srv2 (группа SRV). При этом им доступны (системный алиас ALL) для выполнения любые команды. Пользователю bob доступна утилита tcpdump на компьютерах crl1 и ctrl2 (группы CTRLS). А также утилиты резервного копирования (алиас DUMP) для компьютеров группы SRV. При этом команды резервного копирования будут выполняться с привилегиями пользователя alex (а не root):
$ sudo -u alex dump 0u /dev/sda1
Пользователь alisa может запускать любые команды на любой машине, но при этом он ограничен в использовании многих самых распространённых командных оболочек. Последняя строка предписывает пользователям из группы wheel выполнять команды печати с привилегиями суперпользователя на всех компьютерах кроме тех, которые входят в группу SRV. При этом вводить пароль не требуется (атрибут NOPASSWORD).
Для редактирования файла /etc/sudoers предназначена специализированная утилита visudo. Например чтобы отредактировать файл sudo нужно набрать команду
visudo
При открытии файла она проверяет, не редактируется ли он ещё чем-то (или кем-то). Потом запускает сам редактор. При сохранении изменений visudo проводит валидацию файла на наличию ошибок. Это очень важно, т. к. в случае ошибок выполнение команды sudo и исправление файла /etc/sudoers будет невозможным.
Преимущества и недостатки модели sudo
Как уже говорилось, утилита sudo, в частности предоставляемая ею модель предоставления привилегий является компромиссным решением между удобством, практичностью и безопасностью. Это даёт следующие преимущества:
пользователи могут выполнять административные и специальные задачи максимально осознанно, при этом не обладая неограниченными возможностями;
пароль суперпользователя может быть известен минимальному кругу лиц;
у любого пользователя в системе можно отобрать привилегии, при этом не меняя пароля суперпользователя;
ведётся учёт всех пользователей, имеющих привилегии суперпользователя (root);
командная оболочка имеет защиту от несанкционированного доступа;
настройки доступа ко всей системе (или даже сети) хранятся в одном файле.
Есть у утилиты sudo и недостатки. Но все они проявляются только в случае недобросовестного обслуживания системы. Например, самым основным недостатком является то, что вся система защиты будет сломана, если будет взломана одна-единственная учётная запись суперпользователя. И напротив — при наличии «лазейки» в одной из привилегированных учётных записей. Под угрозой оказывается учётная запись root.