Урок 17. Управление правами доступа. Часть 1

В 3-м уроке была рассмотрена команда ls -l, а также краткое описание к выводу команды. В выводе команды также присутствует информация о правах доступа к данному файлу:

Отображение прав доступа файлов

 

Права доступа разделены на 3 группы:

    • владелец файла
    • группа владельцев файла
    • другие пользователи

 Формат записи прав доступа файлов в Linux

 

Для указания уровня доступа к файлу или каталогу используются следующие атрибуты. 

Для файла:

    • r (read) - чтение файла разрешено, то есть можно просматривать его содержимое, открывать в текстовом редакторе.
    • w (write) - запись файла разрешена, то есть можно его редактировать, переименовывать, удалять.
    • x (execute) - исполнение файла разрешено. Это касается исполняемых файлов.

Для каталога:

    • r (read) - разрешено просматривать содержимое  каталога, то есть можно воспользоваться командой ls и посмотреть какие файлы и каталоги содержаться в данном каталоге.
    • w (write) - используется совместно с атрибутом x (execute). Позволяет удалять и переименовывать файлы в каталоге.
    • x (execute) - при использовании совместно атрибутом r (read) позволяет увидеть атрибуты файла, то есть его размер, дату модификации, права доступа. Одним словом позволяет полноценно воспользоваться командой ls -l. При использовании совместно с атрибутом w (write) позволяет перейти в каталог командой cd, удалять и переименовывать файлы.

Рассмотрим вышесказанное на примерах. 

У нас в системе имеются 2 пользователя: teacher (учитель) и student (студент). У каждого из них имеется свой домашний каталог, в котором они могут хранить свои файлы.Так как пользователь student не является владельцем каталога /home/teacher и не относится к группе его владельцев, то для него будут действовать права доступа для категории остальных пользователей.

Домашний каталог пользователя teacher имеет следующие права доступа:

Отображение прав доступа каталогов в каталоге Home

 

Пользователь student хочет посмотреть какие файлы имеются в данном каталоге:

Каталог Teacher не доступен для просмотра

 

Доступа нет. Попробуем хотя бы перейти в этот каталог:

Переход в каталог Teacher запрещен

 

Снова нет доступа.

Теперь пользователь teacher решил всем разрешить просмотр его файлов в каталоге:

Просмотр каталога Teacher разрешен

 

Попробуем узнать что у него хранится:

Атрибуты файлов в каталоге Tecaher все еще недоступны

 

Мы узнали имена файлов, но абсолютно ничего не знаем какие это файлы и их атрибуты. То есть атрибут r (read) каталога позволяет просматривать имена (только имена) файлов с помощью ls, но не выдает о них дополнительную информацию. Попробуем перейти в этот каталог:

 

Переход в каталог teacher все еще запрещен

 

И снова неудача. Попробуем установить права записи, то есть атрибут w (write):

Для каталога teacher установлены права записи

 

Теперь попробуем все то же самое, что и до этого:

Атрибуты файлов каталога Tecaher все еще недоступны

Переход в каталог teacher все еще недоступен

 

Как видно атрибут w (write) сам по себе не работает. Удалим этот атрибут и установим x (execute):

Установлен атрибут x (excute) для каталога teacher

 

И в итоге:

Теперь вся информация о файлах в каталоге доступна для просмотра

Переход в каталог тоже разрешен

 

доступ к данному каталогу у нас имеется при наличии установленных прав на чтение и исполнение.

Попробуем теперь удалить или переименовать любой файл:

Переименование файла запрещено в каталоге Teacher

Удаление файла в каталоге Teacher также запрещено

 

Операция запрещена, так как у нас для каталога teacher/ не установлен атрибут w (write). 

Но ведь сами файлы в каталоге имеют полный доступ для всех остальных пользователей.. Почему мы ничего не можем сделать с данными файлами?

Отображение атрибутов файлов в каталоге Teacher

 

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

Когда для каталога запрещена запись, то остальным пользователям запрещено следующее:

    • удалять файлы из каталога
    • перемещать/переименовывать файлы
    • создавать жесткие ссылки
    • создавать новые файлы и каталоги в данном каталоге

Однако данная политика не накладывает ограничения на редактирование и копирование файлов. Можно с легкостью отредактировать и сохранить файл. Кроме того, мы можем скопировать файл в свой каталог. Причем файл будет иметь совершенно иные атрибуты. Например, скопируем файл Worknotes.txt в каталог /home/student/:

Копирование файлов каталога разрешено

 

Теперь у скопированного файла новый владелец и другие права доступа. Здесь данные операции регламентируется уже правами доступа самого файла. 

А что можно делать с файлами, когда установлен атрибут x (execute)? 

Можно делать следующее:

    • просматривать атрибуты файлов (совместно с атрибутом r) с помощью команды ls -l
    • переходить в каталог командой cd
    • запуск исполняемых файлов
    • совместно с атрибутом w (write) можно удалять и перемещать файлы


Теперь установим атрибут w (write) для каталога /home/teacher/ и посмотрим, что произойдет:

Установлен атрибут w (write) для каталога Teacher

Разрешено удалени и переименование файлов в каталоге teacher

 

Теперь можно делать абсолютно что угодно с файлами и каталогами. 

То есть атрибут w (write) работает всегда в паре с x (execute)? 

Все верно, но это в отношении каталогов. У файлов данные атрибуты независимы друг от друга. 

А как быть, если пользователь student хочет предоставить доступ к своим файлам определенным пользователям и запретить остальным?
Для этого существует группа владельцев файла. Пользователю student достаточно поменять группу владельцев файла на teacher и предоставить соответствующие права, а всем остальным - запретить:

Изменение группы владельцев

 

А как поменять группу? 

С помощью команды chgrp [опции] группа файл

Например, чтобы поменять группу владельцев файла Linux.txt на teacher введем chgrp teacher Linux.txt 

А если имеется много файлов, то как это сделать быстрее и проще? 

Есть специальная опция -R (--recursive). Например, имеется каталог Homework/ с файлами:

Рекурсивное отображение файлов каталога Homework

 

Применим команду chgrp -R teacher Homework/:

Рекурсивное изменение группы владельцев для всех файлов

 

А можно поменять и самого владельца? 

Конечно, существует команда chown [опции] владелец файл. 

Однако в тех случаях, когда нам необходимо поменять сразу и группу и владельца, то приходится выполнять 2 команды и это не очень удобно. Поэтому команда chown позволяет менять одновременно и владельца и группу: 

chown [опции] владелец:группа файл 

Опция -R (--recursive) действительна и для данной команды. 

А как можно менять сами права для группы владельцев и остальных пользователей? 

Существуют 2 способа:

    • символьный 
    • числовой

 

Символьный способ 

Используются следующие обозначения объектов, которым предоставляем права доступа:

    • u - владелец
    • g - группа
    • o - остальные
    • а - все перечисленные

 Операции управления:

    • - запретить
    • + разрешить
    • = заменить права на указанные

Права меняются с помощью команды chmod [опции] права_доступа файл 

Например, файл notes.txt имеет следующие права доступа:

Отображение прав доступа файла notes.txt

 

Запретим остальным пользователям редактирование данного файла: 

chmod o-w notes.txt

Изменение прав доступа файла notes.txt

 

Теперь разрешим группе владельцев исполнение данного файла: 

chmod g+x notes.txt

Изменение прав доступа файла notes.txt

 

То есть мы указываем объект (u, g или о), а затем с помощью символов управления назначаем или удаляем соответствующие права. 

А можно одновременно выполнить вышеуказанные действия в одной команде? 

Конечно, достаточно выполнить chmod o-w,g+x notes.txt  и результат будет тот же. 

А можно одновременно в одной команде выполнить следующее:

    • владельцу назначить rw-
    • группе назначить r-x
    • остальным назначить r-- ?

Конечно можно. Для этого существует символ ”=” : 

chmod u=rw,g=rx,o=r notes.txt

А если нужно всем назначить одинаковые права, например r-x, то воспользуемся chmod a=rx notes.txt:

Назначение одинаковых прав доступа файлов всем группам пользователей

 

 

Числовой способ 

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

Символьное представление прав доступа

Числовое представление

r (read)

4

w (write)

2

x (execute)

1

 

А вот как используется числовое представление прав доступа: 

Символьное представление

Операция

Цифровое представление

rwx

4 + 2 +1

7

rw-

4 + 2 + 0

6

r--

4 + 0 + 0

4

r-x

4 + 0 + 1

5

-wx

0 + 2 + 1

3

-w-

0 + 2 + 1

2

--x

0 + 0 + 1

1

---

0 + 0 + 0

0

 

Так как у нас права доступа разделяются на 3 категории (владелец, группа, остальные), то применяется трехзначное обозначение. Например, чтобы абсолютно всем назначить права rwx, то применяется команда chmod 777 notes.txt. 

Чтобы остальным пользователям разрешить только чтение файла, то есть r--, выполним chmod 774 notes.txt. 

Если хотим группе владельцев назначить права r-x, а остальным пользователям вообще все запретить, то выполним chmod 750 notes.txtНет смысла запоминать все комбинации, достаточно запомнить числовое значение каждого символа и сложить все 3 цифры.

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

Отображение прав доступа каталога Shared

 

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

Это так, однако в Linux есть небольшое решение. Существует специальный признак “sticky bit”, который устанавливается только для каталогов. Когда он установлен, то только владельцы файла могут его удалять и переименовывать. Остальным пользователям операции по удалению и переименованию файлов запрещены. 

Как установить данный признак? 

Можно это сделать 2-мя способами: символьным и числовым: 

chmod +t Shared/  

или 

chmod 1777 Shared/ 

то есть в начало добавляется 1. 

А как узнать, что этот признак установлен? 

Если признак установлен, то символ x (execute) в категории остальных пользователей заменяется на символ t:

Установлен атрибут t в правах доступа

 

Теперь пусть пользователь student удалит файлы пользователя teacher:

Не удалось удалить файл с признаком t

 

Как видно операция запрещена. 

А как удалить данный признак? 

Следующими командами: 

chmod -t каталог 

или 

chmod 0xxx каталог 

Существуют еще 2 специальных признака: suid и sgid. 

Для чего они используются? 

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

А что это могут быть за файлы? 

Например, утилиты passwd, visudo, chfn, gpasswd, useradd, groupadd, chgrp, chown и так далее.

Данные утилиты работают с такими файлами, как /etc/shadow, /etc/passwd, sudoers и т.д. Редактировать данные файлы может только суперпользователь. Поэтому в некоторых случаях и устанавливаются признаки suid или sgid. 

То есть обычный пользователь косвенно через некоторые файлы может редактировать файлы с ограниченным доступом? 

Все верно. В этом кроется потенциальная уязвимость системы, поэтому следует с большой осторожностью устанавливать подобные признаки файлам. 

А как узнать, что такой признак установлен? 

suid устанавливается для владельца файла, sgid - для группы владельцев. Если он установлен, то на месте символа x (execute) присутствует символ s:

Отображение признака s

отображение признака s

 

А как установить данные признак? 

Опять же 2-мя способами: символьным и числовым. 

Установка suid: 

chmod u+s файл 

или 

chmod 4xxx файл

то есть в начало добавляется 4.

 

Установка sgid: 

chmod g+s файл 

или 

chmod 2xxx файл

то есть в начало добавляется 2. 

А как удалить признак s? 

Одной из команд : 

chmod u-s файл,  

chmod g-s файл 

или просто 

chmod 0xxx файл

 

Список используемых команд:

chgrp группа файл - смена группы владельцев файла

chown владелец файл - смена владельца файла

chown владелец:группа файл - смены владельца и группы владельцев файла

chmod права_доступа файл - смена прав доступа к файлу