Контроль доступа на основе правил (исходники)Источник: IBM developerWorks Россия Барри Брахман
ВведениеВы, возможно, знакомы с функциями контроля доступа, предоставляемыми операционной системой. Они обычно выполняют авторизационные проверки для системных вызовов и операционных запросов к ресурсам, которым в файловой системе присвоено имя. Программистам обычно не требуется проверять, имеет ли пользователь, запустивший программу, право на чтение файла данных или установку системного времени. Об этом позаботится операционная система, и она же даст знать через возвращаемое значение, разрешена операция или запрещена. Например, UNIX выполняет требования, задаваемые ID владельца файла, ID группы и правами доступа, связанными с реальной или фактической идентификацией пользователя. Хотя такое построение и является простым, оно может быть недостаточно эффективным, заставляя некоторые UNIX-системы расширять его с помощью списков контроля доступа и других механизмов. Другие операционные системы используют более сложные модели безопасности. Всё же модель безопасности обычно применяется к файловым объектам и пользовательским учётным записям, известным системе (тем, которые появляются в /etc/passwd или в NIS). Для некоторых, функционирующих на сервере, приложений эта модель эффективна. Сервер изначально выполняется с расширенными привилегиями, так что он может выполнять любые операции. Действуя от имени конкретного пользователя, он фактически становится этим пользователем. В противном случае сервер может использовать системные вызовы, чтобы построить модель безопасности, которая ограничивает операции до разрешённых данному пользователю. Перед выполнением этой операции программа должна проверить авторизацию: позволено ли действующему пользователю выполнять операцию? Контроль авторизации для Web-сервисовПрограммы должны иногда усиливать собственные требования по контролю доступа к тем ресурсам, за которые они отвечают, и к учётным записям пользователей, не распознаваемым операционной системой. Ярчайшим примером тому является Web-сервер Apache, который может быть настроен так, чтобы разрешать или отклонять HTTP-запросы к отдельным своим ресурсам. Записи в секретном файле паролей создают учётные записи Web-сервера, которые полностью отделены от записей, известных операционной системе. Аналогично, списки членства в группах создаются специально для использования Web-сервером. Администратор Apache может использовать эти имена с директивами Require, Allow и Deny сервера, чтобы описать, кто может (или не может) иметь доступ к ресурсу. Так как операционная система здесь мало чем может помочь, программисты Apache реализовали свою собственную подсистему авторизации. Хотя список пользователей Web-сервера и операционной системы может быть единым, обычно их держат раздельно для повышения безопасности, производительности и для удобства реализации. Разновидность авторизации, обеспечиваемая таким Web-сервером, как Apache, можно назвать грубым контролем доступа, так как она обеспечивает только внешний уровень безопасности. В результате проверки авторизации определяется, пропускать запрос или нет. Если доступ запрещён к Web-сервису, например, Web-сервис не выполняется Web-сервером, и, следовательно, запрос даже не видим для Web-сервиса. Тем не менее, многим серверным приложениям, в том числе и Web-приложениям, требуются возможности по проверке авторизации, которые выходят далеко за рамки описанных возможностей. Рассмотрим приложение на базе Web-сервиса, доступное для выполнения любому, но "осознающее", что пользователи имеют различные возможности или привилегии. Возможно, самый простой пример - это приложение, в котором только определённые пользователи могут иметь доступ к административным функциям, - все остальные пользователи не только не могут выполнять эти функции, но даже не должны иметь возможности их видеть (их не должно быть в меню или, по крайней мере, они не должны быть доступны для выбора). Другой типичный пример - это приложение с профилями для каждого пользователя, которые может изменять только его владелец или, возможно, администратор приложения. Часто приложение должно ограничивать доступ к своим данным для определенных пользователей. Этот вид проверки авторизации может быть назван тонким контролем доступа, так как он применяется запущенной программой практически к любым видам ресурсов, с которыми программа работает. В некоторых случаях программист с творческим подходом может применить некоторые уловки, чтобы обойти эти проблемы. Например, приложение может использовать URI для обозначения своих ресурсов, настроить контроли доступа этих URI к Web-серверу, и затем вызвать HTTP-запрос, чтобы определить, имеет ли пользователь авторизацию. Этот подход усилит механизмы проверки авторизации Web-сервера, но не будет практичным. Большинство языков программирования, в том числе и Perl, в этом отношении не сильно помогают. Они предоставляют простой уровень, лежащий поверх того, что предоставляет система, лежащая в основе. Язык Java™ включает среду авторизации, но, конечно, это не поможет программисту Perl или C/C++. Проблема, с которой сталкивается программист, двоякая: во-первых, пользователям этих приложений не нужно иметь учётную запись в системе, лежащей в основе, и, во-вторых, типы объектов и то, как осуществляется доступ к ним, могут отличаться от того, для чего была спроектирована модель безопасности операционной системы. Вследствие этого, программисты вынуждены писать много кода для поддержки специфичного в данном приложении тестирования авторизации, иногда заново реализуя, по существу, ту же среду на разных языках. Системы управления базами данных, такие, как Oracle и MySQL, управляют своими собственными пользовательскими учётными записями, ролями и привилегиями для операций на уровне системы и на уровне объектов. Тонкий контроль авторизацииТонкий контроль доступа выходит за рамки разрешения или отказа в праве на выполнение программы или на чтение файла данных. Рассмотрим Wiki-сервер, реализованный в виде CGI-программы. Он содержит набор Web-страниц, по одной на пользователя. У любого пользователя есть доступ на чтение любой Web-страницы. Любой пользователь может добавлять содержимое или управлять своей собственной страницей, но не чужими страницами. Любой пользователь, назначенный администратором, может обновлять и управлять любой страницей (например, удалять оскорбительный или запрещённый контент). Во время показа Web-страницы владельцу или администратору все операции должны быть доступны через меню или ссылки; другие же не должны видеть этих операций или не иметь возможности их выбрать. Более того, приложение должно гарантировать, что любой пользователь может видеть Web-страницу, но только её владелец или администратор могут выполнять операцию ограниченного доступа, такую, как обновление контента страницы. Современная практика состоит в том, чтобы внедрить логику авторизации в приложение. В нужных местах по всему коду программист задаёт проверку, имеет ли право текущий пользователь выполнять операцию. При создании меню может появиться код, схожий с Листингом 1. Листинг 1. Построение меню допустимых операций (неверный способ)
Хотя, на первый взгляд, Листинг 1 может показаться верным, он ошибочен. Тот код заставил пройти несколько версий этого документа, прежде чем проблема была обнаружена, показывая, насколько легко совершить ошибки по невнимательности во время написания такого вида проверки. Листинг 2 является правильным: Листинг 2. Построение меню допустимых операций (верный способ)
В другой точке кода, возможно там, где распределяются операции, или в начале каждой операции выполняется аналогичная проверка. Листинг 3. Проверка для операций с ограниченным доступом
Проверки авторизации, выполняемые двумя фрагментами кода, тесно связаны, хотя они могли бы появиться в разных частях программы. В более изощрённых случаях тесты авторизации могут быть значительно более сложными. Например, если впоследсвии приложение будет усовершенствовано, чтобы позволить члену группы (задаваемому владельцем страницы) выполнять ограниченные ранее операции, то программисту нужно будет отыскать, просмотреть и, возможно, изменить все фрагменты кода, где выполняются эти проверки (очевидно, их может быть значительно больше двух). Отсутствие надлежащих изменений может привести к случайному или умышленному неправильному использованию приложения. Проверка авторизации на основе правилЧтобы помочь программистам и повысить безопасность приложений, мы предлагаем использование среды, специально разработанной для проверки авторизации. Так же, как программисты используют библиотеки арифметических, криптографических, сетевых и функций работы с базами данных вместо того, чтобы каждый раз заново переписывать подпрограммы, почему бы не использовать на новом уровне пакет программ, который обеспечит большинство решений для проблем, не имеющих непосредственного отношения к рассматриваемо задаче? Мы предлагаем среду авторизации на основе правил (управляемую данными), со следующими возможностями:
Помимо очевидного преимущества, состоящего в отсутствии необходимости реализовывать функции, обеспечиваемые средой, есть еще и множество других:
Конечно, есть и ряд недостатков. Помимо издержек, связанных с изучением, ошибка в среде может наследоваться всеми приложениями, которые её используют. Проверка авторизации, выполняемая таким способом, будет несколько медленнее, чем при встроенном коде, особенно, когда она активизируется как отдельный процесс. DACScheck: среда авторизацииБыло бы правильно, если бы перечисленные наблюдения инициировали разработку и внедрение Чтобы продемонстрировать, как использовать Листинг 4. Использование DACScheck на Perl
Модуль на Perl с названием DACScheck.pm обеспечивает упрощённый интерфейс для Каждый ресурс, управляемый Давайте теперь взглянем на то, как может выглядеть правило. Правило сообщает Листинг 5. Пример файла правил dacscheck
Это правило описано столь подробно, чтобы его было легче объяснять, а также потому, что если вам знаком синтаксис, то вам будет легко понимать и изменять политику безопасности. Элемент Это правило контроля доступа состоит из трёх элементов В этом примере, первое Если политику контроля доступа для Wiki нужно будет изменить, вам нужно будет только изменить правило. Результат достигается немедленно и применяется ко всем ссылкам на правило. Если администратору нужно запретить доступ к странице для запросов, исходящих из определенного диапазона IP-адресов, следует добавить приблизительно такой код: Листинг 6. Дополнительное правило, для запрещения доступа
Упорядочение Существует множество ситуаций, когда может применяться такая форма проверки авторизации. Например, ftp-демон ( ВыводыГибкая среда авторизации может повысить безопасность и облегчить труд программистов. Скрипты и скомпилированные программы могут быть меньше по размеру и проще, а время и усилия на разработку приложения могут быть сокращены. И пусть остаются отдельные проблемы,
Еще одна родственная программа - |