====== Специальные права ====== Источник - http://kryukov.biz/wiki/Специальные_права Кроме базовых прав доступа в 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, и именно поэтому обыкновенный пользователь может изменить свой пароль. При выполнении программы [[linux:chmod|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**.