Некоторое время назад, во время разговора в IRC, один пользователь канала, в котором я участвовал, предложил кому-то установить каталог, чтобы он унаследовал идентификатор пользователя в файлах, чтобы решить проблему, возникшую у кого-то еще. В то время я высказался и сказал, что «linux не поддерживает каталоги setuid». После этого советник показал мне пастебин (http://codepad.org/4In62f13) его системы, соблюдая разрешение setuid, установленное для каталога.
Просто для объяснения: когда я говорю «linux не поддерживает каталоги setuid», я имею в виду, что вы можете перейти в «каталог chmod u + s», и он установит бит в каталоге. Однако Linux (как я понял) игнорирует этот бит (в каталогах).
Как я ни старался, я просто не могу точно воспроизвести этот pastebin. Кто-то однажды предположил мне, что можно было бы имитировать поведение с помощью selinux - и, играя с правилами, можно принудительно использовать uid для файла, но не из разрешения каталога setuid (что я вижу). Чтение в Интернете было довольно неинформативным - в большинстве случаев утверждается, что «нет, setuid для каталогов не работает с Linux», а иногда «это можно сделать при определенных обстоятельствах» (например, это: http://arstechnica.com/etc/linux/2003/linux.ars-12032003.html)
Я не помню, кем был исходный человек, но исходная система была системой debian 6, а файловая система, на которой она работала, была xfs смонтирована с "default, acl". Я пробовал воспроизвести это, но пока не повезло (до сих пор пробовал с различными версиями debian, ubuntu, fedora и centos)
Может ли кто-нибудь подсказать мне, что и как заставить систему соблюдать setuid в каталоге?
Setuid для каталогов не ведет себя как setgid. Если только оболочка не выходила из FreeBSD, кому-то было скучно и он немного развлекался за ваш счет.
Разрешение setuid, установленное для каталога, игнорируется в системах UNIX и Linux. [4] FreeBSD может быть настроен так, чтобы интерпретировать его аналогично setgid, а именно, чтобы все файлы и подкаталоги принадлежали владельцу верхнего каталога. [5]
В FreeBSD каталоги ведут себя так, как если бы их бит setgid был установлен всегда, независимо от его фактического значения. Как указано в open (2), «при создании нового файла ему дается группа каталога, в котором он находится».
http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories
Частичный ответ / обходной путь:
Я пытался сделать то же самое, решил не бороться и попробовать другой метод. Я пробовал использовать списки контроля доступа, чтобы установить разрешения по умолчанию. (Примечание: вам может потребоваться сначала включить их).
setfacl -R --set-file=- . <<EOF
# file: testdir/
# owner: testuser
# group: testgroup
user::rwx
group::rwx
group:normaluser:rwx
mask::rwx
other::r-x
default:group::rwx
default:group:normaluser:rwx
default:mask::rwx
default:other::r-x
EOF
Здесь testuser используется для запуска тестов, и обычный пользователь может удалить результаты, не используя root (каждый раз).
От RHEL man chmod
chmod сохраняет биты set-user-ID и set-group-ID каталога, если вы явно не укажете иное. Вы можете устанавливать или очищать биты с помощью символьных режимов, таких как u + s и g-s, и вы можете устанавливать (но не очищать) биты с помощью числового режима.
Численно, если я правильно помню, chmod 4711 ./dir
добавляет установленный бит UID, chmod 2711 ./dir
добавляет для этого установленный бит gid 6711
установка наследования uid + gid согласно демонстрации в pastebin.
На странице руководства chmod u+s
== chmod 4XXX
и chmod g+s
== chmod 2XXX