====== Специальные права ======
Источник - 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**.