Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Рассматриваем вопрос прав доступа более подробно

Оригинал: Gettin' Sticky with It
Автор: Shawn Powers
Дата публикации: 11 июня 2015 г.
Перевод: А.Панин
Дата перевода: 2 августа 2015 г.

Рассматриваем вопрос прав доступа более подробно

В номере журнала за прошлый месяц я рассказывал о механизме прав доступа к элементам файловой системы в Linux (Обратитесь к статье "It's Better to Ask Forgiveness..." в разделе UpFront за май 2015 года, см. перевод на нашем сайте). Я мог бы рассказать о битах SUID, GUID и sticky в той же статье, но мне показалось, что в этом случае информации было бы слишком много для одного материала. Исходя из этого, в данной статье я буду описывать специальные типы прав доступа к элементам файловой системы в Linux. Ввиду того, что механизм стандартных прав доступа является интуитивно понятным, механизм специальных прав доступа может показаться на первый взгляд не имеющим особого смысла. Но после того, как вы узнаете о предназначении данного механизма, вы поймете, что он является не настолько запутанным, как кажется.

Но ведь больше нет места для дополнительных значений прав доступа!

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

Каждая из секций строки прав доступа к элементам файловой системы (для пользователя, группы пользователей и других пользователей) имеет дополнительные биты "специальных" прав доступа, значения которых устанавливаются по аналогии со значениями битов rwx. Указание на состояние этих битов выводится в рамках части строки, выделенной для вывода состояния битов исполнения. Например:

  1. Если установлен бит SUID (Set User ID - установка идентификатора пользователя), при выводе бита исполнения в секции прав доступа пользователя будет использован символ s вместо x.

  2. Если установлен бит GUID (Group User ID - установка идентификатора группы), при выводе бита исполнения в секции прав доступа группы пользователей будет использован символ s вместо x.

  3. Если установлен бит sticky, при выводе бита исполнения в секции прав доступа других пользователей будет использован символ t вместо x.

Еще не запутались? Ниже приведено несколько примеров:

  1. -rwsrw-rw- - Для файла установлен бит SUID.

  2. drw-rwsrw- - Для директории установлен бит GUID.

  3. drw-rw-r-t - Для директории установлен бит sticky.

  4. -rwSr-r-- - Для файла установлен бит sticky, при этом бит исполнения файла для пользователя не установлен.

Обратите внимание на то, что в последнем примере используется символ S в верхнем регистре. Это сделано для указания на тот факт, что необходимый бит исполнения не установлен. В том случае, если для указания на установку бита SUID используется символ в нижнем регистре, можно сделать вывод о том, что необходимый бит исполнения установлен. Если же используется символ в верхнем регистре, бит SUID установлен, но необходимый бит исполнения не установлен.

Для чего предназначены эти биты?

В отличие от стандартных прав доступа, специальные права доступа изменяют методы использования файлов и директорий, а не ограничивают доступ к ним. Также они используются по-разному в зависимости от того, устанавливаете ли вы их для файлов или директорий. Давайте рассмотрим их.

SUID: бит SUID устанавливается на исполняемые файлы. После установки данного бита программа исполняется с правами доступа и привилегиями пользователя, который владеет соответствующим бинарным файлом. Как вы можете представить, установка данного бита связана со значительным риском нарушения безопасности системы! В том случае, если владельцем бинарного файла является пользователь root, причем для файла установлен бит SUID, любой исполняющий данный файл пользователь будет иметь такие же права доступа, как и пользователь root. Как бы страшно это не звучало, существует несколько реальных вариантов использования данного механизма. Одним прекрасным примером его использования является утилита ping. Для получения доступа к сетевому аппаратному обеспечению, необходимому для отправки ping-пакетов узлу, пользователь должен обладать привилегиями пользователя root в рамках системы. Для того, чтобы все пользователи системы имели возможность использования утилиты ping, для соответствующего бинарного файла устанавливается бит SUID, после чего любой пользователь может исполнять его с теми же привилегиями, которыми обладает пользователь root в рамках системы. Проверьте специальные права доступа к бинарному файлу данной утилиты в вашей системе с помощью команды ls -l /bin/ping. Вы должны обнаружить установленный бит SUID.

Установка бита SUID для директорий не приводит к какому-либо эффекту.

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

Бит GUID используется главным образом по отношению к директориям. В том случае, если для директории устанавливается бит GUID, создаваемые в директории файлы наследуют идентификатор группы пользователей, владеющей директорией. Данный механизм очень полезен в случае работы группы пользователей с файлами из одной и той же директории. В обычных условиях при создании файла используется основной идентификатор группы пользователя. В рамках директории с установленным битом GUID пользователь все так же будет являться владельцем файла, но принадлежность к группе пользователей устанавливается автоматически на уровне системы, следовательно, все другие пользователи из данной группы также будут иметь доступ к созданному файлу.

Бит sticky: в первую очередь я хотел бы сказать о том, что я даже не представляю, по какой причине бит sticky обозначается с помощью символа t, а не символа s. Я искал информацию об этом во многих источниках и спрашивал многих специалистов. Оказалось, что никто не знает об этом. Возможно, кто-то из читателей журнала Linux Journal знает ответ на данный вопрос и может просветить меня. (В том случае, если я получу сообщение с ответом на данный вопрос, я приведу его текст в рубрике "Письма редактору"). В любом случае, бит sticky является специальным битом доступа, который устанавливается для директорий. Фактически, он не оказывает какого-либо воздействия в случае установки для файла.

В директориях, для которых установлен бит sticky, активируется дополнительный слой защиты созданных файлов. В обычных условиях при доступе множества пользователей к содержимому директории каждый пользователь имеет возможность удаления файлов другого пользователя. (Это справедливо даже для того случая, когда пользователи не имеют прав на запись содержимого этих файлов!) В случае установки бита sticky для директории файлы могут удаляться лишь теми пользователями, которые владеют ими. Данный механизм контроля доступа к элементам файловой системы может показаться излишним, но если вы рассмотрите такую директорию файловой системы многопользовательской системы Linux, как /tmp, вы сможете представить, насколько важным может оказаться бит sticky! Фактически, в том случае, если бы бита sticky не существовало, директория /tmp вашей системы превратилась бы в дикий дикий запад и гнусные стрелки могли бы вольно или невольно удалять файлы других пользователей. Вы можете обнаружить бит sticky в рамках вашей файловой системы с помощью команды ls -l / | grep tmp.

Установка специальных прав доступа к элементам файловой системы

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

  1. chmod u+s file.txt - установка бита SUID для файла с именем file.txt.

  2. chmod g-s file.txt - установка бита GUID для файла с именем file.txt.

  3. chmod o+t folder - установка бита sticky для директории с именем "folder".

Специальные права доступа также могут устанавливаться вместе с обычными правами доступа, следовательно, аналогичные команды являются полностью корректными:

chmod ug+rw,u+s,ugo-x file.txt

И как и в случае со стандартными правами доступа, имеется возможность (использование которой является предпочтительным) установки специальных прав доступа с использованием восьмеричной нотации. Для этого используется четвертое поле. При установке прав доступа аналогичным образом:

chmod 755 file.txt

также присутствует четвертое поле, которое не используется и считается, что его значение равно нулю. Следовательно, данная команда полностью аналогична следующей команде:

chmod 0755 file.txt

Поле с нулевым значением, расположенное перед полями с значениями стандартных прав доступа, используется для установки специальных прав доступа. В том случае, если вы отбрасываете данное поле, его значение считается равным нулю и специальные права доступа не устанавливаются. Однако, в том случае, если вы знаете о его существовании, вам будет проще понять методику его использования. Если вы читали упомянутую статью о правах доступа к элементам файловой системы из выпуска журнала за предыдущий месяц, вы наверняка обратили внимание на раздел с описанием методики использования восьмеричной нотации, информацию из которого можно с легкостью применить и к специальным правам доступа. На Рисунке 1 показано распределение значений между битами специальных прав доступа.

Восьмеричная нотация

Рисунок 1. Восьмеричная нотация

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

chmod 2770 <имя_директории>

А результирующая строка описания прав доступа (которая выводится в результате исполнения команды ls -l) будет выглядеть следующим образом (обратите внимание на символ s в нижнем регистре - помните, что он означает?):

drwxrws--- <имя_директории>

Как и при установке стандартных прав доступа к элементам файловой системы, в случае необходимости установки нескольких битов специальных прав доступа, вы можете просто складывать соответствующие значения. К примеру, для установки битов SUID и sticky вы должны будете использовать значение 5 четвертого восьмеричного поля. Обычно для определенного файла или директории устанавливается лишь один бит специальных прав доступа, но благодаря возможности использования восьмеричной нотации вы можете устанавливать их в любом кажущемся вам подходящем сочетании.

Надеюсь, две данные статьи позволят развеять ваши заблуждения относительно механизма прав доступа к элементам файловых систем в Linux. Более сложные модели управления правами доступа к элементам файловых систем могут основываться на списках контроля доступа (Access Control Lists - ACLs), но для большинства случаев стандартные строки прав доступа - это все, что вам нужно для управления доступом к файлам и директориям вашей системы.