Файлы и "права доступа" к ним.
Поскольку Unix - система многопользовательская, в ней предусмотрен механизм ограничивающий доступ юзеров к файлам и директориям.
Естественно, "доступ" означает не только возможность читать или изменять содержимое отдельных файлов, но и возможность создавать файлы (директории),
удалять их, запускать файлы (если они являются исполняемыми), менять им
названия, а также менять все те атрибуты, которые и определяют "право
доступа", то есть - "кто и что" может проделывать с данным файлом или
директорией.
Прежде всего надо отметить, что правильнее говорить не о "правах юзера" по отношению к какому-нибудь файлу, а о "правах процесса" (выполняемой программы).
- Во-первых, если юзер и вносит какие-то изменения в файлы или директории, он это делает с помощью каких-то программ (редакторов, "коммандеров", системных утилит для копирования, удаления файлов и т.п.), которые в момент выполнения являются процессами.
- Во-вторых (что более важно), не все программы запускаются юзерами "вручную". Некоторые из них (демоны) запускаются при старте системы. Другие могут запускаться в определенные моменты времени (с помощью программы cron), или вызываться по мере необходимости для обслуживания запросов приходящих по сети (обычно их запускает программа-"диспетчер" inetd). Кроме того, существует ряд программ, которые для выполнения каких-то вспомогательных действий сами запускают другие программы (в этом случае говорят, что процесс-"родитель" запустил процесс-"потомок"). Понятно, что хотелось бы и этим программам (процессам) ограничить доступ к файлам.
- И наконец, в-третьих, в некоторых случаях очень полезно, чтобы программа, запущенная юзером, имела больше прав, чем обычно имеет этот юзер. Например, обычный юзер не может даже читать файл, в котором "спрятаны" пароли всех юзеров. В то же время, любой юзер должен иметь возможность поменять свой личный пароль, не обращаясь для этого к администратору. Но для этого ему надо иметь возможность записать что-то в файл паролей. Значит программа, которая это делает (passwd) в момент выполнения должна иметь права намного большие, чем юзер, который ее запускает.
Не вдаваясь в подробности, можно сказать, что
- каждый процесс имеет идентификатор юзера (userID). Обычно он совпадает
с userID'ом того юзера, который запустил этот процесс.
- процессы, которые запустились автоматически, тоже имеют userID, как будто
их запустил реальный юзер. Чей именно userID получают эти программы обычно
определяется теми программами, которые их стартуют (программа-загрузчик, cron,
inetd и т.д.). В простейших случаях программы-"потомки" просто "наследуют"
userID от программы-"родителя", но некоторые "родители" могут запускать
программы с другим userID'ом (не совпадающим с собственным).
- некоторые программы в процессе выполнения могут поменять свой userID и,
соответственно, получить права, которые сам юзер не имел. Естественно,
для того, чтобы программа могла это сделать, администратор должен "разрешить"
ей такое поведение (подробнее об этом будет сказано ниже). Кстати, изменение
userID'а делается не только, когда нужно "расширить" права программы, но и
наоборот - "сузить" до прав какого-нибудь конкретного юзера.
- если процесс может изменять свой userID, то различают "реальный userID"
и "эффективный userID" (есть еще "сохраненный userID"). Реальный userID -
это идентификатор юзера, который запустил процесс (или userID
процесса-"родителя"). А эффективный - это новый userID, который задача
получила во время выполнения.
- права на файл (или директорию) определяются по "эффективному userID"
процесса. В простейшем случае, когда userID не меняется, "реальный" и
"эффективный" userID'ы совпадают и можно говорить просто об userID'е
процесса. Или даже просто о правах юзера (а не процесса) на файл.
Итак.
Иван Паскаль pascal@tsu.ru