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

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

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

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

Для файла:

  • 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 имеет следующие права доступа:

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

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

Отказано в доступе

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

Права доступа на чтение

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

Отказано в доступе

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

Теперь попробуем выполнить все те же действия, что и до этого:

Отказано в доступе

Отказано в доступе

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

В доступе разрешено, выведено содержимое каталога

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

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

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

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

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

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

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

 

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

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

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

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

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

 

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

Доступ разрешен

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

 

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

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

А как быть, если пользователь student хочет предоставить доступ к своим файлам определенным пользователям и запретить остальным?

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

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

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

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

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

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

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

Рекурсивное изменение группы пользователей

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

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

Однако в тех случаях, когда нам необходимо поменять сразу и группу и владельца, то приходится выполнять 2 команды и это не очень удобно. Поэтому команда chown позволяет менять одновременно и владельца и группу chown [опции] владелец:группа файл. Опция -R (—recursive) действительна и для данной команды.

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

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

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

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

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

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

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

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

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

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

chmod o-w notes.txt

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

chmod g+x notes.txt

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

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

Конечно, достаточно выполнить 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:

Установлены атрибуты rwx

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

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

Символьное представление прав доступа Числовое представление
r (read) 4
w (write) 2
(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/, который содержит файлы всех пользователей. Такое явление обычное в компаниях, когда у пользователей недостаточно места на диске и  они используют сетевые ресурсы. Чтобы пользователи могли добавлять и удалять свои файлы установлены все разрешающие права.

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

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

 

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

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

chmod +t Shared/ или chmod 1777 Shared/, то есть в начало добавляется 1.

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

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

Отображение каталога Shared

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

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

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

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

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:

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

Опять же 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 права_доступа файл — смена прав доступа к файлу