Готовый перевод Linux Fundamentals Part 3 / Основы Linux от основателя Gentoo. Часть 3: The Linux permissions model (один человек взял его на себя еще до появления тут)
Модель прав доступа в Linux
Один пользователь, одна группа
В этом разделе мы рассмотрим права доступа в Linux и модель владения (ownership). Мы уже видели, что каждый файл принадлежит одному пользователю и одной группе. Это сама суть модели прав доступа в Linux. Вы можете узнать, какому пользователю и группе принадлежит файл в листинге команды ls -l.
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
В данном примере исполнимый файл /bin/bash находится во владении пользователя root и группы wheel. Модель прав доступа позволяет задать три независимых уровня прав на каждый объект файловой системы -- для владельца, для группы и для всех остальных пользователей.
Понимание "ls -l"
Давайте рассмотрим вывод команды ls -l. Взглянем на первую колонку листинга:
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
Первое поле -rwxr-xr-x содержит символическое представление прав на данный файл. Первый знак (-) в этом поле определяет тип файла, в данном случае это обычный файл. Другие возможные значения:
'd' директория
'l' символическая ссылка
'c' устройство посимвольного ввода-вывода
'b' устройство блочного ввода-вывода
'p' FIFO
's' сокет
Три тройки
$ ls -l /bin/bash
-rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash
Остальная часть поля состоит из трех троек символов. Первая тройка представляет права владельца файла, вторая представляет права группы файла и третья права всех остальных пользователей.
"rwx"
"r-x"
"r-x"
Выше r означает, что чтение (просмотр данных содержащихся в файле) разрешено, w означает запись ( изменение, а также удаление данных) разрешено и x означает исполнение (запуск программы разрешен). Собрав все воедино мы видим, что кому угодно разрешено читать содержимое и исполнять этот файл, но только владельцу (root) разрешено как либо модифицировать этот файл. Так что если нормальным пользователям разрешено копировать содержимое этого файла только root может изменять или удалять его.
Кто я?
Перед тем как мы узнаем как изменить владельца или группу которой принадлежит файл, давайте сперва рассмотрим как узнать вашего текущего пользователя и группу к которой вы принадлежите. Если вы не использовали команду su недавно, ваш текущий пользователь это тот которым вы вошли в систему. Если вы часто используете su, вы можете не помнить пользователя под которым вы работаете на данный момент. Чтобы узнать под каким пользователем вы работаете, наберите whoami:
# whoami
root
# su drobbins
$ whoami
drobbins
В каких группах я нахожусь?
С помощью команды groups можно выяснить, к каким группам вы принадлежите.
$ groups
drobbins wheel audio
Из этого примера видно, что я состою в группах drobbins, wheel, и audio. Если вы хотите посмотреть, в каких группах состоит другой пользователь, то передайте его имя в качестве аргумента.
$ groups root daemon
root : root bin daemon sys adm disk wheel floppy dialout tape video
daemon : daemon bin adm
Изменение пользователя и группы принадлежания
Что бы изменить владельца или группу файла (или другого объекта) используется chown или chgrp соотвественно. Сначала нужно передать имя группы или владельца, а потом список файлов
# chown root /etc/passwd
# chgrp wheel /etc/passwd
Вы также можете изменить пользователя и группу одновременно используя команду chown в другой форме:
# chown root:wheel /etc/passwd
Вы можете использовать chown только из-под суперпользователя, но chgrp может быть использовано любым пользователем что бы изменить группу файла на группу пользователя, в которой он состоит.
Рекурсивное изменение прав
Команды chown и chgrp могут быть использованы с параметром -R, что пользоляет рекурсивно изменить владельца или группу у всех объектов в данной директории и ниже. Пример:
# chown -R drobbins /home/drobbins
Познакомимся с chmod
chown и chgrp могут быть применены для смены владельца и группы объекта файловой системы, а другая программа -- именуемая chmod -- используется для изменения rwx прав, которые мы можем посмотреть в списке вывода команды ls -l. chmod принимает два или более параметров: "mode", описывает как права должны будут изменены, следующему файлу или списку файлов:
$ chmod +x scriptfile.sh
В примере выше, нашим "режимом" является +x. Как вы можете предположить, +x режим указывает chmod сделать этот отдельный файл для пользователя, группы и всех остальных исполняемым.
Если мы хотим удалить все разрешения на исполнение файла, нам необходимо сделать следующее:
$ chmod -x scriptfile.sh
User/group/other детализация
До сих пор, наши примеры команды chmod влияли на права доступа всех трех наборов прав доступа - пользователя, группы и всех остальных пользователей. Часто бывает удобно изменить только один или два набора за раз. Чтобы сделать это, просто используйте специальный символ для обозначения набора прав доступа, который вым необходимо изменить, со знаком + или - перед ним. Используйте u для пользователя, g для группы и o для остальных пользователей.
$ chmod go-w scriptfile.sh
Мы только что удалили запись для группы и всех остальных пользователей, но оставил разрешения "владелец" нетронутыми.
Сброс прав доступа
Как дополнение к возможности бинарного изменения битов прав доступа существует возможность прямого задания требуемых разрешений как для одного, так и для всех наборов прав доступа. С помощью оператора "=" команды chmod можно задать требуемые разрешения (не указанные для данного оператора разрешения будут аннулированы).
$ chmod =rx scriptfile.sh
Выше мы просто выбрали все биты "читать" и "исполнять" , все биты "писать" не вибраны. Если вы хотите сбросить триплет, вы можете указать символическое имя для триплета перед =, как показано:
$ chmod u=rx scriptfile.sh
Цифровой режим задания прав доступа
До сих пор мы использовали в команде chmod т.н. символический режим задания прав доступа. Права доступа можно также задавать другим способом: с помощью квартета восьмизначных цифр. В этом синтаксисе (называемом цифровым режимом задания прав доступа), каждая восьмеричная цифра представляет собой набор трёх "элементарных" прав. Например, в наборе прав "1777" подстрока "777" отвечает за наборы прав доступа для "владельца", "группы" и "посторонних". С помощью восьмеричной цифры "1" задаются специальные биты доступа (см. далее подраздел "Плавающая первая цифра набора прав доступа"). С помощью следующей таблицы можно определить, как соотносятся возможные значения второй, третьей и четвертой восьмеричных цифр и символьные обозначения прав доступа:
Символьное обозначение прав доступа Цифровое (восьмеричное) обозначение прав доступа
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
Синтаксис цифрового режима задания прав доступа
Числовой синтаксис прав доступа особенно полезен когда требуется указать все разрешения для файла, так как указано в следующем примере:
$ chmod 0755 scriptfile.sh
$ ls -l scriptfile.sh
-rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh
В этом примере мы использовали цифровой режим доступа 0755, который соответствует набору -rwxr-xr-x в полном символьном обозначении.
Команда umask
При создании нового файла, процесс устанавливает для него режим доступа. Часто запрашивается цифровой режим доступа "0666" (чтение и запись доступны каждому). Такой режим является более чем избыточным. К счастью, в Linux для каждого пользователя существует маска режима создания пользовательских файлов "umask". Её значение используется при назначении прав новым файлам. С помощью этой маски система "обрезает" изначально затребованные для файла разрешения. Цель такого "обрезания" - сделать набор прав доступа более "адекватным" и безопасным. С помощью следующей команды можно узнать ваше текущее значение маски umask:
$ umask
0022
На системах Linux, маска режима создания пользовательских файлов по умолчанию 0022, когда разрешается другим читать ваши новые файлы (если они могут получить их) но не редактировать их.
Для того, чтобы по умолчанию повысить уровень безопасности при создании новых файлов, задайте следующую маску доступа:
$ umask 0077
С помощью такой маски можно добиться такого режима доступа, что ни члены ваших групп, ни посторонние пользователи не будут иметь никакого доступа к вновь созданным вами файлам. Каков же механизм действия маски umask? В отличие от "обычных" прав доступа к файлам, в маске umask задаются отключаемые права доступа. Давайте снова обратимся к нашей таблице соответствия символьных и цифровых обозначений прав доступа, чтобы понять, что означает маска "0077":
Символьное обозначение прав доступа Цифровое (восьмеричное) обозначение прав доступа
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
С помощью этой таблицы соответствия можно установить, что последние три цифры набора "0077" соответствуют символьному набору "---rwxrwx". Учитывая то обстоятельство, что в маске umask задаются отключаемые права доступа, приходим к выводу, что права доступа для набора "группа" и "посторонние" будут отключены. Права доступа для набора "владелец" маской затронуты не будут (второй восьмеричный нуль в цифровом наборе).
Введение в специальные биты доступа suid и sgid
Каждый раз при вашем входе в систему запускается новый процесс shell. Вы, наверняка, об этом уже знали, но вам, наверное, еще не известно, что этот новый процесс shell (обычно это bash) запускается под вашей учетной записью. Следствием этого является то, что процесс bash может иметь доступ ко всем вашим файлам и папкам. На практике нам (как пользователям) часто приходится запускать программы, не принадлежащие нам. Учитывая то обстоятельство, что запускаемые программы наследуют права вашей учетной записи, из программ невозможно получить доступ к файловым объектам, к которым у вас отсутствует доступ.
Например, непривилегированный пользователь не может изменить файл "passwd" потому, что флаг записи у этого файла деактивирован для всех, кроме пользователя root:
$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd
Тем не менее, у непривилегированных пользователей возникает потребность в изменении файла /etc/passwd (пусть даже косвенным путем) в случае замены своего пароля доступа в систему. Так как же такая модификация возможна?
Специальный бит доступа suid
К счастью, в модели прав доступа Linux предусмотрены два специальных бита "suid" и "sgid". Если для исполнимой программы установлен бит "suid", то программа будет исполняться под учетной записью владельца программы, а не под учетной записью пользователя, запустившего программу на исполнение.
Вернемся к проблеме модификации файла "/etc/passwd". Если взглянуть на атрибуты команды "passwd", то можно увидеть, что её владельцем является пользователь "root":
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd
Вы обратили внимание на то, что в триплете прав доступа "владелец" вместо символа "x" появился символ "s"? Это означает, что для этой программы установлены бит "исполнение" и бит "suid". Поэтому, когда будет вызвана программа "passwd", она будет исполняться под учетной записью пользователя "root" (с полными правами доступа), а не под учетной записью пользователя, запустившего программу. Благодаря наличию прав пользователя "root", программа "passwd" может вносить изменения в файл "/etc/passwd".
Предосторожности при использовании специальных битов доступа suid/sgid
Выше было показано, как используется бит "suid". Специальный бит "sgid" используется аналогично. Он позволяет на время исполнения программы получить членство в группе владельца этой программы.
Важно!
Ниже будут перечислены сведения, достаточны важные для понимания работы с битами "suid" и "sgid". Первое: эти биты занимают ту же позицию в триплете прав "владелец", что и бит "x" (исполнение). Если у файла установлен бит "x", то добавление бита "suid" приведет к тому, что в этой позиции триплета будет стоять строчная буква "s". Если бит "x" не был установлен, то добавление бита "suid" приведет к тому, что в этой позиции триплета будет стоять прописная буква "S".
Важно!
Еще важное замечание: биты "suid" и "sgid" значительно упрощают некоторые операции, но неадекватное применение этих битов может привести к нарушению безопасности системы. Рекомендуется ограничивать число программ с битом "suid". Программа "passwd" входит в этот ограниченное множество.
Манипуляции со специальными битами доступа suid и sgid
Установка и удаление битов "suid" и "sgid" не представляет какой-либо сложности. Ниже приведен пример установки бита "suid":
# chmod u+s /usr/bin/myapp
А здесь мы удаляем бит "sgid" с директории. Мы увидим, как бит "sgid" действует на директории, всего через несколько панелей:
# chmod g-s /home/drobbins
Права и директории
До сих пор мы рассматривали права доступа применительно к обычным файлам. Рассматривая права доступа применительно к директориям, ситуация меняется. Для директорий применяются те же самые биты доступа, но их интерпретация несколько отличается от интерпретации для файлов.
Если для директории установлен бит "чтение", то это означает, что вы можете просматривать содержимое директории. Бит "запись" означает, что вы можете создавать файлы в директории. Бит "исполнение" означает, что вы можете войти в директорию и получить доступ к любой поддиректории в "дереве" директории. Без установленного бита "исполнение" невозможно получить доступ к объектам файловой системы внутри директории. Без установленного бита "чтение" объекты внутри директории невидимы, но доступ к объектам такой директории извне возможен, только если известен полный путь к ним.
Директории и специальный бит sgid
И, если в каталоге включен флаг "SGID" в любой файловой системе при созданий обектов они наследуют групу каталога. Эта особенность очень удобна, когда вам нужно создать дерево каталогов, которые будут использоваться групой людей, которые находятся в одной групе.Сделать это просто:
# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace
Теперь, все пользователи в группе MyGroup могут создавать файлы и каталоги внутри /home/groupspace, и они будут автоматически назначены группе которой принадлежит MyGroup. В зависимости от настройки UMASK пользователя,новые объекты файловой системы может или не может быть доступен для чтения, записи или исполняемые другими членами группы MyGroup.
Каталоги и удаление
По умолчанию в Linux каталоги ведут себя таким образом, что не может быть идеальным во всех ситуациях. Как правило, любой человек может переименовать или удалить файл в каталоге, пока он имеют доступ на запись в этот каталог. Для каталогов, используемых отдельными пользователями, такое поведение, как правило, очень хорошо.
Тем не менее, для каталогов, которые используются многими пользователями, особенно /TMP и /VAR,такое поведение может плохо закончится. Так как любой желающий может записать в эти каталоги, любой человек может удалять или переименовывать чужие файлы - даже если он не владеет ими! Очевидно,трудно использовать /TMP,когда любой другой пользователь может ввести RM-rf/TMP/* в любое время и уничтожить все файлы.
К счастью,Linux имеет нечто,называемое липкий бит.Когда /TMP обладает липким битом (CHMOD+т),только люди,которые способны удалять или переименовывать файлы в /TMP обично ето владелец каталога,владелец файла или root. Практически все дистрибутивы Linux позволяют ставить липкий бит на /TMP но вы можете обнаружить, что липкий бит пригодится в других ситуациях.
И в заключение этого раздела, мы, наконец, взглянем на неуловимую первую цифру числовой режим. Как вы можете видеть, это первая цифра используется для установки липкой, SUID, SGID и биты:
SGID SUID липкий режим цифр
on on on 7
on on off 6
on off on 5
on off off 4
off on on 3
off on off 2
off off on 1
off off off 0
Ниже приведен пример того, как использовать 4-циферный режим для установки прав доступа на директорию, которая будет использоваться рабочей группой:
# chmod 1775 /home/groupfiles
В качестве домашней работы выясните что значит 1755 в настройках прав доступа. :)
Переведено на Нотабеноиде
http://notabenoid.org/book/12606/40963
Переводчики: joel, vapvap14, kindacute, fpinger
MisterioSS, The_Barbarian, da_smag
Настройки
Готово:
