Table of Contents
Привилегии
В данной статье будут рассмотрены следующие программы:
id
– выводит информацию об идентичности пользователя;chmod
– изменяет режим доступа к файлу;umask
– определяет разрешения доступа к файлам по умолчанию;su
– запускает командную оболочку от имени другого пользователя;sudo
– выполняет команду от имени другого пользователя;chown
– изменяет владельца файла;chgrp
– изменяет группу файла;passwd
– изменяет пароль пользователя.
Владельцы, члены группы и все остальные
Для эксперимента, возьмем файл /etc/shadow
. При его исследование получаем вот такую проблему:
file /etc/shadow /etc/shadow: regular file, no read permission less /etc/shadow /etc/shadow: Permission denied
Причина этого сообщения об ошибке заключается в том, что обычные пользователи не имеют права читать этот файл.
В модели безопасности Unix пользователь может владеть файлами и каталогами. Если пользователь владеет файлом или каталогом, он может управлять доступом к нему. Пользователи могут также принадлежать группе, состоящей из одного или нескольких пользователей, и получить права доступа к файлам и каталогам для членов группы, которые определяются владельцами. Кроме прав доступа для группы, владелец может также определить некоторые права доступа для всех остальных, их в терминологии Unix называют мир (world). Получить информацию о своей идентичности можно с помощью команды id:
uid=1000(nevvad) gid=1000(nevvad) groups=1000(nevvad)
Давайте рассмотрим этот вывод. Когда создается учетная запись пользователя, ей присваивается число, которое называют идентификатором пользователя(user ID), или uid. Это число, исключительно ради удобства человека, отображается как имя пользователя. Пользователю назначается идентификатор основной группы (primary group ID), или gid, и дополнительно пользователь может включаться в состав других групп.
А где же вся эта информация хранится? Как и многое другое в Linux, она хранится в паре текстовых файлов. Учетные записи пользователей хранятся в файле /etc/shadow
, а информация о группах – в файле /etc/shadow
. Когда создаются новые учетные записи и группы, эти файлы изменяются вместе с файлом /etc/shadow
, где хранится информация о пароле пользователя. Для каждой учетной записи в файле /etc/shadow
определяется имя пользователя (для входа), числовой идентификатор пользователя (uid), числовой идентификатор основной группы (gid), действительное имя пользователя, путь к домашнему каталогу и командная оболочка входа (login shell). Заглянув внутрь /etc/shadow
и /etc/shadow
, можно заметить, что помимо учетных записей обычных пользователей здесь также хранятся учетные записи суперпользователя (uid 0) и различных других системных
пользователей.
Несмотря на то, что во многих Unix-подобных системах обычных пользователей включают в общую группу, такую как users, в современных дистрибутивах Linux принято создавать для каждого пользователя свою, уникальную группу с одним членом и именем, совпадающим с именем пользователя. Это упрощает распределение определенных типов привилегий.
Чтение, запись и выполнение
Права доступа к файлам и каталогам определяются в терминах права на чтение, права на запись и права на выполнение. Если взглянуть на вывод команды ls, можно увидеть некоторые подсказки о том, как эти права реализованы:
> foo ls -l foo -rw-r--r-- 1 nevvad nevvad 0 Jul 13 16:34 foo
Первые 10 символов в выводе – это атрибуты файла. Первый из этих символов определяет тип файла. В таблице ниже перечислены типы файлов, которые чаще всего встречаются на практике (существуют также другие, реже используемые типы файлов).
Атрибут | Тип файла |
---|---|
- | Обычный файл |
d | Каталог |
l | Символическая ссылка. Обратите внимание, что для символических ссылок все остальные атрибуты имеют значение rwxrwxrwx и не отражают действительные права доступа. Фактические права доступа к файлу определяются атрибутами самого файла, на который указывает символическая ссылка |
c | Специальный файл символьного устройства. Файлы этого типа соответствуют устройствам, таким как терминал или модем, которые обрабатывают данные как потоки байтов |
b | Специальный файл блочного устройства. Файлы этого типа соответствуют устройствам, таким как привод жесткого диска или CD-ROM, которые обрабатывают данные блоками |
Остальные девять символов в атрибутах файла называются режимом доступа к файлу и представляют права на чтение, запись и выполнение для владельца файла, группы – владельца файла и всех остальных
-------------------------- Владелец Группа Мир rwx rwx rwx --------------------------
Установленные атрибуты режима r
, w
и x
оказывают определенное влияние на файлы и каталоги, как показано в таблице ниже.
Атрибут | Файл | Директории |
---|---|---|
r | Разрешается открывать и читать содержимое файла | Разрешается читать содержимое каталога, если вместе с этим атрибутом установлен атрибут права на выполнение |
w | Разрешается записывать в файл или усекать его; однако этот атрибут не дает права переименовывать и удалять файлы. Возможность переименования и удаления файлов определяется атрибутами вмещающего каталога | Разрешается создавать, удалять и переименовывать файлы внутри каталога, если вместе с этим атрибутом установлен атрибут права на выполнение |
x | Разрешается интерпретировать файл как программу и выполнять ее. Файлы, содержащие программы на языках сценариев, дополнительно должны быть доступны для чтения, иначе они не будут выполняться | Разрешается входить в каталог, то есть выполнять команду cd для перехода |
В следующей таблице, приводится несколько примеров установки атрибутов файлов.
Атрибуты файлов | Значение |
---|---|
-rwx—— | Обычный файл, доступный владельцу для чтения, записи и выполнения. Никто другой не имеет прав доступа к файлу |
-rw——- | Обычный файл, доступный владельцу для чтения и записи. Никто другой не имеет прав доступа к файлу |
-rw-r–r– | Обычный файл, доступный владельцу для чтения и записи. Члены группы имеют право читать файл. Все остальные имеют право читать файл |
-rwxr-xr-x | Обычный файл, доступный владельцу для чтения, записи и выполнения. Все остальные имеют право читать и выполнять файл |
-rw-rw—- | Обычный файл, доступный для чтения и записи только владельцу и членам группы |
Lrwxrwxrwx | Символическая ссылка. Все символические ссылки имеют недействительные значения атрибутов. Фактические права доступа к файлу определяются атрибутами самого файла, на который указывает символическая ссылка |
drwxrwx— | Каталог. Владелец и члены группы могут входить в каталог, создавать, переименовывать и удалять файлы внутри каталога |
drwxr-x— | Каталог. Владелец может входить в каталог, создавать, переименовывать и удалять файлы внутри каталога. Члены группы могут входить в каталог, но не могут создавать, переименовывать и удалять файлы внутри катало |
chmod — изменение режима доступа к файлу
Для изменения режима (прав) доступа к файлу или каталогу используется команда chmod. Имейте в виду, что права доступа к файлу или каталогу может изменить только владелец или суперпользователь. Команда chmod поддерживает два разных способа изменения режима:
- с использованием восьмеричных чисел;
- с использованием символического представления.
Сначала рассмотрим использование восьмеричных чисел. При использовании восьмеричной формы записи шаблон желаемых привилегий определяется восьмеричными числами. Так как каждая цифра в восьмеричном числе определяется тремя двоичными разрядами, она точно укладывается в схему хранения режима доступа к файлу. В следующей таблице поясняется, что мы имеем в виду.
----------------------------------------- Восьмкричное Двоичное Режим доступа 0 000 --- ----------------------------------------- 1 001 --x ----------------------------------------- 2 010 -w- ----------------------------------------- 3 011 -wx ----------------------------------------- 4 100 r-- ----------------------------------------- 5 101 r-x ----------------------------------------- 6 110 rw- ----------------------------------------- 7 111 rwx -----------------------------------------
C помощью трех восьмеричных цифр мы можем определить режим доступа к файлу для владельца, для группы и для остального мира.
> foo ls -l foo -rw-r--r-- 1 nevvad nevvad 0 Jul 13 17:39 foo chmod 600 foo ls -l foo -rw------- 1 nevvad nevvad 0 Jul 13 17:39 foo
Передав аргумент 600, мы установили права для владельца, позволяющие ему читать данные из файла и записывать их в файл. Но при этом отобрали все права у группы и остального мира. Несмотря на кажущееся неудобство необходимости запоминания соответствий между восьмеричными и двоичными представленияи, вам, скорее всего, придется использовать лишь несколько наиболее популярных шаблонов: 7 (rwx), 6 (rw-), 5 (r-x), 4 (r–) и 0 (—)
Команда chmod поддерживает также символическую форму определения режимов доступа к файлу. Символическая форма записи делится на три части:
- для кого устанавливаются разрешения;
- какие операции с разрешениями будут выполняться;
- на какие разрешения эти операции будут влиять.
Чтобы указать, для кого устанавливаются разрешения, используется комбинация символов u
, g
, o
и a
, как показано в таблице ниже
Символ | Значение |
---|---|
u | Сокращенно от user (пользователь), означает владельца файла или каталога |
g | Группа |
o | Сокращенно от others (другие, остальные), означает весь остальной мир |
a | Сокращенно от all (все); комбинация из всех трех символов: u , g и o |
Если не указан ни один символ, предполагается a
(all — все). Операцией может быть знак +
, соответствующий добавлению заданных разрешений, знак -
, соответствующий отъему заданных разрешений, или знак =
, указывающий, что только заданные разрешения должны быть установлены, а все остальные отобраны.
Разрешения определяются символами r
, w
и x
. В таблице ниже перечислены некоторые примеры символической формы записи.
Атрибуты файлов | Описание команды |
---|---|
u+x | Добавляет право на выполнение, но только для владельца |
u-x | Отнимает право на выполнение у владельца |
+x | Добавляет право на выполнение для владельца, группы и остального мира. Эквивалент записи a+x |
o-rw | Отнимает право на чтение и запись у всех, кроме владельца и группы |
go=rw | Устанавливает право на чтение и запись для всех, кроме владельца. Если прежде файл имел разрешение на выполнение для группы и всего мира, это право отнимается |
u+x,go=rx | Добавляет право на выполнение для владельца и устанавливает право на чтение и выполнение для группы и всего мира. При выполнении сразу нескольких операций с привилегиями они должны разделяться запятой |
Кто-то предпочитает пользоваться восьмеричной формой записи, кому-то больше нравится символическая. Символическая форма записи удобна тем, что позволяет установить единственный атрибут, не влияя на остальные.
А теперь несколько слов о параметре –recursive
: он воздействует и на файлы, и на каталоги, поэтому он не так полезен, как можно было бы предположить, потому что редко требуется устанавливать одинаковые разрешения для файлов и каталогов.
umask - определение разрешений доступа к файлам по умолчанию
Команда umask определяет разрешения по умолчанию, которые устанавливаются для файла при его создании. В ней с помощью восьмеричной формы записи определяется битовая маска для сбрасываемых атрибутов режима доступа. Взгляните:
rm -f foo.txt umask 0022 > foo.txt ls -l foo.txt -rw-r--r-- 1 nevvad nevvad 0 Jul 14 10:31 foo.txt
Сначала мы удалили существующий файл foo.txt
, чтобы, так сказать, начать с чистого листа. Далее мы выполнили команду umask без аргумента, чтобы увидеть текущее значение маски. Она вернула нам значение 0002 (часто также используется значение 0022) – восьмеричное представление действующей маски. Затем мы создали новый файл foo.txt
и вывели для него разрешения.
Как видите, владелец и группа получили права на чтение и запись, тогда как все остальные – только право на чтение. Весь мир не получил права на запись из-за значения маски. Давайте повторим пример, но на этот раз определим свою маску:
rm -f foo.txt umask 0000 > foo.txt ls -l foo.txt -rw-rw-rw- 1 nevvad nevvad 0 Jul 14 10:35 foo.txt
После установки маски в значение 0000 (таким способом мы фактически выключили ее) вновь созданный файл получил разрешение на запись для всего мира. Чтобы лучше понять суть происходящего, мы снова должны вернуться к восьмеричным числам. Если развернуть маску в двоичное представление и сравнить ее с двоичным представлением атрибутов, можно понять, что произошло:
---------------------------------------------------------------- Исходный режим доступа к файлу --- rw- rw- rw- ---------------------------------------------------------------- Маска 000 000 000 010 ---------------------------------------------------------------- Результат --- rw- rw- r-- ----------------------------------------------------------------
Забудем пока про начальные нули (мы вернемся к ним чуть позже) и обратим внимание, что атрибут, соответствующий той позиции, где в маске стоит 1, был сброшен, – в данном случае право на запись для всего мира. Теперь понятно, что делает маска. В любой позиции, где в маске появляется 1, соответствующий атрибут сбрасывается. Если посмотреть на значение маски 0022, легко увидеть, что оно делает:
---------------------------------------------------------------- Исходный режим доступа к файлу --- rw- rw- rw- ---------------------------------------------------------------- Маска 000 000 010 010 ---------------------------------------------------------------- Результат --- rw- r-- r-- ----------------------------------------------------------------
И снова атрибуты, соответствующие позициям, где в маске стоит 1, были сброшены. Заканчивая эксперимент, не забудем все вернуть в исходное состояние:
rm foo.txt; umask 0022
Вам редко придется изменять маску, потому что значение по умолчанию, устанавливаемое дистрибутивом, прекрасно подходит для большинства нужд. Однако в некоторых ситуациях, требующих повышенной безопасности, маску может понадобиться изменить.
Некоторые специальные разрешения
Обычно разрешения в восьмеричном представлении мы видим как трехзначные числа, но технически более правильно выражать их четырехзначными числами. Почему? Потому что в дополнение к разрешениям на чтение, запись и выполнение существует еще несколько редко используемых разрешений.
Первый атрибут – бит setuid (восьмеричное значение 4000). Если это разрешение применяется к выполняемому файлу, в качестве эффективного идентификатора пользователя для процесса устанавливается не идентификатор реального пользователя (пользователя, фактически запустившего программу), а идентификатор владельца программы. Чаще этот бит устанавливается для программ, владельцем которых является суперпользователь. Когда обычный пользователь запускает программу с установленным битом setuid, принадлежащую пользователю root, программа выполняется с эффективными привилегиями суперпользователя. Это дает возможность программам обращаться к файлам и каталогам, недоступным для обычного пользователя. Очевидно, что из-за возникающих проблем безопасности число таких программ в системе должно быть сведено к минимуму.
Второй редко используемый атрибут – бит setgid (восьмеричное значение 2000). По аналогии с битом setuid он устанавливает эффективный идентификатор группы для процесса, выбирая вместо идентификатора группы реального пользователя группу владельца файла. Если установить бит setgid для каталога, вновь создаваемые файлы в этом каталоге будут принадлежать группе владельца каталога, а не группе владельца файла, создавшего его. Это разрешение может пригодиться для установки на каталоги, содержимое которых должно быть доступно всем членам основной группы владельца каталога, независимо от принадлежности к основной группе владельца файла.
Третий атрибут называется битом sticky (восьмеричное значение 1000). Это пережиток, оставшийся от первых версий Unix, которые предоставляли возможность пометить выполняемый файл как «невытесняемый». Linux игнорирует бит sticky у файлов, но если установить его для каталога, он не позволит пользователю удалять или переименовывать файлы, если только пользователь не является владельцем каталога, владельцем файла или суперпользователем. Это разрешение часто применяется для управления доступом к общим каталогам, таким как /tmp
.
Ниже приводится несколько примеров использования chmod с символической формой определения этих специальных разрешений.
# установка бита setuid на файл программы chmod u+s program -rwsr-xr-x # установка бита setgid на каталог chmod g+s dir drwxrwsr-x # установка бита sticky на каталог: chmod g+t dir drwxrwxrwt
/tmp