Помимо битов, устанавливающих разрешения на доступ к файлу, существуют специальные атрибуты, для которых предназначена еще одна триада битов:
r sticky bit (save text mode) — бит "липучка";
r SUID — бит подмены UID;
r SGID — бит подмены GID.
Sticky bit кодируется восьмеричной 1 (двоичная 001), SGID кодируется вось- меричной 2 (010), а SUID — 4 (100). В символьной нотации применяются символы t для sticky bit, s для SUID и SGID. Эти символы всегда выводятся в позиции, где обычно стоит флаг разрешения на исполнение (x). При этом:
r SUID отображается в виде буквы s в старшей триаде битов, отображаю- щей права владельца;
r SGID отображается в виде буквы s в средней триаде битов, отображаю- щей права группы;
r sticky bit отображается в виде буквы t в младшей триаде битов, отобра- жающей права для всех остальных.
Прописные символы S и T выводятся при отсутствии в этих триадах прав на исполнение, что обычно сигнализирует о ненормальном состоянии прав доступа.
Пример 6.19. Специальные биты прав доступа
$ ls -ld /tmp /bin/ping
-rws--x--x
1 root
root
32908 Окт 16 2002 /bin/ping
drwxrwxrwt
94 root
root
3488 Дек 14 20:31 /tmp
Приведенный пример 6.19 показывает, что на файл системной команды ping установлен бит SUID (символ s в старшей триаде вместо прав на исполнение), а на каталог /tmp установлен sticky bit (символ t в триаде прав остальных).
Атрибут sticky bit в GNU/Linux для файлов не используется, в ранних верси- ях UNIX он был предназначен для того, чтобы оставить в памяти образ про- граммы (save text mode).
Обычный процесс наследует права доступа к системным ресурсам от пользо- вателя, запустившего процесс, и его первичной группы (UID и GID), однако для исполняемых файлов, на которые установлены биты SUID и/или SGID, это не так.
При установленном на исполняемый файл бите SUID процесс выполняется не от имени пользователя, запустившего его, а от имени владельца исполняе- мого файла команды. Аналогично, при установленном бите SGID процесс исполняется не от имени первичной группы пользователя, запустившего про- цесс, а от имени группы пользователей файла.
У каждого процесса имеются четыре идентификатора:
r RUID — Real UID, который всегда равен UID пользователя, выполнивше- го команду;
r RGID — Real GID, который всегда равен GID пользователя, выполнивше- го команду;
r EUID — Effective UID, который равен либо RUID, либо если на исполняе- мый файл установлен бит SUID, то UID владельца файла;
r EGID — Effective GID, который равен либо RGID, либо если на исполняе- мый файл установлен бит SGID, то GID владельца файла.
В подавляющем большинстве случаев подмена владельца или группы осуще- ствляется на root или какого-либо привилегированного пользователя или группу. Например, при выполнении команды ping (см. пример 6.19), несмот- ря на то, что ее запустил обычный пользователь, она будет исполняться от имени root, т. к. он владеет ее исполняемым файлом. Это используется, на- пример, в таких программах, как passwd, которые требуют временного пре- доставления доступа обычному пользователю к тем ресурсам, к которым он не имеет доступа. Естественно, такие программы требуют особого подхода к разработке, т. к. представляют серьезную угрозу для безопасности системы. На файлы сценариев Shell биты SUID и SGID устанавливать можно, но они действовать не будут.
Установка sticky bit на каталог, в отношении которого пользователь имеет права на чтение и на запись, позволяет запретить удалять и изменять пользо- вателю чужие файлы в этом каталоге. Это используется при установке прав доступа к каталогу /tmp, открытому на запись всем, поскольку иначе пользо- ватель может удалить чужие временные файлы, находящиеся в этом катало- ге, что может повлечь нежелательные последствия.
При установке атрибута SGID на каталог вновь созданные файлы в этом ка- талоге будут наследовать группу владельцев по группе владельцев каталога (так называемый "стиль BSD"), вместо RGID процесса, создающего файл (пример 6.20).
В каталоге, на который установлен бит SGID, был создан файл (см. при- мер 6.20). При этом группа владельцев файла была назначена не по первич- ной группе пользователя, создавшего файл, а по группе пользователей ката- лога, в котором файл был создан.
Команда chmod позволяет установить особые биты доступа на файлы и ката- логи. Для этого команда chmod может быть выполнена со следующими аргу- ментами:
r u+s — для установки на файл бита SUID;
r g+s — для установки на файл или каталог бита SGID;
r o+t — для установки на каталог бита sticky bit.
Не обязательно устанавливать специальные биты в символьной нотации. Приведенная в примере 6.21 команда chmod 2775 d1 устанавливает бит SGID на каталог.
Пример 6.21. Установка SGID на каталог в восьмеричной нотации
$ mkdir d1
$ ls -ld d1
drwxr-x---
2 prof
prof
48 Dec 14 22:31 d1
$ chmod 2770
d1
$ ls -ld d1
drwxrws---
2 prof
prof
48 Dec 14 22:31 d1
В табл. 6.3 указаны результаты установки различных специальных прав дос- тупа на файлы и каталоги.
Таблица 6.3. Специальные биты прав доступа
Права
Эффект для каталогов
Эффект для файлов
-rws--x--x
—
Команда исполняется от имени владельца файла
-rwx--s--x
—
Команда исполняется от имени группы пользователей файла
drwxrws---
На файлы, создаваемые в каталоге, будет установлена такая же группа, как у каталога
—
drwxrwxrwt
В каталоге можно удалять или переименовывать только соб- ственные файлы