Базовые права доступа и дополнительные атрибуты Linux

Автор: | 29.11.2018

Для разграничения действий над файлами определены три базовых права доступа (базовые разрешения):

  • чтение r — «read»,
  • запись w — «write» и
  • выполнение х — «execute»,

соответствующие разрешению выполнять системные вызовы read, write и execve (точнее, системному вызову open с флагами O_RDONLY и O_WRONLY, но для простоты можно считать r — read, a w — write).

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

В наследии классической UNIX определены только три субъекта, которым назначаются базовые права — пользователь-владелец (owner), группа-владелец (group owner) и все остальные (others). Совокупность их базовых прав называется режимом доступа (access mode) к файлу.

Базовое право может быть назначено r, w или х или отозвано , поэтому в метаданных файла представляется одним битом, а для режима доступа требуется девять бит: по три бита прав на каждый из трех субъектов доступа. Компактно режим доступа может быть записан соответствующим числом в восьмеричной системе счисления rw-r—r— → 1101001002 → 6448.

Режим доступа к файлу

john@ubuntu:~$ stat .profile

Файл: «.profile»

. . .                                        . . .

Доступ: (6644/-rw- r— r—)     Uid:   ( 1000/   john)     Gid:    ( 1000/    john)

. . .                                        . . .

john@ubuntu:~$ ls -l .profile

-rw-r—r—  1  john  john   677   марта  24 12:26 .profile

Проверка режима доступа при операциях с файлами проверяется «слева направо» до первого совпадения.

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

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

Использование режима доступа к файлу

john@ubuntu:~$ id john
uid=1000(john) gid=1000(john) группы=1000(john),4(adm),20(dialout),…,110(admin)

john@ubuntu:~$ ls -l README.*
-rw-r—r—  1       john                   admin            2471    ноя.         11  01:12 README.john
—w-r—r—  1       john                   admin            2471    ноя.         11  01:12 README.john.locked
-rw-r—r—  1       mike                   admin            776     ноя.         11  01:12 README.mike
-rw—-r—  1       bubble               admin              171    ноя.          11  01:12 README.bubble
-rw-r—r—  1       stella                  admin               16    ноя.          11  01:12 README.stella

-rw-r—r—  1       troll                   admin                31    ноя.         11  01:12 README.troll

john@ubuntu:~$ wc README.*

wc: README.admins: Отказано в доступе

wc: README.bubble: Отказано в доступе

24 177 2471 README, john

wc: README.john.locked: Отказано в доступе

wc: README.troll: Отказано в доступе

12    70   776    README.mike

1        1      16     README.stella

37  248  3263  итого

Режим доступа новых файлов

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

Так, например, текстовые редакторы назначают создаваемым (текстовым) файлам права rw для всех субъектов, а компиляторы назначают создаваемым (программным) файлам права rwx для всех субъектов.

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

Реверсивная маска доступа

john@ubuntu:~$ umask

0002

john@ubuntu:~$ umask -S

u=rwx,g=rwx,o=rx

john@ubuntu:~$ touch common.jnl

john@ubuntu:~$ ls -l common.jnl

-rw-rw-r—   1 john john   0  ноя.  23 22:43 common. jnl

john@ubuntu:~$ umask g-w,o-rwx

john@ubuntu:~$ umask

0027

john@ubuntu:~$ umask -S

u=rwx,g=rx,o=

john@ubuntu:~$ touch group.jnl

john@ubuntu:~$ ls -l group.jnl

-rw-r——  1 john john  0 ноя.  23  22:44 group, jnl

john@ubuntu:~$ umask g=

john@ubuntu:~$ umask

0077

john@ubuntu:~$ umask -S

u=rwx,g=,o=

john@ubuntu:~$ touch private.jnl

john@ubuntu:~$ ls -l private.jnl

-rw———  1 john  john   0  окт.   23  22:44 private.jnl

Изменять режим доступа разрешено непосредственному пользователю — владельцу файла, но не членам группы-владельцев, что иллюстрирует листинг ниже при помощи команды chmod.

Изменение режима доступа к файлу

john@ubuntu:~$ id john
utd=1000(john) gid=1000(john) группы=1000(john) ,4(adm),20(dialout),… ,20( admin)

john@ubuntu:~$ ls -l README.*
-rw-r-r—   1    john                         admin            2471  окт.    11 01:12 README.john
-rw-r-r—   1    mike                        admin            2471  окт.    11 01:12 README.mike

. . .                                            . . .                                                    . . .
john@ubuntu:~$ chmod g-r,o-r README.john

john@ubuntu:~$ ls -la README.john
-rw——   1     john                        admin             2471  окт.    11 01:12 README.john
john@ubuntu:~$ chmod g-r,o-r README, mike
chmod: изменение прав доступа для «README.jake»: Операция не позволяется

Семантика режима доступа разных типов файлов

Права доступа r, w, х для обычных файлов представляются чем-то интуитивно понятным, но для других типов файлов это не совсем так. Например, каталог содержит список имен файлов, поэтому право w для каталога — это право записи в этот список и право стирания из этого списка, что трансформируется в право удаления файлов из каталога и создания файлов в каталоге.

Аналогично, право r для каталога — это право просмотра списка имен его файлов. И наконец, право x для каталога является правом прохода в каталог, т. е. позволяет обращаться к файлам внутри каталога по их имени.

Права доступа к каталогу

john@ubuntu:~$ mkdir folder

john@ubuntu: ~$ ls -lad folder/

drwxrwxr-x 2 john john  4096 окт.  12 00:37  folder/

john@ubuntu:~$ cp /etc/magic folder

john@ubuntu:~$ chmod u-w folder

john@ubuntu:~$ ls -lad folder/

dr-fxrwxr-x 2 john john  096 окт. 12 00:40 folder/

john@ubuntu:~$ cp /etc/localtime folder/

cp: невозможно создать обычный файл «folder/localtime»: Отказано в доступе

john@ubuntu:~$ rm folder/magic

rm: невозможно удалить «folder/magic»: Отказано в доступе

john@ubuntu:~$ ls -li folder/

итого 4

20318203 -rw-r—rw 1 john  john  111 окт.  12 00:40 magic

john@ubuntu:~$ chmod u-r folder

john@ubuntu:~$ ls -lad folder/

d—xrwxr-x 2  john john  4096 окт.  12 00:40 folder/

john@ubuntu:~$ ls -li folder/

ls: невозможно открыть каталог folder/: Отказано в доступе

john@ubuntu:~$ ls -li folder/magic

20318203 -rw-r—r—  1 john  john  111 окт. 12 00:40 folder/magic

john@ubuntu:~$ chmod u-rw folder/

john@ubuntu:~$ ls -lad folder/

drw-rwxr-x  2 john  john 4096 окт. 12 00:40 folder/

john@ubuntu:~$ cp /etc/localtime folder/

cp: не удалось выполнить stat для «folder/localtime»: Отказано в доступе

john@ubuntu:~$ rm folder/magic

rm: невозможно удалить «folder/magic»: Отказано в доступе

john@ubuntu:~$ ls -l folder/

ls: невозможно получить доступ к folder/magic: Отказано в доступе

итого 0

-????????? ? ? ? ?                                ? magic

john@ubuntu:~$ chmod u=rwx folder/

john@ubuntu:~$ ls -ld folder/

drwxrwxr-x 2  john  john  4096 окт. 12 00:40 folder/

john@ubuntu:~$ cd folder/

john@ubuntu:~/folder$ ls -l

итого 4

-rw-r—r—  1  john  john 111 окт. 12 00:40 magic

john@ubuntu:~/folder$ chmod a= magic

john@ubuntu:~/folder$ ls -l magic
—————  1  john  john 111 окт. 12 00:40 magic
john@ubuntu:~/folder$ rm magic

rm: удалить защищенный от записи обычный файл «magic»? у

john@ubuntu:~/folder$ ls -l

итого 0

Для жестких ссылок права доступа не существуют вовсе — они просто являются теми же правами, что и права целевого файла, в силу того что права доступа хранятся в метаданных.

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

Права доступа ссылок

john@ubuntu:~$ ls -l README.john
-rwxr—r—   1  john  john 2471   окт.     11 01:13 README.john
john@ubuntu:~$ ln README.john read.me
john@ubuntu:~$ ln -s README.john readme.1st
john@ubuntu:~$ ls -l README.john read.me readrme.1st
-rwxr—r— 2   john  john  2471  окт.      11 01:13 read.me
lrwxrwxrwx 1 john john     11    окт.      12 01:19 readme.1st -> README.john
-rwxr—r— 2    john  john  2471  окт.      11 01:13 README.john
john@ubuntu:~$ chrood o-r  readme.1st
john@ubuntu:~$ ls -l README.john read.me readme.1st
-rwxrw-r—   2  john  john 2471 окт. 11 01:13 read.me
lrwxrwxrwx 1  john  john     11  окт.  12 01:19 readme.1st -> README.john
-rwxrw-r— 2   john  john  2471 окт. 11 01:13 README.john

Для специальных файлов устройств, именованных каналов и сокетов право х не определено, а права r и w стоит воспринимать как права ввода и вывода информации на устройство и как права передачи и приема информации через средство взаимодействия.

Дополнительные атрибуты

Помимо базовых прав доступа r, w и х, для решения отдельных задач разграничения доступа используют дополнительные атрибуты s, Set user/group ID (SUID Set User ID или SGID, Set Group ID) — атрибут неявного делегирования полномочий и t, sTicky — «липучка», атрибут ограниченного удаления.

Типичной задачей, требующей неявного делегирования полномочий, является проблема невозможности изменения пользователями свойств своих учетных записей, которые хранятся в двух файлах-таблицах — passwd и shadow, доступных на запись (и чтение) только суперпользователю root. Однако команды passwd, chsh и chfn, будучи запущены обычным пользователем, прекрасно изменяют пароль в таблице /etc/shadow и свойства пользовательской! записи в таблице /etc/passwd за счет передачи полномочий пользователя — владельца программы тому пользователю, который ее запускает.

Дополнительный атрибут SUID

john@ubuntu:~$ ls -la /etc/passwd /etc/shadow

-rw-r—r— 1   john  john  2338 сент.  11   11:51 /etc/passwd

-rw-r—«!— 1  root  shadow 1878 сент. 15 17:59 /etc/shadow

john@ubuntu:~$ passwd

Смена пароля для john

(текущий) пароль UNIX:

Введите новый пароль UNIX:

Повторите ввод нового пароля UNIX:

passwd: пароль успешно обновлён

john@ubuntu:~$ ls -la /etc/passwd /etc/shadow

-rw-r—r— 1   john  john  2338 сент. 11 11:51 /etc/passwd

-rw-r—— 1      root   shadow 1878 окт. 19 23:51 /etc/shadow

john@ubuntu:~$ chfn

Пароль:

Изменение информации о пользователе john

Введите новое значение или нажмите ENTER для выбора значения по умолчанию

Полное имя:
Номер комнаты []:
Рабочий телефон []: +7(495)403-03-08
Домашний телефон []:

john@ubuntu:~$ ls -l /etc/passwd /etc/shadow

—rw-r—r—  1   root   root        2357   окт.    19   23:53   /etc/passwd
-rw-r——   1    root   shadow  1878   окт.    19   23:51  /etc/shadow

john@ubuntu:~$ ls -la /usr/bin/passwd /usr/bin/chfn

-rwsr-xr-x  1   root    root     40292   сент.  13   2017 /usr/bin/chfn

-rwsr-xr-x  1    root   root      41284   сент.   13 2017 /usr/bin/passwd

За счет использования атрибута SUID получается, что пользователям, запускающим программы chfn, chsh и passwd, для их исполнения временно делегируются права владельца этих программ (суперпользователя root) так, как будто сам суперпользователь их запустил.

Дополнительный атрибут SGID

john@ubuntu:~$ w
00:03:53   up   12 days,  13:53,    7   users,    load average: 0,53, 0,51, 0,91

USER           TTY           FROM                   LOGIN@      IDLE      XPU      PCPU        WHAT
mike             tty2                                             00:03           9.00s    0.52s      0.43s         -bash
john              tty1                                              00:03          17.00s    0.51s      0.45s         -bash
john@ubuntu:~$ ls -l /dev/tty1 /dev/tty2
crw————  1 john   tty 4,  1 окт.     20 00:03 /dev/tty1
crw————  1 mike   tty 4,  2 окт.    20 00:03 /dev/tty2
john@ubuntu:~$ write mike
write: mike has messages disabled

. . .                     . . .                           . . .

mike@ubuntu:~$ mesg у

. . .                     . . .                           . . .
john@ubuntu:~$ ls -l /dev/tty1 /dev/tty2

john@ubuntu:~$ ls -l /dev/tty2
crw—w—-   1 mike tty 4,  2 окт.    20 00:07 /dev/tty2
john@ubuntu:~$ write mike
write: write: you have write permission turned off.

Hi, buddy, wazzzup?
^D

mike@ubuntu:~$
Message from john@ubuntu on tty1 at 00:10 …
Hey buddy, wazzup?
EOF
john@ubuntu:~$ ls -Ll /usr/bin/write
-rwxr-sr-x 1 root tty 9728 марта 31 2017 /usr/bin/write

 

Аналогично при использовании атрибута SGID, при передаче сообщений от пользователя к пользователю командой write или wall, запускающему эти программы пользователю, делегируются полномочия группы tty, имеющей доступ , на запись к терминалам (специальным файлам устройств /dev/ttyN), владельцы которых разрешили такой доступ.

Именно за счет механизма SUID/SGID различные команды позволяют обычным, непривилегированным пользователям выполнять сугубо суперпользовательские действия.

Так, например, su и sudo позволяют выполнять команды одним пользователям от лица других пользователей, mount, umount и fusermount — монтировать и размонтировать файловые системы, ping и traceroute — выполнять диагностику сетевого взаимодействия, at и crontab — сохранять в «системных» каталогах отложенные и периодические задания, и т. д.

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

Дополнительный атрибут SGID для каталога

bubblegum@ubuntu:~$ cd /srv/kingdom

bubblegum@ubuntu:/srv$ id

uid=1005(bubblegum) gid=1005(bubblegum) группы=1005(bubblegum),1007(candy)

bubblegum@ubuntu:/srv/klngdom$ ls -ld .

drwxr-xr-x 2 bubblegum bubblegum 4096 окт. 21 22:02 .

bubblegum@ubuntu:/srv/ktngdom$ touch bananaguard1

bubblegum@ubuntu:/srv/kingdom$ ls -l

итого 0

rw-rw-r— 1 bubblegum bubblegum 0 окт. 21 22:02 bananaguard1

bubblegum@ubuntu:/srv/klngdom$ chgrp candy .

bubblegum@ubuntu:/srv/klngdom$ chmod g+ws .

bubblegum@ubuntu:/srv/klngdom$ ls -Id .

drwxrwsr-x 2 bubblegum candy 4096 окт. 21 22:02 .

. . .                       . . .                                    . . .

john@ubuntu:/srv/kingdom$ id

uid=1001(john) gid=1001(john) группы=1001(john),1007(candy)

john@ubuntu:/srv/klngdom$ touch bananaguard2

john@ubuntu:/srv/klngdom$ ls -l

итого 0

-rw-rw-r— 1  bubblegum bubblegum    0  окт. 21 22:02 bananaguard1

-rw-rw-r— 1  john              candy              0 окт. 21 22:02 bananaguard2

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

Атрибут-«липучка» t (sTicky) служит для ограничения действия базового разрешения w записи в каталоге. Например, временный каталог /tmp предназначается для хранения временных файлов любых пользователей и поэтому доступен на запись всем пользователям.

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

Дополнительный атрибут sTicky для каталога

john@ubuntu: /srv/kingdom$ id 
uid=1001(john) gid=1001(john) группы=1001(john),1007(candy)

john@ubuntu:/srv/kingdon$ ls -la

итого 8
drwxrwsr-x  2  bubblegum    candy   4096 окт.   23 20:57 .
drwxr-xr-x   3   root                root      4096  окт.   21 21:57 ..
-rw-rw-r—    1   bubblegum   bubblegum  0 окт. 21 23:15 bananaguard1
-rw-rw-r—    1    john              candy            0  окт. 21 23:24 bananaguard2

. . .                         . . .                                     . . .

john@ubuntu:/srv/kingdom$ rm bananaguard1

rm: удалить защищенный от записи пустой обычный файл «bananaguard1»? у

john@ubuntu: /srv/kingdom$ ls -1

итого 0
-rw-rw-r— 1     john  candy 0 окт. 21 23:24 bananaguard2

. . .                         . . .                                     . . .

bubblegum@ubuntu:/srv/kingdom$ chmod +t .

bubblegum@ubuntu: /srv/kingdom$ touch bananaguard1

bubblegum@ubuntu:/srv/kingdom$ ls -la

итого 8

drwxrwsr—t  2  bubblegum   candy   4096  окт. 23 21:19 .

drwxr-xr-x    3   root               root       4096  окт. 21 21:57 ..

-rw-rw-r—     1   bubblegum   candy          0   окт. 23 21:19 bananaguard1

-rw-rw-r—     1   john                candy          0   окт. 23 21:19 bananaguard2

. . .                         . . .                                     . . .

john@ubuntu:/srv/kingdom$ rm bananaguard1

rm: невозможно удалить «bananaguard1»: Операция не позволяется

 

Базовые права доступа и дополнительные атрибуты Linux: 1 комментарий

  1. Уведомление: Расширенные атрибуты файлов Linux | Debian GNU/Linux

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *