Содержание
Что такое 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
Так же, на некоторых серверах полезно установить такой флаг на раздел, содержащий домашние каталоги пользователей.