Базовый механизм разделения прав в UNIX-подобных системах основан на понятиях UID,или User ID(идентификатор пользователя) и GID,или Group ID(идентификатор группы, которой принадлежит пользователь). UID и GID – числа, но обычно с ними связывают текстовые имена. Каждый процесс имеет «реальные» UID и GID (ruid/rgid), которые не меняются со временем, а также список дополнительных групп, в которые он входит. Кроме реальных, процесс имеет «эффективные» UID и GID (euid/egid), которые определяют его текущие возможности (т. е. именно по ним определяются его права), а также «сохранённые» UID и GID (suid/sgid) – в них копируются эффективные UID/GID при смене UID/GID. Смена UID/GID может происходить, если у процесса есть такое разрешение (capability) или его EUID либо SUID равен 0.
Пользователь с UID = 0 обычно имеет текстовое имя ' root
' и имеет почти неограниченные права, поэтому часто его называют «суперпользователь».
Чаще всего, наверное, приходится сталкиваться с правами на файловой системе. Здесь каждый объект (файл, ссылка, каталог, устройство, сокет, канал, далее будем для краткости писать «файл») имеет владельца и группу, а также связанные с ними права – чтение, запись и исполнение. Часто для их записи используют восьмеричную запись или формат команды ls
. Например, права с восьмеричным кодом 750
(в выдаче ls rwxr-x–
) обозначают, что владельцу разрешено чтение, запись и исполнение ( rwx / 7
), группе – чтение и исполнение ( r-x / 5
), остальным – ничего ( -– / 0
).
Проверка прав производится в таком порядке – если владелец файла совпадает с EUID, берутся права владельца. Иначе, если группа или одна из дополнительных групп совпадают с группой файла, то берутся права группы, и в противном случае – права «остальные».
Для каталога право на «исполнение» означает возможность войти в каталог. При этом посмотреть список файлов в нём не гарантируется – для этого нужно право на чтение. Право на запись означает возможность создавать и удалять файлы в каталоге. Сменить права на файл (или другой объект) может только его владелец. Если нужно сменить права для группы, то владелец должен в неё входить. Ну и конечно, суперпользователь может менять любые права, а также владельца и группу любого файла.
Как уже было сказано, право записи в каталог позволяет создавать и удалять в нём файлы. В том числе чужие. Чтобы обеспечить комфорт работы с общими каталогами, например /tmp
, и не позволять удаление чужих файлов, был придуман дополнительный «липкий» флаг ( sticky
). Если каталог обладает им, то удаление файлов разрешается только тем, кто владеет файлом и имеет право записи в каталог (и root
-у, конечно).
Раз уж мы коснулись файловой системы, то стоит отметить ещё два флага – suid
и sgid
. Если файл имеет флаг suid
, то при его запуске EUID процесса сменится на владельца файла. Для sgid
– аналогично, но для группы. Чаще всего он ставится на файлы, исполнение которых необходимо с правами суперпользователя, например passwd
. Для скриптов они не работают. Если флаг sgid
устанавливается на каталог, то созданные в нём файлы и каталоги автоматически наследуют группу. Флаг suid
на каталогах игнорируется.
Как уже упоминалось выше, посмотреть права можно командой ls
. В строке прав первым символом показывается тип файла (' -
' = файл, ' d
' = каталог, ' l
' = ссылка, ' s
' = сокет и т. п.), далее три группы прав владельца, группы и остальных по три символа ' r/-
', ' w/-
' ' x/-
' для чтения, записи и исполнения соответственно (' -
' означает отсутствие прав). Флаг sticky
обозначается символом ' t
' вместо ' x
' в группе «остальные». флаги suid/sgid – символом ' s
' вместо ' x
' в группе «владелец» или «группа» соответственно. Если за этой строчкой идёт символ ' +
', это значит, что на этот файл установлены acl (см. ниже).
Менять права на файл можно командой chmod
. Сменить владельца файла – командой chown
, группу – chgrp
. Для того, чтобы сменить права на файл, команде chmod нужно указать новые в восьмеричном виде или в символьном. Последний вариант позволяет добавить или удалить отдельные права для владельца, группы или остальных, например:
В символьном виде для chmod
указывается один или более символов ' u/g/o/a
' (владелец, группа, остальные, все три группы вместе), затем символ ' +
' или ' -
' для установки или сброса прав, и затем один или более символов ' r/w/x
' – какие права затрагиваются. Например, chmod go+rx myfile
добавит права на чтение и исполнение для группы и остальных файлу myfile
.
Читать дальше