При разработке программного обеспечения (ПО), в том числе и операционных систем (ОС) ключевым аспектом является обеспечение безопасности конечного продукта. Вероятнее всего, создать абсолютно безопасную систему невозможно — любые замки могут быть сколь угодно крепкими, однако они также должны отпираться. Поэтому задача при разработке и реализации систем безопасности сводится к тому, чтобы максимально усложнить процесс её взлома или обхода потенциальным злоумышленникам.
Одним из немногих существующих способов построения безопасности в ПО является организация прав доступа к ресурсам системы среди пользователей, пользовательских групп, а также ролей. Такую организацию можно рассматривать в виде функционального блока, который на входе принимает значения пары «пользователь/действие», а на выходе выдаётся решение, определяемое допустимостью каждого действия для пользователей.
Архитектурные особенности управления доступом
В ОС Linux, как и в других Unix-подобных системах никогда не было централизованного управления доступом. Но для реализации этой задачи изначально используются основные и обязательные правила:
- Все объекты в системе (файлы, процессы) принадлежат своим владельцам, которые обладают полноценным контролем над собственными объектами.
- Тот, кто создаёт объекты, изначально и является его владельцем.
- В системе всегда существует пользователь root, так называемый суперпользователь, который имеет полный доступ ко всем объектам любых других владельцев (пользователей).
- Административные задачи могут выполняться только суперпользователем.
Для реализации этого комплекса правил в ОС Linux существует код, который распределён практически по всем основным компонентам системы и рассчитывает окончательное решение для предоставления/распределения доступа.
Например, файловая система Linux имеет собственную систему управления правами, в основе которой лежит реализация принципа UNIX-групп. Надо отметить также, что это самая сложная система, гораздо сложнее любой другой, сосредоточенной, например, в ядре.
Некоторые системные вызовы, при их выполнении «завязаны» только на пользователя root и в данном случае выполняется проверка, собственно, пользователя. И также существуют такие системные вызовы, для выполнения которых, кроме проверки пользователя должны соблюдаться определённые условия, которые довольно сложно вычисляются.
Управление доступом для файловой системы
Концепция UNIX-подобных систем предполагает, что каждый файл в системе принадлежит определённым владельцу и группе. У файла может быть только один владелец, в то же время в группе владельцев может быть несколько пользователей. Лишь тот, кто владеет файлом, может задавать права доступа на собственные файлы (причём таким образом, что только владелец сможет получить доступ к ним) и определять, какие операции над ними разрешены для членов группы и всех остальных пользователей.
Узнать владельца, группу, а также разрешения для конкретного файла позволяет команда ls -l имя_файла, например:
$ ls -l /home/john/my_tasks -rw------ 1 john work 1258 Jun 18 14:46 /home/john/my_tasks
Этот вывод означает, что объектом my_tasks владеет пользователь john, а принадлежит он (файл) группе work. Первый столбец, содержащий дефисы и буквы показывает права доступа для владельца — «-rw», для группы — «—» и последние 3 дефиса — для всех остальных.
Важно понимать, что файловая система (и ядро) отслеживают идентификаторы пользователей — так называемые UID (User ID), специальные уникальные номера, присваиваемые им системой при создании. Идентификатор суперпользователя root равен 0. Сами идентификаторы с соответствующими им именами обычно хранятся в /etc/passwd. Информация о группах, т. е. о GID (Group ID) находится в /etc/group. Текстовые имена пользователей предназначены для удобства восприятия.
Изменение прав доступа
Для изменения прав существует команда chmod. Первым её аргументом является описание новых прав, вторым — файлы, к которым эти права применяются. Как уже отмечалось, права доступа к файлам могут изменять владельцы этих файлов или пользователь root.
Существуют восьмеричная и мнемоническая спецификации прав доступа. Мнемоническая предусматривает следующие обозначения: «r» – чтение, «w» – запись и «x» – исполнение (запуск), которые записываются в наборе из трёх символов. Например, запись «-rw——» означает, что для файла разрешены чтение («r») и запись («w»), только для владельца – «-rw», а для группы и всех остальных пользователей доступ к файлу закрыт — символ дефиса означает запрет.
Когда используется восьмеричная система записи, первая цифра соответствует владельцу, вторая — группе, а третья — ко всем остальным . В следующей таблице указаны спецификации для восьмеричной и мнемонической записей прав доступа:
Восьмеричное представление | Двоичное представление | Режим доступа | Восьмеричное представление | Двоичное представление | Режим доступа |
0 | 000 | — | 4 | 100 | r— |
1 | 001 | —x | 5 | 101 | r-x |
2 | 010 | -w- | 6 | 110 | rw- |
3 | 101 | -wx | 7 | 111 | rwx |
Например, команда:
$ chmod 711 my_tasks
предоставит все права владельцу файла my_tasks, а всем остальным разрешит только запуск.
В случае с мнемонической записью прав, отсутствует возможность задавать разные режимы доступа сразу для всех категорий, например команда:
$ chmod ugo+w my_tasks
добавляет разрешение на запись сразу для владельца, группы и остальных пользователей. А команда:
$ chmod ugo-w my_tasks
разрешение на запись запрещает.
Запись «ugo» означает набор категорий объектов: «u» – «user», т. е. владелец, «g» – «group» – группа и «o» – «other» – все остальные. Символы «+» и «-» означают добавление и удаление соответственно. Еще используется символ «=», для указания только того, что явно указывается, например:
$ chmod go=r my_tasks
разрешит группе и всем остальным только чтение, независимо от того какими правами на этот файл они обладали ранее.
Смена владельца и группы
Для того, чтобы сменить владельца и группу файла необходимо воспользоваться командой chown. Её синтаксис аналогичен команде chmod, за исключением того, что в качестве первого аргумента выступает запись вида «user:group». Для того чтобы изменить группу файла, необходимо либо быть владельцем файла и входить в назначаемую группу, либо быть пользователем root. Пример:
$ chown john:michael my_tasks
Эта команда назначит файлу my_tasks в качестве создателя пользователя john и добавит его в группу michael. Следует быть осторожным при использовании этой команды и применять её только в случае, если однозначно понятно, чего нужно добиться в результате.