20 сент. 2000 г.

Азы linux (для детей) урок 20

Защита файлов


Права доступа: первая линия обороны Linux

Модель безопасности Linux основана на той, которая используется в системах UNIX, и является такой же строгой (и иногда даже более). В системе Linux каждый файл принадлежит пользователю и группе пользователей. Есть также третья категория пользователей, которые не являются пользователем-владелецем и не принадлежат группе, владеющей файлом. Для каждой категории пользователей, разрешение на чтение, запись и выполнение может быть предоставлено или отклонено.
Мы уже использовали "длинный" вариант просмотра файлов с помощью команды ls -l, хотя и по другим причинам. Эта команда также отображает разрешения файла (права доступа) для этих трех категорий пользователей; они указаны девятью символами, которые следуют за первым символом (индикатором типа файла). Как видно из приведенных ниже примеров, первые три символа из этой серии девяти отображают права доступа реального пользователя, который является владельцем файла. Следующие три — предназначены для группы-владельца файла, последние три — для других пользователей. Разрешения всегда описываются в одном и том же порядке: чтение, запись и исполнение (выполнение, запуск) для пользователя, группы и других. Вот некоторые примеры:
marise:~> ls -l To_Do
-rw-rw-r--    1 marise  users      5 Jan 15 12:39 To_Do
marise:~> ls -l /bin/ls
-rwxr-xr-x    1 root    root   45948 Aug  9 15:01 /bin/ls*
Первый файл является обычным (вначале прочерк). Пользователь с именем marise или пользователи, принадлежащие к группе users, могут читать и переписывать (изменять/перемещать/удалять) файл, но они не могут исполнять его (второе и третье тире). Другим пользователям разрешено только читать этот файл, но они не могут изменять или выполнять его (четвертое и пятое тире).
Второй пример — это исполняемый файл; отличие: все могут запустить данную программу, но вам нужно быть суперпользователем, чтобы изменить его.
Info-страницы подробно объясняют, каким образом команда ls управляет отображением прав доступа (см. в разделе What information is listed).
Для удобства работы с командами, как права доступа (или режимы), так и категории пользователей имеют коды. См. таблицы ниже.
Таблица 3.7. Коды режимов доступа
Код Значение
0 или - Права доступа, которые должны были прописаны в данном месте, не предоставляются.
4 или r Предоставляется право на чтение для определенной категории пользователей.
2 или w Право на запись для категории пользователей, определенных в данном месте.
1 или x Право на выполнение для определенной категории пользователей.
Таблица 3.8. Коды группы пользователей
Код Значение
u Права пользователя
g Права группы
o Права для остальных
Использование данного механизма разделения прав обязательно; это позволяет обеспечить высокий уровень безопасности даже без сетевой защиты. Среди прочих функций такая схема безопасности заботится о доступе пользователей к программам, it can serve files on a need-to-know basis и защищает конфиденциальные данные, такие как домашние каталоги и системные конфигурационные файлы.
Вы должны знать ваше имя пользователя. Если вы не знаете, то его можно отобразить, используя команду id, которая также отображает группу по умолчанию, к которой вы принадлежите и, в конечном итоге, другие группы, членом которых вы являетесь:
tilly:~> id
uid=504(tilly) gid=504(tilly) groups=504(tilly),100(users),2051(org)
Ваше имя пользователя, также хранится в переменной окружения USER:
tilly:~> echo $USER
tilly

Инструменты

Команда chmod

Обычным следствием применения строгих правил доступа к файлам, а иногда и неудобством, является то, что права доступа должны быть изменены по тем или иным причинам. Чтобы это сделать, мы используем команду chmod, что привело к тому, что chmod стал почти приемлемым английским глаголом, обозначающим изменение режима доступа к файлу. Команда chmod может быть использована с буквенными и числовыми опциями, что вам больше всего нравится.
В приведенном ниже примере используются буквенные параметры для решения проблемы, с которой обычно сталкиваются начинающие пользователи:
asim:~> ./hello
bash: ./hello: bad interpreter: Permission denied

asim:~> cat hello
#!/bin/bash
echo "Hello, World"

asim:~> ls -l hello
-rw-rw-r--    1 asim    asim    32 Jan 15 16:29 hello

asim:~> chmod u+x hello

asim:~> ./hello
Hello, World

asim:~> ls -l hello
-rwxrw-r--   1 asim    asim    32 Jan 15 16:29 hello*
+ и - используются для разрешения или запрещения конкретного права для определенной категории. Комбинации через запятую не допускаются. Info и man-страницы содержат полезные примеры. Здесь еще один, в котором файл из предыдущего примера становится личным файлом пользователя asim:
asim:~> chmod u+rwx,go-rwx hello

asim:~> ls -l hello
-rwx------    1 asim    asim    32 Jan 15 16:29 hello*
Ситуации, в которых появляются сообщения об ошибках, говорящих, что допуск запрещен, как правило, связаны с проблемой прав доступа. Также, реплики вроде: "Это работало вчера" и "Когда я запускаю это как root, то оно работает", скорее всего, вызваны тем, что не были учтены права доступа к файлам.
При использовании chmod с цифровыми аргументами, значения для каждого предоставляемого права доступа указываются в "месторасположение" категории. Таким образом, получается трехзначное число, которое представляет собой символическое обозначение того, что должна сделать команда chmod. В следующей таблице перечислены наиболее распространенные комбинации.
Таблица 3.9. Защита файлов с помощью chmod
Код Значение
chmod 400 file Защита файла от случайной перезаписи
chmod 500 directory Чтобы защитить себя от случайного удаления, переименования или перемещения файлов из этой директории.
chmod 600 file Личный файл, изменяемый только пользователем, который ввел эту команду.
chmod 644 file Всеми читаемый файл, который может быть изменен только пользователем-владельцем.
chmod 660 file Пользователи, принадлежащие вашей группе, могут изменить этот файл, другие не имеют никакого отношения к нему вообще.
chmod 700 file Защищает файл от любого доступа посторонних, в то же время пользователь-владелец имеет полный контроль.
chmod 755 directory Для файлов, которые должны быть читаемыми и исполняемыми всеми, но изменяемые только пользователем-владельцем.
chmod 775 file Стандартный режим совместного использования файла группой.
chmod 777 file Каждый может делать с этим файлом все, что хочет.
Если в качестве аргумента chmod вы вводите число, состоящее менее чем из трех цифр, опущенные символы заменяются на нули, начиная слева. В системах Linux на самом деле существует четвертая цифра, которая предшествует первому из трех и устанавливает специальные режимы доступа. Все об этом и многом другом находится в info-страницах.

Вступление в другую группу

Когда вы введете id в командной строке, то получите список всех групп, к которым вы можете принадлежать; перед этим будет ваше имя пользователя и ID, а также название группы и ее ID, с которой вы в настоящее время связаны. Однако, во многих системах Linux можно активно входить только в одну группу в одно и то же время. По умолчанию, это активная или первичная группа является первой, которая вам устанавливается из файла /etc/passwd. Четвертое поле в этом файле содержит ID основной группы пользователей, что можно также увидеть в файле /etc/group. Например:
asim:~> id
uid=501(asim) gid=501(asim) groups=100(users),501(asim),3400(web)

asim:~> grep asim /etc/passwd
asim:x:501:501:Asim El Baraka:/home/asim:/bin/bash

asim:~> grep 501 /etc/group
asim:x:501:
В приведенном выше примере четвертое поле в строке из /etc/passwd содержит значение "501", которое представляет собой группу asim. Из /etc/group мы можем получить имя, соответствующие этому идентификатору группы. При первом подключении к системе, это та группа, к которой будет принадлежать asim.
"Механизм" индивидуальной группы пользователя.
В целях обеспечения большей гибкости, большинство систем Linux преследуют так называемую индивидуальную групповую схему пользователей, которая, в первую очередь, присваивает каждому пользователю его собственную группу. Этой группе принадлежит только данный пользователь, отсюда и название "личная группа". Обычно эта группа имеет такое же имя как название логина пользователя, что может приводить к небольшой путанице.
Помимо своей собственной группы, пользователь asim также может быть в группах users и web. Т.к. это вторые группы для данного пользователя, ему придется использовать команду newgrp, чтобы войти в любую из этих групп (сначала используйте gpasswd для установки пароля для группы). В этом примере asim необходимо создать файлы, которые принадлежат группе web.
asim:/var/www/html> newgrp web

asim:/var/www/html> id
uid=501(asim) gid=3400(web) groups=100(users),501(asim),3400(web)
Теперь, когда asim создает новые файлы, они будут находиться в собственности группы web, вместо того, чтобы принадлежать группе asim:
asim:/var/www/html> touch test

asim:/var/www/html> ls -l test
-rw-rw-r--  1 asim web   0 Jun 10 15:38 test
Вход в новую группу освобождает вас от необходимости использовать chown (см. Раздел "Смена владельцев и групп") или вызывать системного администратора для смены владельцев для вас.
См. man-страницу для newgrp для получения дополнительной информации.

Маска файла

Прежде чем новый файл куда-то сохраняется, он подвергаться стандартной процедуре защиты. В Linux не существуют файлы без установленных прав доступа. Стандартное разрешение на файл определяется маской при его создании. Значение этой маски может быть получено с помощью команды umask:
bert:~> umask
0002
Вместо добавления символических значений друг к другу, как с chmod, для выяснения разрешения на новый файл, необходимо вычесть из суммарной возможности прав доступа. Однако в примере выше мы видим четыре значения, но есть только три категории разрешений: для пользователя, группы и других. Первый ноль — это установленные специальные файловые атрибуты, которые мы будем обсуждать в Разделе "Смена владельцев и групп" и в Разделе "SUID и SGID". Возможно, с тем же успехом, в вашей системе этот первый ноль не отображается при вводе команды umask, и тогда вы видите только три числа, представляющих маску по умолчанию, «накладываемую» на файл.
Каждая UNIX-подобная система имеет системную функцию для создания новых файлов, которая вызывается каждый раз, когда пользователь использует программу, которая создает новые файлы, например, при загрузке файлов из Интернета, при сохранении нового текстового документа и т.д. Эта функция создает как новые файлы, так и директории. Полные права на чтение, запись и выполнение предоставляются всем при создании нового каталога. При создании нового файла, эта функция создаст право на чтение и запись для всех, но прав на выполнение отсутствует для всех категорий пользователей. Таким образом, первоначально применяется маска для каталога с разрешением 777 или rwxrwxrwx, а для обычного файла 666 или rw-rw-rw-.
Значение umask вычитается из этих разрешений по умолчанию, определенных инструментом, создающим новый файл или каталог. Таким образом, каталог будет иметь права доступа 775 по умолчанию, а файл 664, если значение маски (0)002. Это демонстрируется на примере ниже:
bert:~> mkdir newdir

bert:~> ls -ld newdir
drwxrwxr-x    2 bert    bert		4096 Feb 28 13:45 newdir/

bert:~> touch newfile

bert:~> ls -l newfile
-rw-rw-r--    1 bert    bert		   0 Feb 28 13:52 newfile
Файлы по сравнению с каталогами.
Каталог получает больше разрешений по умолчанию: он всегда имеет разрешение на выполнение. Если бы не это, они не были бы доступны. Исследуйте это, изменив режим доступа к каталогу на 644!
Если вы войдете в другую группу, используя команду newgrp, маска остается неизменной. Таким образом, если она установлена на 002, файлы и каталоги, которые вы создаете, находясь в новой группе, также будут доступны для других членов этой группы; вам не придется использовать команду chmod.
Пользователь root обычно имеет более строгую маску по умолчанию:
[root@estoban root]# umask
022
Эти значения по умолчанию — общесистемная установка в конфигурационном файле shell, например /etc/bashrc или /etc/profile. Вы можете изменить их на ваш собственный файл конфигурации shell, см. в Главе 7, “Дом сладкий /home” о настройках окружения оболочки.

Смена владельцев и групп

Если файл находится в собственности не того пользователя или группы, то недочет может быть устранен с помощью команд chown (смена владельца) и chgrp (смена группы). В среде, где файлы должны находиться в коллективном доступе группы, изменение владельца является частой задачей системного администрирования. Обе команды достаточно гибкие, о чем можно узнать с помощью опции --help.
Команда chown может использоваться как для изменения владельца-пользователя файла, так и группы, а chgrp изменяет только группу. Конечно, система проверит, имеет ли пользователь, использующий эти команды, достаточно прав на файл(ы), чтобы изменять владельцев.
Чтобы изменить лишь владельца-пользователя файла, используйте следующий синтаксис:
chown newuser file
Если вы используете двоеточие после имени пользователя (см. info-страницы), группа-владелец будет изменена также на основную группу пользователя, запускающего команду. В системе Linux каждый пользователь имеет свою собственную группу, так что эта особенность может использоваться, чтобы делать файлы личными:
jacky:~> id
uid=1304(jacky) gid=(1304) groups=1304(jacky),2034(pproject)

jacky:~> ls -l my_report
-rw-rw-r--  1 jacky   project       29387 Jan 15 09:34 my_report

jacky:~> chown jacky: my_report

jacky:~> chmod o-r my_report

jacky:~> ls -l my_report
-rw-rw----  1 jacky   jacky         29387 Jan 15 09:34 my_report
Если jacky захотел бы поделиться этим файлом, без предоставления всем разрешения на запись, то он может использовать команду chgrp:
jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   jacky   45635 Jan 15 09:35 report-20020115.xls

jacky:~> chgrp project report-20020115.xls

jacky:~> chmod o= report-20020115.xls

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   project 45635 Jan 15 09:35 report-20020115.xls
Таким образом, пользователи из группы project смогут работать с этим файлом. У пользователей не из этой группы нет никакого доступа к нему вообще.
Как chown, так и chgrp могут быть использованы для рекурсивной смены владельца с помощью опции -r. В этом случае, все вложенные файлы и подкаталоги данного каталога будет принадлежать указанному пользователю и/или группе.
Ограничения.
На большинстве систем, использование команд chown и chgrp ограничено для непривилегированных пользователей. Если вы не администратор системы, то не можете изменить пользователя или группу по соображениям безопасности. Если использование этих команд не будет ограничено, то злостные пользователи могут назначать владельцами файлов других пользователей и/или другие группы, и изменить поведение окружения пользователей, и даже повредить чужие для них файлы.

Специальные режимы

Чтобы все время не беспокоить системного администратора решением проблем, связанных с правами, специальные права доступа могут быть предоставлены для целых каталогов или отдельных программ. Есть три специальных режима:
  • Режим "липкого бита": После выполнения задания, команда находится в оперативной памяти. Первоначально это была функция, которая использовалась в основном для сохранения памяти: большие рабочие части загружались в память только один раз. Но в наши дни память не такая дорогая и есть технологии, которые управляют ей лучше, поэтому это больше не используются для оптимизации возможностей на отдельных файлах. По отношению к целому каталогу, однако, у липкого бита есть другое значение. В этом случае, пользователь может изменять файлы в данной директории, если является владелец файла или файл имеет соответствующие разрешения. Эта возможность используется для таких каталогов как /var/tmp, которые должны быть доступны для всех, но где нельзя пользователям изменять или удалять данные друг друга. Липкий бит указывает в конце поля прав доступа к файлу:
mark:~> ls -ld /var/tmp
drwxrwxrwt   19 root     root         8192 Jan 16 10:37 /var/tmp/
Липкий бит установливается с помощью команды chmod o+t directory. Историческое происхождение “t” - сохранение возможности Text access (текстовый доступ) в UNIX.
  • SUID (установка ID пользователя) и SGID (установка ID группы): представлены символом s в поле прав доступа пользователя или группы. Когда этот режим установлен на исполняемый файл, то он будет запускаться с правами пользователя и группы, имеющих разрешения на файл, а не под тем пользователем, который ввел команду, таким образом, предоставляется доступ к системным ресурсам. Мы обсудим это далее в Главе 4, Процессы.
  • SGID (установка ID группы) на каталог: в этом конкретном случае все файлы, созданные в данном каталоге, будут иметь туже группу-владельца, что и сам каталог (в то время как нормальным поведением является то, что новые файлы принадлежат пользователям, которые их создают). Таким образом, пользователям не нужно беспокоиться о собственности файла при совместном использовании папок:
mimi:~> ls -ld /opt/docs
drwxrws---  4 root    users          4096 Jul 25 2001 docs/

mimi:~> ls -l /opt/docs
-rw-rw----  1 mimi    users        345672 Aug 30 2001-Council.doc
Это стандартный способ совместного доступа к файлам в UNIX.
Имеющиеся файлы остаются без изменений!
Файлы, которые перемещаются в SGID-каталог, но были созданы в других местах, сохраняют их первоначальные пользователя-владельца и группу. Это может привести к путанице.