[ Содержание ]
Кроме базовых прав доступа в 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, у user1 — user1. Поэтому эти файлы принадлежат именно эти группам.
Для решения проблемы необходимо сделать так, что бы все вновь создаваемые файлы принадлежали той группе, в которую входят оба пользователя. Это можно сделать, установив 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.
[ Содержание ]