Внешний вид сайта:

Права доступа к файлам в Linux

Любой ресурс компьютера под управлением ОС Linux представляется как файл, поэтому мы будем говорить только о правах доступа к файлу.

Как многопользовательская операционная система, ОС Linux содержит механизм разграничения доступа к данным, позволяющий как защитить данные одного пользователя от нежелательного вмешательства других, так и разрешить другим доступ к этим данным для совместной работы.

Говоря о правах доступа пользователя к файлам, стоит заметить, что в действительности манипулирует файлами не сам пользователь, а запущенный им процесс (например, утилита cat). Поскольку и файл, и процесс создаются и управляются системой, ей нетрудно организовать какую угодно политику доступа одних к другим, основываясь на любых свойствах процессов как субъектов и файлов как объектов системы.

В Linux, однако, используются не какие угодно свойства, а результат идентификации пользователя — его UID. Каждый процесс системы обязательно принадлежит какому-нибудь пользователю, и идентификатор пользователя (UID) — обязательное свойство любого процесса Linux. Когда программа login запускает стартовый командный интерпретатор, она приписывает ему UID, полученный в результате диалога. Все процессы, запущенные пользователем во время терминальной сессии, будут иметь его идентификатор.

Пользователь может быть членом нескольких групп, равно как и несколько пользователей может быть членами одной и той же группы. Исторически сложилось так, что одна из групп — группа по умолчанию — является для пользователя основной: когда (не вполне точно) говорят о «GID пользователя», имеют в виду именно идентификатор группы по умолчанию. Пользователь не может не быть членом как минимум одной группы, как снаряд не может не попасть в эпицентр взрыва! Часто процедуру создания пользователя проектируют так, что имя группы по умолчанию совпадает с входным именем пользователя, а GID пользователя — с его UID. Однако это совсем не обязательно: не всегда нужно заводить для пользователя отдельную группу, а если заводить, то не всегда удаётся сделать так,чтобы желаемый идентификатор группы совпадал с желаемым идентификатором пользователя.

При создании объектов файловой системы — файлов, каталогов и т. п. — каждому в обязательном порядке приписывается UID — идентификатор пользователя-владельца файла, GID — идентификатор группы, которой принадлежит файл, тип объекта и набор т. н. атрибутов, а также некоторую дополнительную информацию. Атрибуты определяют, кто и что с файлом имеет право делать, и описаны ниже.

В Linux существует выделенный пользователь системы, на которого не распространяются ограничения прав доступа - суперпользователь (root). UID суперпользовательских процессов равен 0: так система отличает их от процессов других пользователей. Именно суперпользователь имеет возможность произвольно изменять владельца и группу файла. Ему открыт доступ на чтение и запись к любому файлу системы и доступ на чтение, запись и использование к любому каталогу. Наконец, суперпользовательский процесс может на время сменить свой собственный UID с нулевого на любой другой. Среди учётных записей Linux всегда есть запись по имени root («корень»), соответствующая нулевому идентификатору, поэтому вместо «суперпользователь» часто говорят «root». Множество системных файлов принадлежат root-у, множество файлов только ему доступны на чтение или запись. Пароль этой учётной записи — одна из самых больших драгоценностей системы. Свойство root иметь доступ ко всем ресурсам системы накладывает очень высокие требования на человека, знающего пароль root. Суперпользователь может всё — в том числе и всё поломать, поэтому любую работу стоит вести с правами обычного пользователя, а к правам root прибегать только по необходимости. Существует два различных способа получить права суперпользователя.

Первый — это зарегистрироваться в системе под этим именем, ввести пароль и получить стартовую оболочку, имеющую нулевой UID. Это — самый неправильный способ, пользоваться которым стоит, только если нельзя применить другие. Что в этом случае выдаст команда last ? Что тогда-то с такой-то консоли в систему вошёл неизвестно кто с правами суперпользователя и что-то там такое делал. С точки зрения системного администратора, это — очень подозрительное событие, особенно, если сам он в это время к указанной консоли не подходил... сами администраторы такой способ не любят.

Второй способ — это воспользоваться специальной утилитой su (shell of user), которая позволяет выполнить одну или несколько команд от лица другого пользователя. Отличие от предыдущего способа — в том, что всегда известно, кто именно запускал su, а значит, с кого спрашивать за последствия.

В некоторых случаях удобнее использовать не su, а утилиту sudo, которая позволяет выполнять только заранее заданные команды.

Утилита id (см. man id) выводит входное имя пользователя и соответствующий ему UID, а также группу по умолчанию и полный список групп, членом которых он является.

Вся информация о пользователях и группах, зарегестрированных в систееме, хранится в файлах /etc/passwd, /etc/shadow и /etc/groups

Таким образом, конкретный пользователь по отношению к его собственным файлам выступает как их владелец (u - user).

У каждого файла есть еще и группа (g - group), к которой принадлежит владелец файла.

Кроме владельца и группы в системе могут существовать и другие пользователи. Поэтому в атрибутах файла содержаться значения, запрещающие или разрешающие доступ всем другим (o - other), кто не вошел в группу и не является владельцем.

Возможные действия над файлом

Что можно делать с файлом после его создания? В первую очередь просматривать, или читать (r - read). Во вторую очередь, файл можно изменить (дописать, исправить, переименовать, переместить). Таким образом, мы можем говорить о возможности записи (w - write) в файл. Если файл является программой, то его содержимое представляет собой команды для процессора, выполнение которых приводит к тому или иному желаемому (мы надеемся) эффекту. Другими словами, некоторые файлы можно исполнять (x - execution).

Право чтения, записи и выполнения являются основными правами доступа к файлам, однако, существуют еще дополнительные атрибуты, с помощью которых можно управлять правами доступа к файлам (о них будет сказано ниже).

Представление прав доступа

Основные атрибуты прав доступа можно представить в виде двеннадцати битов двоичного числа, равных 1, если атрибут установлен, и 0, если нет. Порядок битов в числе следующий:

sU|sG|t|rU|wU|xU|rG|wG||xG|rO|wO|xO

где sU — это SetUID, sG — это SetGID, t — это t-атрибут (sticky–бит), после чего следуют три тройки атрибутов доступа:

rU|wU|xU - права чтения (Read), записи (Write) и выполнения (eXecute) для владельца файла (User);

rG|wG|xG - права чтения (Read), записи (Write) и выполнения (eXecute) для группы файла (Group);

rO|wO|xO - права чтения (Read), записи (Write) и выполнения (eXecute) для всех остальных (Other).

Процессы с установленным битом sU выполняются с правами владельца. А с установленным битом sG – с правами группы.

В каталоге с установленным sticky–битом удалять файлы может только владелец или root. При том устанавливать этот бит может только root, а сбрасывать может владелец и root.

Например, команда ls -l выводит права доступа в таком формате:

«-rw-rw-rw-» (Первая черточка - обычный файл, и 9 прав доступа - все могут читать и изменять)

«drwx------» (Каталог, полный доступ (чтение, изменение, выполнение) имеет только владелец файла)

«-rw-r-----» (Обычный файл, владелец может читать и изменять, группа - читать, остальные - не имеют прав)

«drwxr-xr--» (Каталог, владелец имеет полный доступ, группа - чтение и выполнение, остальные - только чтение)

«drwxrwxrwt» (Каталог, все имеют полный доступ, однако, установлен sticky–бит, поэтому права записи в каталог для членов группы и для посторонних ограничены их собственными файлами, и только владелец имеет право изменять список файлов в каталоге, как ему вздумается. Такие каталоги называются разделяемыми, потому что предназначены они, как правило, для совместной работы всех пользователей в системе, обмена информацией и т. п. При установке атрибута «t» доступ на выполнение для посторонних («t» в строчке атрибутов стоит на месте последнего «x») не отменяется. Просто они так редко используются друг без друга, что ls выводит их в одном и том же месте. Если кому-нибудь придёт в голову организовать разделяемый каталог без доступа посторонним на использование, ls выведет на месте девятого атрибута не «t», а «T».)

«-rws--x--x» (Обычный файл, установлен атрибут SetUID. Как и в случае с t-атрибутом, ls выводит букву «s» вместо буквы «x» в тройке «для владельца». Точно так же, если соответствующего x-атрибута нет (что бывает редко), ls выведет «S» вместо «s».)

«-rwx--s--x» (Обычный файл, установлен атрибут SetGID. Утилита ls выводит SetGID в виде «s» вместо «x» во второй тройке атрибутов («для группы»). Замечания касательно «s», «S» и «x» действительны для SetGID так же, как и для SetUID.)

права доступа представляются также в двоичном и восьмиричном виде.

Например:

Примеры записи прав доступа в двоичной форме 110 110 110 все могуть читать и изменять
111 100 000 владелец имеет все права, группа - чтение, остальные не имееют никкаких прав
001 111 100 000 установлен t-атрибут, владелец имеет все права, группа - чтение, остальные не имееют никкаких прав
010 111 100 000 установлен атрибут SetGID, владелец имеет все права, группа - чтение, остальные не имееют никкаких пра
100 111 100 000 установлен атрибут SetUID, владелец имеет все права, группа - чтение, остальные не имееют никкаких прав
Примеры записи прав доступа в восьмиричной форме 666 все могуть читать и изменять
740 владелец имеет все права, группа - чтение, остальные не имееют никкаких прав
1740 установлен t-атрибут, владелец имеет все права, группа - чтение, остальные не имееют никкаких прав
2740 установлен атрибут SetGID, владелец имеет все права, группа - чтение, остальные не имееют никкаких пра
4740 установлен атрибут SetUID, владелец имеет все права, группа - чтение, остальные не имееют никкаких прав

 

Особенности доступа к каталогам

Каталог — это особый тип файла. Его содержание — это список других файлов. Каталоги имеют те же «биты прав», что и остальные файлы. Однако то, что эти права означают может быть не таким простым для понимания.

Если каталог можно читать (r), то это означает, что разрешено только узнать список файлов, содержащихся в этом каталоге. Только список файлов, но не их свойства (размер, права доступа и др.).

Если каталог можно исполнять (x), то это означает, что в него можно заходить и просматривать содержимое файлов (доступ к которым разрешен для данной категории), узнавать свойства (атрибуты) файлов. Можно изменить содержимое файла (если его разрешено менять), но не имя файла.

Если каталог можно изменять (w), то это означает, что в нем можно изменять файлы, их имена, удалять их. Опасность! Это можно делать даже с файлами, доступ к которым запрещен для данной категории. Лечение! Вводят дополнительный t-бит. При его наличии пользователь может изменять только свои файлы.

Следует понимать, что:

  • доступ к конкретному файлу также зависит от наличия доступа на исполнение к каталогам на протяжении всего пути;
  • изменять существующие файлы можно, не имея доступа на запись в каталог, достаточно иметь доступ на запись самого файла.

Изменение прав доступа

Изменение прав доступа к указанному файлу (или каталогу) выполняется с помощью команды chmod .

При создании каталога также можно сразу указать права доступа к нему с помощью команды mkdir -m.

Изменение владельца и группы файлов выполняется с помощью команды chown . Группу также пожно назначить командой chgrp .

Тем же побитовым представлением атрибутов регулируются и права доступа по умолчанию при создании файлов и каталогов. Делается это с помощью команды umask. Единственный параметр umask — восьмеричное число, задающее атрибуты, которые не надо устанавливать новому файлу или каталогу. Так, umask 0 приведёт к тому, что файлы будут создаваться с атрибутами «rw-rw-rw-», а каталоги — «rwxrwxrwx». Команда umask 022 убирает из атрибутов по умолчанию права доступа на запись для всех, кроме хозяина (получается «rw-r--r--» и «rwxr-xr-x» соответственно), а с umask 077 новые файлы и каталоги становятся для них полностью недоступны («rw-------» и «rwx------»).

Специальные атрибуты файлов

В файловой системе Linux присутствует поддержка дополнительных флагов или по другому "атрибутов" для файлов в ядрах начиная с серии 1.1. Файловая система в ядрах серий 2.2 и 2.4. позволяет работать со следующим набором атрибутов:

-A Atime система не апдейтит atime(access time) для данного файла.
-S Sync система фиксирует все изменения, происходящие в данном файле на физическиом диске синхронно с приложением изменяющим данный файл.
-a Append система позволяет открывать данный файл с целью его дополнения и не позволяет никаким процессам перезаписывать или усекать его.Если данный атрибут применяется к директории процесс может создавать или модифицировать файлы в этой директории , но не удалять их.
-i Immutable система запрещает любые изменения данного файла. В случае директории, процессы могут модифицировать файлы уже содержащиеся в данной директории, но не могут удалять файлы или создавать новые.
-d No Dump программе создающей дампы дается указание игнорировать данный файл во время создания backup.
-c Compress система применяет прозрачную компрессию для данного файла. Т.е. чтение из него дает уже декомпрессованые данные и предварительно перед записью на диск производится их сжатие.
-s Secure Deletion удаление такого файла сопровождается перезаписью блоков диска,на которых он располагался нулями.
-u Undelete когда приложение запрашивает файл на удаление, система должна сохранить блоки на диске, на которых расположен данный файл, чтобы потом его можно было восстановить.

 

Несмотря на то, что файловая система поддерживает данный набор атрибутов, у ядра и различных приложений остается выбор, учитывать или не учитывать их. В зависимости от своих версий, приложения могут по разному работать с этими атрибутами.

В таблице ниже приведено соответствие, как различные версии ядра учитывают каждый атрибут:

* позволяет устанавливать флаг и учитывает его значение

i позволяет устанавливать флаг,но игнорирует его значение

- полностью игнорирует флаг

/ 1.0 1.2 2.0 2.2 2.4
A - - * * *
S * * * * *
a - * * * *
i - * * * *
d - * * * *
c i i i i i
s * * i i i
u i i i i i

 

В некоторых версиях разработчики исключили атрибут 'secure deletion', поскольку, на их взгляд, его использование повышает общую безопасность лишь незначительно.

Флаг 'A' или 'atime' для определенных файлов может дать некоторую прибавку производительности, так как избавляет систему от необходимости апдейтить access time для этих файлов каждый раз, когда их открывают на чтение.

Атрибут 'S' или 'synchronous' предоставляет новый уровень поддержки целостности данных. Но поскольку все изменения в файлах немедленно сохраняются на диске несколько понижается производиельность.

Основное внимание мы уделим флагу 'a' ('append only') и 'i' ('immutable'), так как их использование дает наиболее ощутимые приемущества в плане обеспечения безопасности и целостности файловой системы.

Различные open source BSD системы, такие как FreeBSD и OpenBSD, с некоторых пор поддерживают аналогичные флаги в своих файловых системах (UFS и FFS соответственно) и частично решение о реализации аналогичных спецвозможностей в Linux основывается на этом положительном опыте.

Изменение специальных атрибутов файла выполняется с помощью команды chattr.

Просмотр специальных атрибутов файла выполняется с помощью команды lsattr.

Подробную информацию о файле или каталоге можно получить с помощью команды stat.

Изменить временные метки файлов или директорий можно с помощью команды touch.

Команды для работы с пользователями и группами пользователей

# id # Показывает сводную информацию по текущему пользователю (логин, UID, GID, группы);
# finger User # Показать информацию о пользователе User;
# last # Показывает последних зарегистрированных пользователей;
# who # Показывает имя текущего пользователя и время входа;
# useradd Denis # Добавление нового пользователя Denis;
# groupadd ITShaman # Добавление группы ITShaman;
# usermod -a -G ITShaman Denis # Добавляет пользователя Denis в группу ITShaman (для Debian-подобных дистрибутивов);
# groupmod -A Denis ITShaman # Добавляет пользователя Denis в группу ITShaman (SuSE);
# userdel Denis # Удаление пользователя Denis;
# groupdel ITShaman # Удаление группы ITShaman.

Комментарии

Нет комментариев. Ваш будет первым!