С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Особые биты прав: setuid, setgid, sticky

6 мин Linux · GNU coreutils 9.4

Особые биты прав: setuid и setgid запускают программу с правами владельца, setgid и sticky — для общих каталогов.

Шпаргалка

7 команд Версия для печати
  • ls -ld /tmp /usr/bin/passwd t у /tmp, s у passwd
  • sudo chmod g+s /srv/team setgid: файлам — группу каталога
  • sudo chmod +t /srv/team sticky: чужое не удалить
  • sudo chmod 3770 /srv/team оба бита и rwx для группы
  • stat -c '%a %A %n' /srv/team 3770 drwxrws--T /srv/team
  • sudo chmod g-s,-t /srv/team снять оба бита
  • find / -perm -4000 -type f 2>/dev/null все setuid-программы

Обзор

Кроме rwx для владельца, группы и остальных у файла есть ещё три бита: setuid, setgid и sticky. В числовой записи они стоят первой из четырёх цифр: 4 — setuid, 2 — setgid, 1 — sticky. chmod 2775 = setgid + rwxrwxr-x.

Бит На программе На каталоге В ls -l
setuid (4) запуск с правами владельца файла — s у владельца
setgid (2) запуск с правами группы файла новые файлы получают группу каталога s у группы
sticky (1) — удалить файл может только владелец t у остальных

Заглавная буква значит, что бит стоит, а x под ним нет: S — setgid без g+x, T — sticky без o+x. Для каталога drwxrws--T — нормальная картина: остальные не входят в каталог, а sticky работает для участников группы.

Общий каталог: setgid и sticky вместе

Новый файл получает основную группу того, кто его создал. В общем каталоге это ломает работу: файл alice попадает в группу alice, и коллеги его не правят. setgid на каталоге меняет правило — файл получает группу каталога, подкаталоги наследуют и группу, и сам бит.

Право w на каталог разрешает удалять в нём любые файлы, даже чужие. sticky оставляет удаление и переименование владельцу файла, владельцу каталога и root. Так устроен /tmp:

text
student@ubuntu:~$ ls -ld /tmp
drwxrwxrwt 11 root root 4096 Oct 20 06:30 /tmp

Права на запись у группы новые файлы получают от umask создателя, а не от каталога: для общей работы нужна маска 002.

Рецепты

3

Каталог команды

bash
sudo groupadd devs
sudo usermod -aG devs alice          # alice — в группу; войти заново
sudo mkdir /srv/team
sudo chgrp devs /srv/team
sudo chmod 3770 /srv/team            # setgid + sticky + rwxrwx---
ls -ld /srv/team                     # drwxrws--T … root devs …

Проверка: файл alice получает группу devs и запись для группы (при маске 002), а bob удалить его не может:

text
student@ubuntu:~$ sudo -iu alice touch /srv/team/a.txt
student@ubuntu:~$ ls -l /srv/team
total 0
-rw-rw-r-- 1 alice devs 0 Oct 20 06:30 a.txt
student@ubuntu:~$ sudo -iu bob rm -f /srv/team/a.txt
rm: cannot remove '/srv/team/a.txt': Operation not permitted

Перевести уже лежащие файлы

bash
sudo chgrp -R devs /srv/team
sudo find /srv/team -type d -exec chmod g+s {} +

setgid действует на новые файлы. Старые и перенесённые через mv файлы сохраняют свою группу — их переводят руками.

Найти программы с setuid и setgid

bash
find / -perm -4000 -type f 2>/dev/null   # setuid
find / -perm -2000 -type f 2>/dev/null   # setgid

На чистой системе это десяток с небольшим программ: passwd, sudo, su, mount и подобные. Новая строка в списке — повод разобраться, кто и зачем поставил бит.

Неполадки

6

Новый файл в общем каталоге с личной группой

На каталоге нет setgid (ls -ld — x вместо s у группы) — поставь chmod g+s. Если бит есть, файл не создали, а перенесли через mv: он сохранил старую группу, переведи его chgrp.

Коллега удалил мой файл

У каталога нет sticky, а у группы есть w. Поставь chmod +t.

rm: cannot remove 'x': Operation not permitted

Файл чужой, а на каталоге sticky (t или T в конце ls -ld). Так и задумано: удалить файл может его владелец, владелец каталога или root.

chmod 775 не снял setgid с каталога

GNU chmod с числом из трёх-четырёх цифр не снимает setuid и setgid у каталогов. Снимай буквами: chmod g-s каталог — или числом с лишним нулём: chmod 00775.

chmod: changing permissions of 'x': Operation not permitted

Менять права может только владелец файла и root. Посмотри владельца в ls -l и запусти через sudo, если это твоя машина.

setuid на скрипте не работает

Ядро Linux не применяет setuid к скриптам с #! — только к программам. Для команды от root настрой sudo.

Опасно

1

Лишний setuid — путь к root

Программа с setuid от root, которая умеет читать или писать произвольные файлы или запускать команды, отдаёт права root любому пользователю. Не ставь u+s на свои программы и копии системных, держи список из find -perm -4000 под контролем.

Термины

3
setuid-бит (SUID) setuid bit (SUID)
Особый бит исполняемого файла: программа работает с правами владельца файла, а не того, кто её запустил. В ls -l — s на месте x владельца, как у /usr/bin/passwd. Ещё встречается в: Права доступа
setgid-бит (SGID) setgid bit (SGID)
Особый бит прав. На каталоге — новые файлы и подкаталоги получают группу каталога, а не основную группу создателя; на программе — запуск с правами группы файла. В ls -l — s на месте x группы. Ещё встречается в: Права доступа, umask, Пользователи и группы
sticky-бит sticky bit
Особый бит каталога: удалить или переименовать файл в нём может только владелец файла, владелец каталога или root. В ls -l — t на месте x остальных, как у /tmp. Ещё встречается в: chmod / chown

См. также

  • permissions — rwx, владелец и группа, числа прав.
  • chmod-chown — chmod буквами и числами, chgrp.
  • umask — с какими правами создаются новые файлы.
  • users-groups — группы пользователя, usermod -aG.
  • acl — права для отдельных пользователей и групп сверх rwx.
  • find — поиск по правам -perm.
Загрузка…