SUID / SGID: что это такое и как их использовать

Автор: | 02/05/2013
 

unix-logoЧто такое SUID / SGID?

Расшифровывается эта аббревиатура как Set User Identifier и Set Group Identifier соответственно.

Так называются биты, указывающие особые права доступа к файлам и каталогам, наряду с обычными правами — rwx. Проверить наличие такого бита можно с помощью команды ls -l, например:

#  ls -l `which lsof`
-rwxr-sr-x  1 root  kmem  127652 Jan  4 16:11 /usr/local/sbin/lsof

Кроме привычных rwx в описании прав доступа к файлу присутствует буква s — это и есть идентификатор установленного SUID на этот файл.

Зачем нужены SUID и SGID?

Есть достаточно много программ и файлов, которые должны принадлежать пользователю root, и в то же время — простые пользователи должны иметь возможность выполнять его. Для примера — утилита passwd, которая находится в каталоге /usr/bin/passwd и которая имеет дело с файлом /etc/passwd, редактировать который может только пользователь root:

# ls -la /etc/passwd
-rw-r—r—   1 root    root     3256 2012-11-02 11:45 passwd

Для того, что бы дать пользователям возможность менять свои пароли — на файл утилиты установлен бит SUID:

# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 41284 2011-06-24 12:36 /usr/bin/passwd

SUID даёт возможность на время выполнения файла (запущенного им процесса) непривелигированному пользователю получить права пользователя — владельца файла, в данном случае — root.

Бит SGID аналогичен SUID, но устанавливаются права не пользователя файла, а группы — владельца файла. Так же, все файлы, создаваемые в каталоге с установленным SGID будут получать идентификатор группы — владельца каталога, а не владельца файла. Новые каталоги, создаваемые в каталоге с установленным SGID будут его наследовать от каталога-родителя.

Так же, следует учитывать, что SUID установленный, установленный на файл перекрывает SGID, установленный на каталог.

Что бы найти все файлы и каталоги с установленными SUID и SGID выполните:

# find / -type f -perm -04000 -o -perm -02000 | less

Вы увидите, что таких файлов достаточно много.

Что бы установить бит SUID выполните:

# chmod u+s /usr/bin/filename

Что бы установить SGID — выполните:

# chmod g+s /usr/bin/filename

Что бы снять бит SUID с файла выполните:

# chmod a-s /usr/bin/filename

SUID / SGID и безопасность

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

# cat /etc/fstab | grep tmp
/dev/da0p4      /tmp            ufs     rw,noexec,noatime,nosuid       2       2

Так же, на некоторых серверах полезно установить такой флаг на раздел, содержащий домашние каталоги пользователей.