Методы управления доступом в системах UNIX

Даже в первых и самых простых версиях UNIX никогда не было единого "центра" управления доступом. Тем не менее существовали общие правила, которые оказывали влияние на проектирование систем.

  • Объекты (например, файлы и процессы) имеют владельцев. Владельцы обладают обширным (но необязательно неограниченным) контролем над своими объектами.
  • Вы являетесь владельцами новых объектов, создаваемых вами.
  • Пользователь root с особыми правами, известный как суперпользователь, может действовать как владелец любого объекта в системе.
  • Только суперпользователь может выполнять административные операции особого значения.

В системах UNIX единого черного ящика, управляющего доступом, не существует, поскольку код, который принимает решения в этой области, рассредоточен по всей системе. Одни системные вызовы (например, settimeofday) ограничены пользователем root (при выполнении таких системных вызовов просто проверяется "личность" текущего пользователя, и, если он окажется не суперпользователем, операция отвергается). Другие системные вызовы (например, kill) реализуют различные вычисления, которые требуют как соответствия владельцу, так и обеспечения специальных условий для суперпользователя. Наконец, файловая система реализует собственную систему управления доступом, причем эта система сложнее любой другой, реализованной в ядре. Например, только файловая система использует принцип UN EX-групп для управления доступом.

Усложнение ситуации привело к переплетению ядра и файловой системы. Например, вы управляете большинством устройств и передаете им информацию посредством файлов, которые представляют их в каталоге /dev. Поскольку эти файлы устройств являются объектами файловой системы, они используются и в ее семантике управления доступом.

 

Управление доступом в файловой системе

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

Владельцем файла всегда является один человек, тогда как в группу владельцев могут входить несколько пользователей. По традиции информация о группах хранилась в файле /etc/group, но теперь ее чаще хранят на сетевом сервере NIS или LDAP.

Владелец файла должен определить, какие операции могут выполнять над файлом члены группы. Такая схема допускает совместное использование файлов членами одной группы. Например, мы применяем группу для управления доступом к файлам исходного кода веб-сайта www.admin.com

Узнать идентификаторы владельцев файла можно с помощью команды Is  -1 имя файла.

Например:

aix$ Is -1 /home/garth/todo

-rw            1  garth  staff  1258  Jun 4 18:15  /home/garth/todo

Файлом владеет пользователь garth, а группа, которой он принадлежит, называется staff. Буквы и дефисы в первом столбце означают права доступа к файлу.

Ядро и файловая система отслеживают не текстовые имена владельцев и групп, а их идентификаторы. В самом общем случае идентификаторы пользователей (сокращенно UID — User ID) и соответствующие им имена хранятся в файле /etc/passwd, а идентификаторы и названия групп (GID — group ID) находятся в файле /etc/group. Текстовые эквиваленты идентификаторов UID и GID определяются исключительно для удобства пользователей. Для того чтобы команда вроде Is могла вывести информацию о владельце файла в удобочитаемом виде, она должна просмотреть базу данных идентификаторов и найти в ней нужные имена.

 

Владение процессом

Владелец может посылать процессу сигналы, а так же понижать его приоритет. С процессами связано несколько идентификаторов: реальный, текущий и сохраненный идентификатор пользователя; реальный, текущий и сохраненный идентификатор группы, а в системе Linux — "идентификатор пользователя файловой системы", который используется только для определения прав доступа к файлам. Вообще говоря, реальные номера применяются для учета использования системных ресурсов, а текущие — для указания прав доступа. В большинстве случаев реальные и текущие идентификаторы совпадают.

Сохраненные идентификаторы не оказывают никакого непосредственного влияния. Они позволяют программам "приберегать" неактивные идентификаторы для последующего использования, тем самым способствуя расчетливому применению расширенных полномочий. Вообще говоря, идентификатор пользователя файловой системы — это особенность реализации сетевой файловой системы (Network File System — NFS), и обычно он совпадает с текущим идентификатором пользователя.

 

Учетная запись суперпользователя

Учетная запись root в UNIX принадлежит "всесильному" пользователю-администратору, известному как суперпользователь, хотя его настоящее имя — "root".

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

Традиционная система UNIX позволяет суперпользователю (т.е. всякому процессу, текущий идентификатор пользователя которого равен нулю) выполнять над файлом или процессом любую допустимую операцию (Следует подчеркнуть важность слова "допустимую". Некоторые операции (например, запуск файла, для которого не установлен бит выполнения) запрещены даже суперпользователю).

 

Вот примеры операций, доступных лишь суперпользователю:

  • изменение корневого каталога процесса с помощью команды chroot;
  • создание файлов устройств;
  • установка системных часов;
  • увеличение лимитов использования ресурсов и повышение приоритетов процессов;
  • задание сетевого имени компьютера;
  • конфигурирование сетевых интерфейсов;
  • открытие привилегированных сетевых портов (номера которых меньше 1024);
  • останов системы.

Процессы суперпользователя обладают способностью изменять свои идентификаторы. Один из таких процессов — программа login и ее графические эквиваленты, которые отображают на экране приглашение ввести пароль при входе в систему. Если введенные пароль и имя пользователя правильны, программа заменяет свои идентификаторы соответствующими идентификаторами указанного пользователя и запускает интерпретатор команд. После того как процесс суперпользователя, сменив владельца, станет обычным пользовательским процессом, восстановить свое предыдущее привилегированное состояние он уже не сможет.

 

Использование битов "setuid" и "setgid"

Традиционная система управления доступом в UNIX дополнена системой смены полномочий, которая реализуется ядром в сотрудничестве с файловой системой. Если кратко, то эта система позволяет выполнять специально подготовленные файлы с использованием привилегий более высокого уровня (обычно это привилегии суперпользователя). Этот механизм разрешает разработчикам и администраторам создавать условия для непривилегированных пользователей, при которых они могут выполнять привилегированные операции.

Дело в том, что существует два специальных бита, устанавливаемых в маске прав доступа к файлу: "setuid" (Set User ID — бит смены идентификатора пользователя) и "setgid" (Set Group ID — бит смены идентификатора группы). Если запускается исполняемый файл, у которого установлен один из этих битов, то текущими идентификаторами создаваемого процесса становятся идентификаторы владельца файла, а не идентификаторы пользователя, запустившего программу. Смена полномочий действительна только на время работы программы.

Например, пользователи должны иметь возможность изменять свои пароли. Но поскольку пароли хранятся в защищенном файле /etc/shadow, пользователям нужно использовать команду passwd с полномочиями setuid, чтобы "усилить" свои права доступа. Команда passwd проверяет, кто ее выполняет, и, в зависимости от результата, настраивает свое поведение соответствующим образом, поэтому обычные пользователи могут менять только собственные пароли, а суперпользователь — любые. (Это, между прочим, еще один пример "специального случая" в UNIX-системе управления доступом — правила "встроены" в код команды passwd.)

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.