Каталог команды
Проверка: файл alice получает группу devs и запись для группы (при маске
002), а bob удалить его не может:
Особые биты прав: setuid и setgid запускают программу с правами владельца, setgid и sticky — для общих каталогов.
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 работает для участников группы.
Новый файл получает основную группу того, кто его создал.
В общем каталоге это ломает работу: файл alice попадает в группу alice, и
коллеги его не правят. setgid на каталоге меняет правило — файл получает группу
каталога, подкаталоги наследуют и группу, и сам бит.
Право w на каталог разрешает удалять в нём любые файлы, даже чужие. sticky
оставляет удаление и переименование владельцу файла, владельцу каталога и root.
Так устроен /tmp:
Права на запись у группы новые файлы получают от umask создателя, а не от
каталога: для общей работы нужна маска 002.
Проверка: файл alice получает группу devs и запись для группы (при маске
002), а bob удалить его не может:
setgid действует на новые файлы. Старые и перенесённые через mv файлы
сохраняют свою группу — их переводят руками.
На чистой системе это десяток с небольшим программ: passwd, sudo, su,
mount и подобные. Новая строка в списке — повод разобраться, кто и зачем
поставил бит.
На каталоге нет setgid (ls -ld — x вместо s у группы) — поставь
chmod g+s. Если бит есть, файл не создали, а перенесли через mv: он сохранил
старую группу, переведи его chgrp.
У каталога нет sticky, а у группы есть w. Поставь chmod +t.
Файл чужой, а на каталоге sticky (t или T в конце ls -ld). Так и задумано:
удалить файл может его владелец, владелец каталога или root.
GNU chmod с числом из трёх-четырёх цифр не снимает setuid и setgid у
каталогов. Снимай буквами: chmod g-s каталог — или числом с лишним нулём:
chmod 00775.
Менять права может только владелец файла и root. Посмотри владельца в ls -l и
запусти через sudo, если это твоя машина.
Ядро Linux не применяет setuid к скриптам с #! — только к программам. Для
команды от root настрой sudo.
Программа с setuid от root, которая умеет читать или писать произвольные файлы
или запускать команды, отдаёт права root любому пользователю. Не ставь u+s на
свои программы и копии системных, держи список из find -perm -4000 под
контролем.
chmod буквами и числами, chgrp.usermod -aG.-perm.Есть неточность? Сообщить об ошибке в статье