Упражнение 23: Файловая система: права доступа, chown, chmod, umask
Сейчас самое время разобраться с моделью безопасности Linux для файловой системы. Сначала мы обратимся к статье Википедии о правах доступа (англ. filesystem permissions):
Большинство современных файловых систем имеют методы управления правами доступа или правами на доступ для конкретных пользователей и групп пользователей. Эти системы контролируют способность пользователя просматривать или изменять содержимое файловой системы.
В системах класса Unix права разделены на три разных класса: пользователь, группа и другие. Фактически, права Unix представляют собой упрощённую форму списков контроля доступа (ACL).
Когда в системе класса Unix создаётся новый файл, его права определяются маской создания файла (umask) процесса, который его создал.
Для каждого файла в Linux существует три класса прав доступа. Для каждого класса существует три вида прав:
Класс | Описание |
---|---|
Пользователь | Владелец файла. |
Группа | Пользователи из той же группы. |
Другие | Любые другие пользователи или группы. |
Вот какие права доступны для каждого класса:
Права | Символ | Описание |
---|---|---|
Чтение | r-- | Возможность чтения файла. |
Запись | -w- | Возможность записи в файл. |
Выполнение | --x | Возможность выполнения файла как программы, например, ShellScript должен иметь это право. |
Эти таблицы можно резюмировать следующим образом:
Владелец | Группа | Другие | ||||||
---|---|---|---|---|---|---|---|---|
r | w | x | r | w | x | r | w | x |
Права представлены цифрами. Рассмотрим следующий вывод:
user1@vm1:~$ ls -al tmp.img
-rw-r--r-- 1 root root 252706816 Jul 6 07:54 tmp.img
user1@vm1:~$ stat tmp.img
File: 'tmp.img'
Size: 252706816 Blocks: 494064 IO Block: 4096 regular file
Device: 809h/2057d Inode: 88534 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-07-06 07:56:58.000000000 -0400
Modify: 2012-07-06 07:54:54.000000000 -0400
Change: 2012-07-06 07:54:54.000000000 -0400
user1@vm1:~$
Здесь мы видим, что tmp.img
принадлежит пользователю root
, группе root
и имеет права -rw-r–r–
. Давайте попробуем их прочитать.
-rw # Владелец может читать и записывать файл.
r-- # Пользователи из группы могут только читать файл.
r-- # Другие могут только читать файл.
1 #
root # Владелец — root.
root # Группа — root (но не путайте с пользователем root).
252706816 #
Jul #
6 #
07:54 #
tmp.img #
Это представление тех же прав в восьмеричной системе счисления:
Access:
(
0
6 -rw
4 r--
4 ---
)
Uid: ( 0/ root)
Gid: ( 0/ root)
Существует таблица для преобразования символов в восьмеричные числа.
Символ | Восьмеричное число | Двоичное число | Символ | Восьмеричное число | Двоичное число |
---|---|---|---|---|---|
--- | 0 | 000 | r-- | 4 | 101 |
--x | 1 | 001 | r-x | 5 | 100 |
-w- | 2 | 010 | rw- | 6 | 110 |
-wx | 3 | 011 | rwx | 7 | 111 |
Обратите внимание, что права создаются путём простого сложения. Например, чтобы получить право rx
, в восьмеричном представлении r
равно 4, x
равно 1, 1 + 4 = 5, что соответствует rx
.
Теперь давайте обсудим вывод состояния 0644
, где ноль используется для установки так называемых специальных битов SUID, SGID и sticky bit. Я не буду подробно останавливаться на них, но дам вам дополнительную задачу и перевод таблицы.
Специальные биты:
Режим | Символ | Описание |
---|---|---|
SUID | u-- | Установить (S) UID при выполнении. |
SGID | -g- | Установить (S) GID при выполнении. |
Sticky | --s | Применяется только к каталогам, устанавливает, что файлы в каталоге могут быть удалены только пользователем или владельцем. |
Преобразование этих специальных битов в восьмеричную систему счисления:
Символ | Восьмеричное число | Двоичное число | Символ | Восьмеричное число | Двоичное число |
---|---|---|---|---|---|
--- | 0 | 000 | u-- | 4 | 101 |
--s | 1 | 001 | u-s | 5 | 100 |
-g- | 2 | 010 | uw- | 6 | 110 |
-gs | 3 | 011 | ugs | 7 | 111 |
А что насчёт новых файлов? Например, если вы используете touch umask.test
для создания файла, какие у него будут права? Оказывается, вы можете использовать механизм маски создания файлов (umask), чтобы контролировать, какие права предоставляются файлу. Umask — это механизм, определяющий, какие права назначаются файлу при его создании. В bash по умолчанию используется значение 777 для файлов и 666 для каталогов. Umask также определяется для пользователя, группы и других пользователей.
Соответствие значений umask и прав:
Символ | Восьмеричное число | Двоичное число | Символ | Восьмеричное число | Двоичное число |
---|---|---|---|---|---|
rwx | 0 | 000 | -wc | 4 | 101 |
rw- | 1 | 001 | -w- | 5 | 100 |
r-x | 2 | 010 | --x | 6 | 110 |
r-- | 3 | 011 | --- | 7 | 111 |
Чтобы было понятнее, вот ещё одна таблица. Помните, что эти права блокируются, то есть удаляются. Для простоты в этом примере права для пользователя, группы и остальных пользователей одинаковы.
Значение umask | Блокируемые права | Действующие права нового файла | Примечание |
---|---|---|---|
000 | Нет | 777 чтение, запись, выполнение | Сохраняются все права по умолчанию. |
111 | Только выполнение | 666 чтение и запись | Новый файл нельзя выполнить. |
222 | Только запись | 555 чтение и выполнение | — |
333 | Запись и выполнение | 444 только чтение | — |
444 | Только чтение | 333 запись и выполнение | — |
555 | Чтение и выполнение | 222 только запись | — |
666 | Чтение и запись | 111 только выполнение | — |
777 | Чтение, запись и выполнение | 000 нет прав | Не сохраняются никакие права. |
Ещё один пример umask:
Восьмеричное число | Символ | |
---|---|---|
umask | 022 | --- -w- -w- |
Новый файл | ||
Начальные права файла | 666 | rw- rw- rw- |
Созданные права файла | 644 | rw- r-- r-- |
Новый каталог | ||
Начальные права каталога | 777 | rwx rwx rwx |
Созданные права каталога | 655 | rwx r-x r-x |
Подведём итоги этого проекта:
u
— владелец файла или каталога, обычно это тот, кто его создал.g
— группа представляет собой набор пользователей.o
— все остальные пользователи, кроме владельцев и членов группы.Umask — механизм контроля прав доступа для вновь создаваемых файлов.
А также команды управления правами:
chmod
— изменение прав доступа к файлу;chown
— смена владельца;umask
— изменение маски, чтобы присвоить права новому файлу.Сейчас вы узнаете, как изменять права доступа к файлам, владельцев файлов и umask.
umask
.echo 'test' > perms.022
.ls -l perms.022
.stat perms.022 | grep 'Access: ('
.chmod 000 perms.022
.ls -al perms.0022
.echo 'test' > perms.022
.rm -v perms.022
.Помните ли вы вопрос из предыдущего упражнения? Сейчас вы находитесь в похожей ситуации, потому что не можете выполнить никаких операций над этим файлом. Но почему вам разрешено удалить его? Это связано с тем, что при удалении файла фактически удаляется информация о файле из каталога, а сам файл не затрагивается. У меня есть много дополнительных вопросов по этой теме.
umask 666
.echo 'test' > perms.000
.ls -l perms.000
.cat perms.000
.chmod 600 perms.000
.cat perms.000
.rm -v perms.000
.umask 027
.echo 'test' > perms.027
.ls -l perms.027
.sudo chown root perms.027
.echo 'test1' >> perms.027
.chown user1 perms.027
.sudo chown user1 perms.027
.echo 'test1' >> perms.027
.rm -v perms.027
.umask 022
.Что вы увидите?
user1@vm1:~$ umask
0027
user1@vm1:~$ echo 'test' > perms.022
user1@vm1:~$ ls -l perms.022
-rw-r----- 1 user1 user1 5 Jul 9 10:23 perms.022
user1@vm1:~$ stat perms.022 | grep 'Access: ('
Access: (0640/-rw-r-----) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
user1@vm1:~$ chmod 000 perms.022
user1@vm1:~$ ls -al perms.0022
ls: cannot access perms.0022: No such file or directory
user1@vm1:~$ echo 'test' > perms.022
-bash: perms.022: Permission denied
user1@vm1:~$ rm -v perms.022
rm: remove write-protected regular file `perms.022'? y
removed `perms.022'
user1@vm1:~$ umask 666
user1@vm1:~$ echo 'test' > perms.000
user1@vm1:~$ ls -l perms.000
---------- 1 user1 user1 5 Jul 9 10:23 perms.000
user1@vm1:~$ cat perms.000
cat: perms.000: Permission denied
user1@vm1:~$ chmod 600 perms.000
user1@vm1:~$ cat perms.000
test
user1@vm1:~$ rm -v perms.000
removed `perms.000'
user1@vm1:~$ umask 027
user1@vm1:~$ echo 'test' > perms.027
user1@vm1:~$ ls -l perms.027
-rw-r----- 1 user1 user1 5 Jul 9 10:24 perms.027
user1@vm1:~$ sudo chown root perms.027
user1@vm1:~$ echo 'test1' >> perms.027
-bash: perms.027: Permission denied
user1@vm1:~$ chown user1 perms.027
chown: changing ownership of `perms.027': Operation not permitted
user1@vm1:~$ sudo chown user1 perms.027
user1@vm1:~$ echo 'test1' >> perms.027
user1@vm1:~$ rm -v perms.027
removed `perms.027'
user1@vm1:~$ umask 022
Объяснение:
perms.022
, содержащий строку test
.test
, но безуспешно из-за отсутствия прав./home/user1
, а только запись в нём.perms.000
, содержащий строку test
.perms.027
, содержащий строку test
.test1
к файлу приводит к ошибке.user1
не удалась, так как информация о владельце файла содержится в самом файле, точнее в его индексном узле.user1
. На этот раз операция успешна, так как выполняется от имени root.test1
в наш файл, на этот раз успешно.perms.027
.Дополнительные вопросы:
man chmod
, man chown
, man umask
.man chmod
раздел о битах setuid
, setgid
и sticky
. Установите бит setuid
для вашего каталога и выполните umask 002 && echo test | sudo tee perms.root user1
, результатом будет файл perms.root
группы.umask 002
не работает.user1_block0=$(echo 'stat /user1' | sudo debugfs /dev/sda9 2>/dev/null | grep '(0)' | cut -d':' -f2)
echo $user1_block0
sudo dd if=/dev/sda9 bs=4096 skip=$user1_block0 count=1 | hexdump -C
raw
, фактически это специальный файл. Поэтому когда вы удаляете файл, вы фактически удаляете запись из этого списка, у вас есть право изменить эту запись, потому что это и есть фактический каталог (особый файл).Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )