ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Journal influence

Higher Attestation Commission (VAK) - К1 quartile
Russian Science Citation Index (RSCI)

Bookmark

Next issue

2
Publication date:
16 June 2024

The article was published in issue no. № 3, 2005
Abstract:
Аннотация:
Authors: () - , () - , () -
Ключевое слово:
Page views: 10203
Print version
Full issue in PDF (0.95Mb)

Font size:       Font:

С момента появления надстройки Authoriza­tion Manager в составе Windows 2003 многие разработчики, и мы в том числе, стали активно использовать это средство для разграничения доступа на основе ролей (RBAC). Среди преимуществ Authorization Manager достаточно упомянуть хорошую реализацию настроечной части (интерфейс в MMC) и, как следствие, возможность полностью возложить задачу поддержки конфигурации подсистемы авторизации на плечи ИТ – отдела заказчика. Достаточно поставлять настроенную в соответствии с бизнес-логикой заказчика структуру RBAC. А изменение пользователей системы и распределение их по ролям – непрерывный процесс в активно развивающихся современных компаниях.

Однако не всегда на площадке заказчика установлены Windows 2003 или Windows XP. Многие довольствуются приобретенными ранее сетями под управлением контроллеров доменов на основе Windows 2000 Server. К сожалению, под эту операционную систему Microsoft предоставляет только набор run time-библиотек (COM+) для работы с компонентами Authorization Manager.

С подобным положением вещей авторам пришлось столкнуться при разработке корпоративного web-приложения для заказчика. Нами была написана простая вспомогательная утилита для добавления, редактирования и удаления членов Application Group в Authorization Manager.

Реализация системы безопасности

Остановимся подробнее на особенностях реализации системы безопасности конкретной информационной системы (ИС) заказчика, использующей разграничение доступа на основе ролей при помощи оснастки Authorization Manager. Рассматриваемое приложение было написано под определенную среду, в которой должна была функционировать ИС, поставляемая заказчику. Особенностями этой среды являются:

·     мультидоменное сетевое окружение с доверительными отношениями между доменами;

·     требование удаленного доступа к настройкам конфигурации программного обеспечения, в том числе к настройкам подсистемы безопасности;

·     работа контроллеров домена под управлением Windows 2000 Server;

·     использование встроенной поддержки безопасности Windows;

·     отсутствие Active Directory и LDAP (все настройки Authorization Manager хранятся в xml-файле).

Авторизация доступа в ИС была собрана в одном Application в Authorization Manager. Соответственно для этого Application и настраивались члены локальной Application Group при помощи описываемой утилиты.

Организация приложения и работы с интерфейсами AzMan

Утилита представляет собой ASP.NET web-приложение, написанное на C#. Приложение состоит из двух экранных форм: первая – для выбора Application Group и отображения членов, входящих в ее состав; вторая вызывается модально и служит для выбора группы домена(ов), которые будут добавлены в Application Group.

Интерфейсы для работы с Authorization Mana­ger достаточно хорошо документированы в MSDN, поэтому не будем останавливаться на их рассмотрении. Для изучения принципов RBAC в понимании Microsoft рекомендуем разработчикам ознакомиться со списком литературы, приведенным в конце статьи.

Необходимая сборка для работы с Authori­zation Manager называется Microsoft.Interop.Secu­rity.AzRoles. В зависимости от операционной системы и установленных сервис-паков эта сборка может присутствовать или отсутствовать на компьютере в Global Assembly Cash. Если ее нет, то можно использовать tlbimp для генерации сборки из библиотеки AzRoles.dll из каталога system32 операционной системы.

Настройки утилиты хранятся в файле web.config. Основные из них:

PolicyStorageType – тип хранилища Authorization Manager (xml или ldap);

PolicyStoragePath – каталог, в котором хранится xml-файл;

PolicyStorageName – имя xml-файла с настройками RBAC;

ApplicationName – имя приложения, группы которого будут настраиваться;

DomainName – имя домена, члены которого могут входить в состав групп Authorization Mana­ger для ИС.

Для удобства работы авторами был написан класс-надстройка, аккумулирующий в себе функции выборки, редактирования и удаления членов Application Groups в Authorization Manager.

Рассмотрим реализацию описанного выше класса-надстройки.

Объявление класса:

public class AzManCommon {…}

Интерфейс к хранилищу RBAC выделен в отдельное свойство:

private AzAuthorizationStoreClass m_Storage;

Конструктор класса AzManCommon:

///

/// Конструктор///

///Путь к файлу или каталогу с policypublic AzManCommon(String bstrPolicyURL){       m_Storage = new AzAuthorizationStoreClass();      if (m_Storage == null)          throw new AzManException("Ошибка при попытке доступа к хранилищу RBAC.");      // Инициализируем хранилище для редактирования       m_Storage.Initialize(0, bstrPolicyURL, null);}

Методы класса AzManCommon для обработки операций выборки, добавления и удаления в Application Groups:

       ///

       /// Возвращает список Application Groups для указанного       /// приложения.       ///

       ///Имя приложения       /// Список имен Application Groups        public String[] get_ApplicationGroups(String szAppName)        {              if (m_Storage == null)                    throw new AzManException("Не проинициализировано хранилище RBAC.");              String[] lpszAppGroups = null;              for (int i = 1; i < m_Storage.Applications.Count + 1; i++)              {                   IAzApplication iunkApplication = (IAzApplication)m_Storage.Applications[i];                     if (iunkApplication.Name == szAppName)                    {                       lpszAppGroups = new String[iunkApplication. Appli­cationGroups.Count];                       for (int j = 1; j < iunkApplication.Applica­tionGroups.Count + 1; j++)                     {                            IAzApplicationGroup iunkAppGroup =                                   (IAzApplicationGroup)iunkApplication.Appli­cationGroups[j];                                       lpszAppGroups[j - 1] = iunkAppGroup. Name;                       }                       break;                     }              }              return lpszAppGroups;        }        ///

       /// Возвращает список членов Application Group        ///

       ///Имя приложения        /// Имя Application Group        /// Список структур с именами и SID для каждого члена        public structMemberDescr[] get_ApplicationGroupMem­bers(String szAppName, String szAppGrpName)        {              if (m_Storage == null)                     throw new AzManException("Не проинициализировано хранилище RBAC.");              structMemberDescr[] lpstructAppGroupMembers = null;              for (int i = 1; i < m_Storage.Applications.Count + 1; i++)              {                     IAzApplication iunkApplication = (IAzApplication)m_Storage.Applications[i];                     if (iunkApplication.Name == szAppName)                     {                            for (int j = 1; j < iunkApplication.Applica­tionGroups.Count + 1; j++)                            {                                  IAzApplicationGroup iunkAppGroup =                     (IAzApplicationGroup)iunkApplication.Application Groups[j];                                   if (iunkAppGroup.Name == szAppGrp Name)                                   {                                        System.Array memberArray = (System. Array)iunkAppGroup.MembersName;                                         lpstructAppGroupMembers = new struct MemberDescr[memberArray.GetLength(0)];                                         for (int n = 0; n < memberArray.Length; n++)                                                      lpstructAppGroupMembers[n]. szMemberName = Convert.ToString(memberArray.GetValue(n));                                         System.Array memberSIDArray = (System.Array)iunkAppGroup.Members;                                         for (int n = 0; n < memberSIDArray. Length; n++)                                             lpstructAppGroupMembers[n].szMemberSID = Convert.ToString(memberSIDArray. GetValue(n));                                         break;                                   }                            }                     }              }              return lpstructAppGroupMembers;        }       ///

      /// Добавляет члена в группу       ///

      ///Имя приложения       /// Имя Application Group       ///SID члена        public void add_ApplicationGroupMember(String szApp Name, String szAppGrpName, String szMemberSID)        {              if (m_Storage == null)                     throw new AzManException("Не проинициали- зировано хранилище RBAC.");              if (szMemberSID.Length == 0)                     throw new AzManException("Не указан SID группы.");              for (int i = 1; i < m_Storage.Applications.Count + 1; i++)              {                     IAzApplication iunkApplication = (IAzApplica­tion)m_Storage.Applications[i];                     if (iunkApplication.Name == szAppName)                     {                            for (int j = 1; j < iunkApplication.Applica­tionGroups.Count + 1; j++)                            {                                   IAzApplicationGroup iunkAppGroup =                                    (IAzApplicationGroup)iunkApplication. ApplicationGroups[j];                                   if (iunkAppGroup.Name == szAppGrp Name)                                  {                                      iunkAppGroup.AddMember(szMemberSID, null);                                      iunkAppGroup.Submit(0, null);                                      break;                                   }                            }                     }              }                           }        ///

       /// Удаляет члена из группы        ///

       ///Имя приложения        /// Имя Application Group        ///SID члена        public void del_ApplicationGroupMember(String szAppName, String szAppGrpName, String szMemberSID)        {              if (m_Storage == null)                     throw new AzManException("Не проинициализировано хранилище RBAC.");              if (szMemberSID.Length == 0)                     throw new AzManException("Не указан SID группы.");              for (int i = 1; i < m_Storage.Applications.Count + 1; i++)              {                    IAzApplication iunkApplication = (IAzAppli­cation)m_Storage.Applications[i];                     if (iunkApplication.Name == szAppName)                     {                           for (int j = 1; j < iunkApplication.Applica­tionGroups.Count + 1; j++)                            {                                  IAzApplicationGroup iunkAppGroup =                                   (IAzApplicationGroup)iunkApplication.Appli­cationGroups[j];                                   if (iunkAppGroup.Name == szAppGrp Name)                                 {                                   iunkAppGroup.DeleteMember(szMemberSID, null);                                    iunkAppGroup.Submit(0, null);                                    break;                                 }                            }                     }              }             }

В приведенной реализации используются два вспомогательных класса: AzManException – для обработки исключений, возникших при операциях с Authorization Manager, и структура structMem­berDescr – для передачи списков между классом-надстройкой AzManCommon и интерфейсной частью.

Для получения списка групп домена использованы возможности системы Windows Manage­ment Instrumentation (WMI). Приведем исходный код обращения к WMI и формирование запроса.

protected System.Web.UI.WebControls.DropDownList ddGroup;      ManagementScope msc = new ManagementScope ("root\\cimv2");       string queryString = "SELECT Domain, Name, SID FROM Win32_Group";       string szDomainName = ConfigurationSettings.AppSettings ["DomainName"];       if (szDomainName.Length != 0)             queryString += " WHERE Domain=\"" + szDomainName + "\"";       SelectQuery q = new SelectQuery(queryString);       ManagementObjectSearcher query = new Management ObjectSearcher(msc, q);       ManagementObjectCollection queryCollection = query.Get();       ddGroup.Items.Clear();       ddGroup.Items.Add("");       foreach( ManagementObject mo in queryCollection )        {            ddGroup.Items.Add(new ListItem(mo["Name"]. To String(), mo["SID"].ToString()));       }

Обращение к методам класса AzManCommon из интерфейсной части можно посмотреть в прилагаемых к этой статье исходных кодах утилиты.

Дополнительные возможности

Немного изменив код, можно добавлять, редактировать и удалять членов общей Application Group хранилища RBAC. Также, немного изменив алгоритм работы с WMI, применяемый в утилите, можно настраивать не только доменные группы в составе Application Group, но и отдельно добавлять членов этих групп.

Список литературы

1.  MSDN. Platform SDK:  Authorization. Authorization Manager Model: http://msdn.microsoft.com/library/default. asp?url=/library/en-us/secauthz/security/authorization_manager_ model.asp

2.  MSDN. Role-Based Access Control Using Windows Server 2003 Authorization Manager. Mohan Rao Cavale. Microsoft Corporation. January 2003: http://msdn.microsoft.com/libra­ry/default.asp?url=/library/en-us/dnnetserv/html/AzManRoles.asp

3.  MSDN Magazine November 2003. Use Role-Based Security in Your Middle Tier .NET Apps with Authorization Manager. Keith Brown. http://msdn.microsoft.com/msdn­mag/issues/03/11/AuthorizationManager/


Permanent link:
http://swsys.ru/index.php?page=article&id=520&lang=en
Print version
Full issue in PDF (0.95Mb)
The article was published in issue no. № 3, 2005

Perhaps, you might be interested in the following articles of similar topics: