Для разграничения действий над файлами определены три базовых права доступа (базовые разрешения):
- чтение 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 | Debian GNU/Linux