Подсистема Microsoft Interix Unix (ныне в отставке) для его ядра NT наносила немного по- другому с правами доступа пользователей и групп , чем некоторые другие делают:
Информация о пользователях и группах хранится в базе данных Security Access . И пользователи, и группы хранятся в одной базе данных, но имена групп и пользователей должны быть уникальными; ни одна группа не может иметь имя пользователя и наоборот. (Эта база данных заменяет /etc/passwd
и /etc/groups
файлы в UNIX.) Пользователи и группы создаются с помощью соответствующей методологии для Windows (Диспетчер пользователей, Active Directory пользователи и компьютеры или Локальные пользователи и группы) или с Win32 net user
командой. (Примеры сценариев оболочки для создания и удаления пользователей включены в каталог /usr/examples/admin
.) Пользователи могут принадлежать ко многим группам.
Вот некоторые более конкретные выдержки из руководства:
В Windows пользователь или группа могут владеть объектом. Это отличается от UNIX, в котором объект принадлежит только пользователю.
Windows идентифицирует всех пользователей и группы внутри, используя идентификатор безопасности (SID) . Алгоритм хеширования генерирует значения SID, которые являются уникальными; никакие два пользователя или группы не будут иметь одинаковый SID.
Пользователи и группы, которые имеют разрешение на доступ к объекту, идентифицируются по их идентификатору безопасности. Все объекты, которые могут быть защищены Windows, имеют дискреционный список контроля доступа (DACL), который состоит из отдельных записей, называемых записями контроля доступа (ACE). ACE включает в себя две важные части информации: SID пользователя или группы и описание степени доступа отдельного пользователя или группы к объекту.
команда chgrp
... Изменить идентификатор группы для файла ... пользователь, вызывающий chgrp (1), должен принадлежать к указанной группе и быть владельцем файла или иметь соответствующие привилегии.
CHOWN
... Операнды владельца и группы необязательны; однако, один должен быть указан. Если указан операнд группы, ему должно предшествовать двоеточие (:).
Владелец может быть указан либо числовым идентификатором пользователя, либо именем пользователя. Если имя пользователя также является числовым идентификатором пользователя, операнд используется в качестве имени пользователя. Группа может быть либо числовым идентификатором группы, либо именем группы. Если имя группы также является числовым идентификатором группы, операнд используется в качестве имени группы.
По соображениям безопасности владение файлом может быть изменено только процессом с соответствующими привилегиями.
Насколько я понимаю, это означает, что если ваша учетная запись пользователя принадлежит группе Windows с достаточными правами для изменения прав доступа к файлу, принадлежащему этой группе, то chgrp
этот файл может эффективно оказаться вне контроля вашей учетной записи пользователя. Это составляет меньший контроль, чем вы могли бы иметь и с chown
явными user:group
параметрами. В этом контексте без возможности заявить, user:
и :group
вы никогда не могли бы достичь тех же результатов, что и иначе.
Здесь приведена ссылка на подробный обзор взаимодействия Interix с ACL Windows с акцентом на то, как эти знания могут применяться к файловым системам Samba в других вариантах Unix.
Вот ссылка на ныне устаревший документ Solaris, описывающий настраиваемый файл, rstchown
который ...
Указывает, действует ли семантика POSIX для chown(2)
системного вызова ...
Видимо, если для параметра установлено значение 0
...
... отключение семантики POSIX открывает возможности для различных дыр в безопасности. Это также открывает возможность для пользователя изменить владельца файла на другого пользователя и не может получить файл обратно без вмешательства пользователя или системного администратора.
Такая опция не делает недействительной POSIX-совместимость Solaris . Только то, что это опция вообще, квалифицирует ее как соответствующую :
Хотя все реализации, соответствующие POSIX.1-2008, поддерживают все функции, описанные ниже, могут существовать системные или файловые процедуры конфигурации, которые могут удалить или изменить
любую или все эти функции. Такие конфигурации не должны быть сделаны, если требуется строгое соблюдение.
Следующие символические константы должны быть определены со значением, отличным от -1. Если константа определена с нулевым значением, приложения должны использовать sysconf()
, pathconf()
или fpathconf()
функцию, или
getconf
утилиту, чтобы определить , какие функции присутствуют в системе , в то время , или для конкретного имени пути в вопросе.
_POSIX_CHOWN_RESTRICTED
Использование chown()
ограничено процессом с соответствующими привилегиями и изменением идентификатора группы файла только на эффективный идентификатор группы процесса или на один из его дополнительных идентификаторов группы.
chown()
Функция системы - которая является документированной системой вызова производится как в chown
и chgrp
оболочке утилита - это указана на провал по многим причинам. Из их:
EACCES
В компоненте префикса пути запрещен поиск.
ELOOP
В символических ссылках, встречающихся при разрешении аргумента пути, существует цикл.
EPERM
Действующий идентификатор пользователя не соответствует владельцу файла, или вызывающий процесс не имеет соответствующих привилегий, а _POSIX_CHOWN_RESTRICTED указывает, что такая привилегия требуется.
Однако поведение предоставления прав изменения прав пользователям без полномочий root никогда не было уникальным для Solaris. В этом сообщении на форуме есть очень хорошее, хотя и несколько устаревшее, разрешение на доступ к файлам Unix, в котором автор заявляет:
Изначально Unix позволял владельцу файла отдавать файл. Владелец файла может сменить владельца на кого-то другого. У пользователя, не являющегося пользователем root, не было возможности отменить эту операцию ... BSD [позже] был удален chown
из пользователей без полномочий root ... [частично потому что] ... он реализовал дисковые квоты, которые могли ограничить объем дискового пространства пользователь может иметь в файловой системе ... Непослушные пользователи могут отдавать большие файлы, чтобы пройти мимо квот.
Сегодня нелегко сказать, может chown
ли файл без полномочий root . Многие версии Unix допускают оба поведения ...
Еще одна хорошая и более свежая публикация в списке рассылки цитирует это и продолжает:
По умолчанию с большинством ОС chown
ограничено только root. И существует единодушное мнение, что так должно быть и по соображениям безопасности. Если некорневой пользователь не меняет владелец файла и любое выполнение бит включен, SUID
и SGID
биты должны быть очищены. Это может случиться или не случиться с root
.
Я думаю, что последний абзац говорит это хорошо.
Эта статья также ссылается CAP_CHOWN
на управление этим средством в Linux (это должно влиять только на POSIX_CHOWN_RESTRICTED
поведение) . Существует также CAP_FOWNER
возможность, которая немного отличается по поведению.
И как вы указали в 2003 году :
Обратите внимание, что по крайней мере в HPUX вы можете сменить владельца ваших файлов ( root
например, на), даже если вы не являетесь привилегированным пользователем ...
... который зависит от setprivgroup
параметра конфигурации .
В любом случае, когда пользователь без полномочий root может манипулировать правами доступа к файлам, вполне возможно, как указано в обосновании, приведенном в вашем вопросе, что пользователь может chown
иметь файл, которым владеет этот пользователь, так что он принадлежит другому пользователю. Если принадлежность группы файла и группы chown
пользователей не совпадают, пользователь больше не сможет изменять этот файл.
В этом случае , chown
то chgrp
потерпит неудачу , как пользователь больше не будет иметь права изменять разрешения этого файла, а chown user:group
- до тех пор , как группа является одним пользователем собственного - преуспеет.
Есть , вероятно , многие другие нишевые ситуации , которые могут привести аналогичным образом , который может включать в себя каталог Sticky и / или setgid бит, файловую систему и / или реализация конкретных списки контроля доступа. Эта тема интересна, например. Бесчисленные перестановки находятся далеко за пределами моего собственного слабого понимания - вот почему этот ответ вики. Если вы читаете это, вы верите, что это стоит улучшить, и вы верите, что умеете - пожалуйста, сделайте .
Здесь также имеется обширная документация по различным возможным последствиям прав доступа к файлам, обхода дерева и символических ссылок, которые могут привести к аналогичному сбою в отношении -R
экстремальных chown
приложений:
Из заголовков раздела POSIX XRAT Третий и Четвертый Домены :
Как правило, пользователи, указывающие опцию обхода файловой иерархии, хотят работать с единственной физической иерархией, и поэтому символические ссылки, которые могут ссылаться на файлы вне иерархии, игнорируются. Например, файл chown owner - это операция, отличная от той же команды с указанным параметром -R. В этом примере поведение команды chown
owner
file
описано здесь, в то время как поведение chown -R
файла владельца команды описано в третьем и четвертом доменах.
... Существует проблема безопасности с дефолтом до логического блуждания. Исторически chown -R
файл командного пользователя был безопасен для суперпользователя, поскольку биты setuid и setgid были потеряны при изменении владельца файла. Если бы обход был логичным, изменение владельца больше не было бы безопасным, потому что пользователь мог вставить символическую ссылку, указывающую на любой файл в дереве. Опять же, это потребовало бы добавления опции к командам, выполняющим обход иерархии, чтобы они не были косвенными по символическим ссылкам, и исторические сценарии, выполняющие рекурсивные обходы, сразу же стали бы проблемами безопасности. Хотя это в основном проблема для системных администраторов, предпочтительно не использовать разные значения по умолчанию для разных классов пользователей.
...
В 4.3 BSD chgrp
при обходе дерева изменилась группа символьной ссылки, а не цель. Символические ссылки в 4.4 BSD не имели атрибутов владельца, группы, режима или других стандартных системных файлов UNIX.
И на самой chgrp
странице POSIX есть то, что указывает на возможное незавершенное -R
действие или, по крайней мере, на то, что раньше было:
Версии System V и BSD используют разные коды состояния выхода. Некоторые реализации использовали состояние выхода как счетчик числа произошедших ошибок; эта практика неосуществима, поскольку она может выходить за пределы диапазона допустимых значений состояния выхода. Стандартные разработчики решили замаскировать их, указав только 0 и> 0 в качестве выходных значений.