1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-llthw-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ex23.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 25.11.2024 03:02 8398775

Упражнение 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

Подведём итоги этого проекта:

  • Права или права доступа — механизм контроля доступа к файлам и каталогам.
  • Режимы прав — типы прав, которые позволяют выполнять операции с файлами.
    • Чтение, r — возможность чтения файла.
    • Запись, w — возможность записи в файл.
    • Выполнение, x — возможность выполнения файла как программы. Для каталогов это имеет особое значение, позволяя входить в каталог. Пользователь — субъект с правами доступа к файлам и каталогам.
  • Пользователь/владелец, u — владелец файла или каталога, обычно это тот, кто его создал.
  • Групповой класс, g — группа представляет собой набор пользователей.
  • Прочие классы, o — все остальные пользователи, кроме владельцев и членов группы.

Umask — механизм контроля прав доступа для вновь создаваемых файлов.

А также команды управления правами:

  • chmod — изменение прав доступа к файлу;
  • chown — смена владельца;
  • umask — изменение маски, чтобы присвоить права новому файлу.

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

  1. umask.
  2. echo 'test' > perms.022.
  3. ls -l perms.022.
  4. stat perms.022 | grep 'Access: ('.
  5. chmod 000 perms.022.
  6. ls -al perms.0022.
  7. echo 'test' > perms.022.
  8. rm -v perms.022.

Помните ли вы вопрос из предыдущего упражнения? Сейчас вы находитесь в похожей ситуации, потому что не можете выполнить никаких операций над этим файлом. Но почему вам разрешено удалить его? Это связано с тем, что при удалении файла фактически удаляется информация о файле из каталога, а сам файл не затрагивается. У меня есть много дополнительных вопросов по этой теме.

  1. umask 666.
  2. echo 'test' > perms.000.
  3. ls -l perms.000.
  4. cat perms.000.
  5. chmod 600 perms.000.
  6. cat perms.000.
  7. rm -v perms.000.
  8. umask 027.
  9. echo 'test' > perms.027.
  10. ls -l perms.027.
  11. sudo chown root perms.027.
  12. echo 'test1' >> perms.027.
  13. chown user1 perms.027.
  14. sudo chown user1 perms.027.
  15. echo 'test1' >> perms.027.
  16. rm -v perms.027.
  17. 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

Объяснение:

  1. Вывести текущий umask.
  2. Создать perms.022, содержащий строку test.
  3. Вывести информацию об этом файле.
  4. В восьмеричном формате вывести информацию о правах доступа этого файла.
  5. Изменить права доступа этого файла, запретив любому пользователю выполнять какие-либо операции над ним.
  6. Вывести информацию об этом файле.
  7. Попытаться заменить содержимое этого файла строкой test, но безуспешно из-за отсутствия прав.
  8. Удалить этот файл. Это возможно, поскольку не затрагиваются ни сам файл, ни каталог /home/user1, а только запись в нём.
  9. Измените umask, чтобы по умолчанию не назначать никаких прав.
  10. Создайте perms.000, содержащий строку test.
  11. Выведите информацию об этом файле.
  12. Попробуйте вывести содержимое этого файла, но это явно приведёт к ошибке.
  13. Измените права доступа файла, чтобы разрешить владельцу чтение и запись.
  14. Выведите содержимое этого файла, на этот раз успешно.
  15. Удалите этот файл.
  16. Снова измените umask.
  17. Создайте perms.027, содержащий строку test.
  18. Выведите информацию об этом файле.
  19. Сделайте владельцем файла root.
  20. Попытка добавить строку test1 к файлу приводит к ошибке.
  21. Попытка сделать владельцем файла пользователя user1 не удалась, так как информация о владельце файла содержится в самом файле, точнее в его индексном узле.
  22. Сделать владельцем файла user1. На этот раз операция успешна, так как выполняется от имени root.
  23. Добавить строку test1 в наш файл, на этот раз успешно.
  24. Удалить perms.027.
  25. Вернуть umask к его значению по умолчанию.

Дополнительные вопросы:

  • Прочитайте 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-llthw-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-llthw-zh.git
oschina-mirror
wizardforcel-llthw-zh
wizardforcel-llthw-zh
master