Специальные права

Кроме базовых прав доступа в inode файла находятся еще три бита, описывающие специальные права доступа.

  • SUID (Set UID) — программа, у которой установлен этот бит, выполняется с правами хозяина файла программы. Имеет смысл только при установке на исполняемые файлы.
  • SGID (Set GID) — назначение бита аналогично SUID, только программа выполняется с правами группы, которой принадлежит файл. Кроме исполняемых файлов этот бит может устанавливаться на директории.
  • Stiky — бит имеет смысл только если он установлен на директорию. Означает, что в этой директории файл может удалить только его хозяин. (Суперпользователь может удалять любые файлы, в том числе и не принадлежащие ему.)

SUID

Рассмотрим пример применения бита SUID. В системе любой пользователь может поменять себе пароль. Новый пароль записывается в файл /etc/shadow:

$ ls -l /etc/shadow
-rw-r-----  1 root shadow 500 2005-03-02 17:14 /etc/shadow
$

Как видно из прав доступа файла shadow, право на запись имеет только суперпользователь root (Наличие право на чтение для группы — это особенность дистрибутива Slackware Linux, в других дистрибутивах права доступа обычно устанавливаются в 600). То есть другие пользователи системы не имеют права изменять содержимое этого файла, поэтому они не имеют права на изменение пароля. Но ведь каким-то образом им удается изменить свой пароль!

Для изменения пароля используется программа passwd.

$ ls -l /usr/bin/passwd
-rws--x--x  1 root bin 37880 2004-06-21 23:20 /usr/bin/passwd*
$

Обратите внимание на символ s, который стоит вместо x в правах хозяина файла. Наличие этого символа говорит о том, что у этого файла установлен бит SUID. А это значит, что программа будет выполняться с правами пользователя, которому принадлежит файл — с правами пользователя root! Root имеет право на запись в файл shadow, и именно поэтому обыкновенный пользователь может изменить свой пароль.

При выполнении программы chmod для установки бита SUID можно пользоваться как числовым, так и символьным форматом. Например:

$ ls -l test
-rwxr-x--x  1 artur users 12 2005-06-06 11:53 test*
$ chmod 4751 test
$ ls -l test
-rwsr-x--x  1 artur users 12 2005-06-06 11:53 test*
$

4 — это обозначение бита SUID. При установке SUID-бита с использованием символьного формата записи, строка будет выглядеть так:

$ chmod u+s test
$ ls -l test
-rwsr-x--x  1 artur users 12 2005-06-06 11:53 test*
$

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

$ chmod 0751 test
$ ls -l test
-rwxr-x--x  1 artur users 12 2005-06-06 11:53 test*
$
Внимание! SUID-бит — это очень опасный механизм. Вы как администратор системы должны постоянно контролировать наличие файлов с установленным SUID-битом. Это можно сделать при помощи программы поиска файлов в файловой системе find.
$ find /usr/bin -perm +4000
/usr/bin/lppasswd
/usr/bin/crontab
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/chage
/usr/bin/expiry
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/procmail
/usr/bin/rcp
/usr/bin/rsh
/usr/bin/traceroute6
/usr/bin/rlogin
/usr/bin/traceroute
$

SGID

Бит SGID на исполняемые файлы устанавливается очень редко. Его основное назначение — организация работы группы пользователей над файлами одного проекта.

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

Предположим, что для размещения файлов проекта выделена отдельная директория, например, /usr/local/project. Для пользователей, работающих над проектом, создана специальная группа pr1, в которую добавлены пользователи artur и user1. На директорию установлены следующие права доступа:

$ ls -ld /usr/local/project
drwxrwx--- 2 root pr1 4096 2005-06-06 14:58 /usr/local/project
$

Поскольку пользователи artur и user1 входят в группу pr1, они имеют право на создание файлов в этой директории. Каждый пользователь создал в директории новый файл.

$ ls -l /usr/local/project/
итого 0
-rw-rw----  1 artur users 0 2005-06-06 15:06 artur_file
-rw-rw----  1 user1 user1 0 2005-06-06 15:09 file_user1
$

Как видно из прав доступа к файлам, artur ничего не может сделать с файлом пользователя user1 и наоборот. Они могут только удалить эти файлы, но не изменить их содержимое. Почему так получилось? Дело в том, что файл принадлежит пользователю, его создавшему, и основной группе пользователя. У artur основная группа — users, у user1user1. Поэтому эти файлы принадлежат именно эти группам.

Для решения проблемы необходимо сделать так, что бы все вновь создаваемые файлы принадлежали той группе, в которую входят оба пользователя. Это можно сделать, установив SGID-бит на директорию /usr/local/project. Тогда все создаваемые в этой директории файлы будут принадлежать не основным группам пользователей, а группе, которой принадлежит директория project.

# chmod g+s /usr/local/project
# ls -ld /usr/local/project
drwxrws--- 2 root pr1 4096 2005-06-06 15:09 /usr/local/project
# rm /usr/local/project/*
#

Изменение прав доступа к директории производил суперпользователь root. У root символ приглашения командной строки обычно заканчивается на #.

Обратите внимание на символ s, который стоит вместо x в правах группы. Таким образом обозначается бит SGID.

Теперь пользователь artur создаст в директории project свой файл (во всех дальнейших примерах необходимо учитывать, что установлена umask 007):

$ touch /usr/local/project/artur_file
$ ls -l /usr/local/project/
итого 0
-rw-rw----  1 artur pr1 0 2005-06-06 15:20 artur_file
$

Новый файл принадлежит пользователю artur и группе pr1, а не группе users. Если в этой директории создаст файл пользователь user1, файл тоже будет принадлежать группе pr1.

$ touch /usr/local/project/file_user1
$ ls -l /usr/local/project
итого 0
-rw-rw----  1 artur pr1 0 2005-06-06 15:20 artur_file
-rw-rw----  1 user1 pr1 0 2005-06-06 15:22 file_user1
$

Теперь оба пользователя могут работать с файлами этого проекта.

Внимание! При создании новой директории в директории с уже установленным SGID-битом, у созданной директории SGID-бит устанавливается автоматически!
$ mkdir /usr/local/project/dir
$ ls -l /usr/local/project
итого 4
-rw-rw----  1 artur pr1    0 2005-06-06 15:20 artur_file
drwxrws---  2 user1 pr1 4096 2005-06-06 15:24 dir/
-rw-rw----  1 user1 pr1    0 2005-06-06 15:22 file_user1
$

Stiky

Stiky-бит применяется только к директориям. Если такой бит установлен на директорию, значит, в этой директории файл может удалить только хозяин файла или суперпользователь. Stiky-бит рекомендуется устанавливать на публичные директории, такие как: /tmp и /var/tmp.

$ ls -ld /tmp
drwxrwxrwt  27 root root 4096 2005-06-06 11:28 /tmp/
$ ls -ld /var/tmp
drwxrwxrwt  5 root root 4096 2005-06-05 17:28 /var/tmp/
$

На эти директории установлены права 777, то есть кто угодно может создавать файлы и удалять их. Но обратите внимание на символ t в правах доступа для всех остальных пользователей системы. Он означает, что у директории установлен stiky-бит.

Обозначение

Поскольку специальные права используются крайне редко, при выводе программы ls символ, их обозначающий, закрывает символ стандартных прав доступа. И не понятно, rwt — это rw- или rwx? Определить, стоит ли символ стандартных прав доступа под символами s и t очень просто. Если t маленькое, значит x установлен. Если T большое, значит x не установлен. То же самое правило распространяется и на s.