Разрешения

Последнее обновление: 15.03.2024

В Linux для каждого файла и каталога устанавливаются разрешения, которые использовуются для разграничения доступа. Разрешения указывают, кто может производить чтение или запись файлов, выполнять исполняемые приложения. Разрешения делятся на три группы:

  • Разрешения для пользователя-владельца

  • Разрешения для группы-владельца

  • Разрешения для остальных пользователей (которые не являются владельцами) и для других групп

Чтобы определить, есть ли у вас как пользователя права доступа к файлу или каталогу, система проверяет разрешения. Сначала она проверит, являетесь ли вы пользователем-владельцем файла. Если вы являетесь, то вы получите разрешения, установленные для пользователя-владельца. Если вы не являетесь пользователем-владельцем, система проверит, являетесь ли вы членом группы-владельцем, которая также называется группой файла. Если вы являетесь членом группы, вы получите доступ к файлу с разрешениями данной группы,. Если вы не являетесь ни пользователем-владельцем, ни состоите в группе-владельце, вы получите разрешения, которые даются всем остальным. Это также означает, что пользователь, который является владельцем, но также является членом группы-владельцем, получит только разрешения пользователя-владельца, а не с разрешениями группы-владельца. То есть разрешения не суммируются.

Формат разрешений

Каждое разрешение указывает, можем ли пользователь производить три базовых операции: читать файл, записывать в файл и выполнять файл. Действие разрешений можно обобщить следующим образом

Разрешение

Файл

Каталог

Чтение

Можно открыть файл

Можно получить содержимое каталога

Запись

Можно изменить содержимое файла

Можно создавать и удалять файлы в каталоге

Выполнение

Можно выполнить файл

Можно перейти к каталогу (например, с помощью команды cd)

Соответственно каждое разрешение состоит из 3 битов (по биту для каждой операции) в формате

[read][write][execute]

Где первый бит - read указывает, доступен ли файл/каталог для чтения. Второй бит - write - доступен ли файл/каталог для записи. И третий бит - execute указывает, доступен ли файл для выполнения (можно ли запускать его как программу). Единица означает, операция доступна, а 0 - операция не доступна

Например

100

Здесь установлен только первый бит - read, поэтому файл/каталог, который имеет подобное разрешение, доступен только для чтения.

Другой пример:

111

Здесь установлены все три бита, поэтому файл/каталог, который имеет подобное разрешение, доступен сразу и для чтения, и для записи, и для выполнения.

При установке разрешений применяют десятичные числа. Например, разрешение "100" в десятичном виде равно 4. Таким образом, число 4 означает доступ только для чтения. А разрешение "111" в десятичном виде равно 7. Поэтому для доступа на чтение, запись и выполнение применяется число 7.

Однако, как говорилось выше, для файла/каталога устанавливаются три вида разрешений - для пользователя-владельца, для группы владельца и для всех остальных. Соответственно при установке разрешений нам надо предоставить три группы битов для каждой из этих групп. Например:

100_100_100

Я условно разделил каждую группу прочерками. Сначала идет групп для пользователя-владельца, затем для группы и затем для всех остальных. Приче для всех разрешения равны 100 или 4 (доступ только для чтения). При установке подобных разрешений указываются три четверки:

444

Другой пример:

111_111_111

Для всех разрешения равны 111 или 7 (доступ для чтения, записи и выполнения). При установке подобных разрешений указываются три семерки:

777

Еще один пример:

111_111_100

Для пользователя и группы-владельцев разрешения равны 111 или 7 (доступ для чтения, записи и выполнения), а для всех остальных - 100 или 4 (доступ только для чтения). При установке подобных разрешений указывается:

774

Вместо битов в виде нулей и единиц в Linux часто применяются символьные маркеры. Если бит установлен, то применяются следующие символы

  • r - read

  • w - write

  • x - execute

Если бит сброшен то применяется дефис "-". Например, для вывода разрешения "100" применяется следующее отображение:

r--

То есть первый бит установлен, поэтому вместо него идет символ "r". Остальные биты сброшены, поэтому применяется дефис "-".

Другой пример - разрешение "111":

rwx

Здесь все биты установлены, поэтому для каждого применяется соответствующий символ.

Поскольку для каждого файла устанавливаются три разрешения: для пользователя-владельца, для группы-владельца и для всех остальных, то соответственно применяется три группы разрешений. Например:

rwxrwxrwx

Первые три символа устанавливают разрешения для пользователя-владельца, вторые три символа - для группы владельца и последние три символа - для всех остальных.

Просмотр разрешений

Например, выведем каталоги и файлы домашнего каталога документов с правами доступа с помощью команды ls -l ~/Documents:

eugene@Eugene:~$ ls -l ~/Documents
total 56
drwxrwxr-x 3 eugene eugene 4096 Mar  5 15:13 work
-rw-rw-r-- 1 eugene eugene   67 Feb 23 23:07 somefile
drwxrwxr-x 2 eugene eugene 4096 Mar  6 16:03 test
eugene@Eugene:~$ 

Разрешения укахываются со второго символа (первый символ обозначает тип файла - является ли файл каталогом). Так, здесь мы видим, что для папок "work" и "test" указано разрешение "rwx_rwx_r-x" или 775. То есть для пользователя-владельца и для группы-владельца открыт доступ на чтение, запись и выполнение. А для всех остальных - только на чтение и выполнение.

А вот для файла "somefile" применяется разрешение "-rw-rw-r--" или 664. То есть пользователь-владелец и группа-владелец могут читать и записывать, а все остальные - только читать.

Причем надо понимать, что разрешения файлов в папке не идентичны разрешениям, установленным для самой папки. Например, пользователь может открыть папку, посмотреть все ее содержимое, но не может открыть файлы в ней, потому что у папки и ее файлов разные разрешения.

chmod

Команда chmod используется для изменения прав доступа к файлу или каталогу. Этой команде передаются разрешения для пользователя-владельца, группы-владельца и всех остальных:

chmod [options] разрешения файл/каталог

Например, сделаем папку "/Documents/test" доступной только для пользователя-владельца, а для остальных недоступной:

chmod 700 ~/Documents/test

Здесь команде chmod передаются разрешения 700. То есть для пользователя-владельца права устанавливаются в 7 или 111 в бинарной форме (доступны чтение, запись и выполнение). Для группы-владельца передаются число 0 и для всех остальных - тоже 0, что означает, что они не имеют никаких прав (ни на чтение, ни на запись, ни на выполнение).

Например, посмотрим, какие права у папок и файлов в Documents:

eugene@Eugene:~$ ls -l ~/Documents
total 56
drwxrwxr-x 3 eugene eugene 4096 Mar  5 15:13 work
drwx------ 2 eugene eugene 4096 Mar  6 16:03 test

И здесь мы видим, что к папке test применены разрешения.

Важно помнить, что по умолчанию права устанавливаются только для переданного команде файла или каталога. Если каталог имеет содержимое, то по умолчанию для этого содержимого не применяются указанные разрешения. И чтобы рекурсивно изменить права доступа ко всем вложенным файлам и подкаталогам внутри каталога, применяется флаг -R:

chmod 700 -R ~/Documents/test

Также для установке разрешений можно применять относительный режим, когда мы явным образом можем указать с помощью спецсимволов, для кого устанавливаются разрешения: u (user - пользователь-владелец), g (group - группа-владелец), и o (others - все остальные). Например:

chmod u=rwx,g=rwx,o=- ~/Documents/test

В данном случае для u (пользователь-владелец) устанавливается разрешение rwx (или 7), для g (группа-владелец) - также разрешение rwx, а для o (всех остальных) - - (все разрешения сбрасываются)

При изменении разрешений в относительном режиме можно добавить или удалить разрешение для всех объектов. Например, следующая добавит разрешение на выполнение для всех пользователей и групп:

chmod +x somefile

При работе в относительном режиме можно использовать и более сложные команды. Например, следующая команла добавит группе-владельцу разрешение на запись и удалит разрешение на чтение для других:

chmod g+w,o-r somefile

Плюс означает добавление разрешений, а минус - удаление разрешений. Соответственно, например, запись g+w указывает для g (группа-владелец) добавить разрешение w (на запись).

chown

Команда chown изменяет владельца и группы указанного файла или каталога. Чтобы изменить владельца и группу каталога, надо передать оба аргумента, разделенные двоеточием. Например, для папки "/Documents/test" назначим в качестве владельца пользователя eugene, а группу - "users":

sudo chown eugene:users ~/Documents/test

Как и в случае с командой chmod можно рекурсивно изменить права для всего содержимого каталога, добавив к команде -R:

sudo chown -R eugene:users ~/Documents/test

chgrp

Команда chgrp позволяет сменить группу для каталога, не затрагивая владельца. Этой команде передается название группы, которая будет владеть файлом/каталогом, и путь к этому файлу/каталогу. Например, установим для папки "/Documents/test" в качестве группы группу "root":

sudo chgrp root ~/Documents/test

Для смены группы для содержимого каталога также применяется флаг -R:

sudo chgrp -R root ~/Documents/test

Разрешения по умолчанию

Обычно, когда пользователь создает файл, то применяется право собственности по умолчанию. Пользователь, создавший файл, автоматически становится пользователем-владельцем, а основная группа этого пользователя автоматически становится группой-владельцем. Обычно это группа, заданная в файле /etc/passwd в качестве основной группы пользователя. Однако если пользователь является членом нескольких групп, то он может изменить действующую первичную группу с помощью команды newgrp, которой передается имя группы, которую надо сделать основной. Например, получим основную группу текущего пользователя:

eugene@Eugene:~$ groups
eugene adm cdrom sudo dip plugdev users lpadmin

В моем случае видно, что основная группа - eugene. Но среди дополнительных групп есть группа "users". Сделаем ее основной:

eugene@Eugene:~$ newgrp users
eugene@Eugene:~$ groups
users adm cdrom sudo dip plugdev lpadmin eugene
eugene@Eugene:~$ touch test1.txt
eugene@Eugene:~$ ls -l
total 72
-rw-rw-r--  1 eugene users      0 Mar 15 07:57  test1.txt
eugene@Eugene:~$ 

И после создания файла test1.txt в текущем каталоге мы видим, что его группа-владелец - группа "users"

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

SUID, SGID, бит фиксации

Кроме ранее рассмотренных стандартных разрешений, связанных с чтением, записью и выполнением файлов/каталогов в Linux есть еще особые разрешения - SUID, SGID, sticky bit (бит фиксации).

Разрешения SUID (Set User ID) дают пользователям права на выполнение, которые есть у создателя файла. При запуске файла на выполнение по умолчанию пользователь запускает этот файл со своими собственными разрешениями. Для обычных пользователей это обычно означает, что использование программы ограничено. Однако в некоторых случаях пользователю необходимо иметь возможность запускать команду с правами root. Например, пользователю необходимо изменить свой пароль, для чего необходимо записать новый пароль в файл /etc/shadow. Однако этот файл недоступен для записи пользователям с правами без полномочий root. И разрешение SUID как раз решает эту проблему. Для файла /usr/bin/passwd это разрешение применяется по умолчанию. Таким образом, при изменении своего пароля пользователь временно получает права root, которые позволяют ему писать в файл /etc/passwd. Вы можете увидеть разрешение SUID с помощью команды ls -l как s в том месте, где обычно располагается разрешение x для пользователя:

eugene@Eugene:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64152 Feb  6 15:53 /usr/bin/passwd

Другое специальное разрешение — SGID (Set Group ID) дает пользователю права группы-владельца этого файла/каталога. SGID может быть полезен при работе с разделяемыми каталогами. По умолчанию, когда пользователь создает файл, в качестве группы-владельца этого файла устанавливается первичная группа этого пользователя. Это может быть не очень полезно, поскольку никто другой не сможет изменять создаваемые файлы, даже если они являются членами одной группы и имеют доступ к папке. Но если к каталогу применяется разрешение SGID, то группа-владелец этого каталога автоматически будет устанавливаться для всех файлов, созданных в этом каталоге, и всех его подкаталогов. И все пользователи, которые принадлежат к этой группе-владельцу (даже если эта группа для них не основная) смогут управлять файлами этого каталога.

Третье специальное разрешение — sticky bit (липкий бит или бит фиксации). Это разрешение полезно для защиты файлов от случайного удаления в среде, где несколько пользователей могут создавать файлы в одном каталоге. По этой причине оно применяется в качестве разрешения по умолчанию для каталога /tmp:

eugene@Eugene:~$ ls -l /
total 8388696
lrwxrwxrwx   1 root root          7 Oct 16 13:36 bin -> usr/bin
drwxr-xr-x   4 root root       4096 Mar  8 07:08 boot
..........................................................
drwxrwxrwt  22 root root      12288 Mar 15 11:10 tmp

Здесь для папки /tmp последнее разрешение в виде буквы t как раз и представляет sticky bit. Без подобного бита, если пользователь может удалять файлы из этого каталога даже, если он не является владельцем файла, а принадлежит к группе-владельцу каталога. В некоторых случаях это может быть не идеальная ситуация, например, в разделяемых общих папках - если пользователи принадлежат к одной группе и могут создавать файлы, то они смогут и удалять файлы друг друга. А при применении подобного бита пользователь может удалять файлы, если верно хотя бы одно из следующих условий:

  • Если пользователь является владельцем файла

  • Если пользователь является владельцем каталога, где расположен файл

К примеру, sticky bit нельзя использовать, чтобы запретить пользователям удалять файлы из своего домашнего каталога. Поскольку пользователь является владельцем домашнего каталога, у него всегда будут права на удаление файлов из этого каталога. Также стоит отметить, что sticky bit НЕ применяется к отдельным файлам, только ко всему каталогу.

Для применения разрешений SUID, SGID и sticky-бита можно использовать выше рассмотренную команду chmod. SUID имеет числовое значение 4, SGID имеет числовое значение 2, а sticky bit - значение 1. Для применения этих разрешений команде chmod передается четырехзначный аргумент, где первая цифра относится к специальным разрешениям. Например, следующая строка добавит разрешение SGID к каталогу и установит rwx для пользователя и rx для группы и других:

chmod 2755 /somedir

Аналогично в команде chmod 3755 устанавливаются SGID и sticky bit, а в команде chmod 4755 устанавливается только SUID

Для установки специальных разрешений также можно использовать относительный режим. Для SUID используйте chmod u+s; для SGID - chmod g+s; а для sticky-бита - chmod +t. Если суммировать специальные разрешения, то получится следущая таблица:

Числовое значениеОтносительное значениеЭффект для файловЭффект для каталогов
SUID4u+sВыполнение файла с разрешениями владельца файлаНе применяется
SGID2g+sВыполнение файла с разрешениями группы-владельца файлаВсе файлы в каталоге имеют одну группу-владельца
sticky bit1+tНе применяетсяПредотвращает удаление файлов других пользователей

Например, создадим в корневом каталоге папку "data" и создадим в ней файл "test":

eugene@Eugene:~$ sudo mkdir /data
[sudo] password for eugene: 
eugene@Eugene:~$ sudo touch /data/test

Далее установим разрешения SGID и sticky bit для созданной папки /data

eugene@Eugene:~$ sudo chmod g+s /data
eugene@Eugene:~$ sudo chmod +t /data

Посмотрим на разрешения папки:

eugene@Eugene:~$ ls -l /
total 8388700
lrwxrwxrwx   1 root root          7 Oct 16 13:36 bin -> usr/bin
drwxr-xr-x   4 root root       4096 Mar  8 07:08 boot
dr-xr-xr-x   2 root root       4096 Oct 16 14:29 cdrom
drwxr-sr-t   2 root root       4096 Mar 15 12:08 data
........................

Удалим папку:

eugene@Eugene:~$ sudo rm -r /data
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850