О фрэймворке атрибутного управления доступом ABAC Engine

УДК 004.94 DOI 10.17223/2226308X/10/45

О ФРЭЙМВОРКЕ АТРИБУТНОГО УПРАВЛЕНИЯ ДОСТУПОМ

ABAC ENGINE

Д. Н. Колегов, О. В. Брославский, Н. Е. Олексов

Работа посвящена программной реализации атрибутного управления доступом (ABAC) в различных компьютерных системах (КС). Предлагается следующее расширение метода управления доступом из XACML: 1) для описания и задания политики атрибутного управления доступом используется созданный специализированный язык (Domain Specific Language (DSL)) ALFAScript, основанный на языке ALFA; 2) политика на языке ALFAScript компилируется в код на языке программирования Lua; 3) при поступлении запроса субъекта на доступ к сущности строится соответствующий контекст (в терминах XACML), для которого происходит запуск кода на Lua в среде выполнения (runtime) механизма управления доступом КС; 4) результатом выполнения Lua-кода является решение о возможности предоставления субъекту доступа к сущности. Модель взаимодействия, набор программных компонент, структур данных и инструментов, позволяющих разработчику самостоятельно реализовать ABAC с использованием данного метода независимо от целевой КС, предметной области, элементов управления доступом, их состава и структуры и составляют фрэймворк ABAC Engine. Новизна предлагаемого подхода заключается в использовании языка Lua для интерпретации политики управления доступом в среде этой КС. Использование предложенного метода упрощает и ускоряет реализацию атрибутного управления доступом.

Ключевые слова: управление доступом, ABAC, XACML, ALFA, Lua.

Управление доступом является одним из основных механизмов безопасности компьютерных систем. Механизмы управления доступом реализуются не только в операционных системах (ОС) и системах управления базами данных (СУБД), но и в веб-приложениях, межсетевых экранах прикладного уровня, ERP-системах, прикладном программном обеспечении и т. п. При этом на практике часто возникает ситуация, когда разработчик, реализовав корректный механизм управления доступом на одном языке программирования, вынужден разрабатывать тот же самый механизм на другом языке программирования. Данная задача возникает, например, в случае прототипиро-вания программного продукта на языке Python с последующим его переписыванием на языке C+—+ или в случае, когда механизм управления доступом был реализован для защиты СУБД, а затем его необходимо адаптировать для защиты веб-приложений [1, 2].

С точки зрения программной разработки хотелось бы иметь средство, удовлетворяющее следующим требованиям:

1) политика безопасности управления доступом в КС должна описываться на DSL-языке, позволяющем использовать типовые элементы управления доступом (например, роли, привилегии, права и т.д.);

2) политика и механизм управления доступом не должны быть привязаны к предметной области конкретной защищаемой КС (например, к веб-приложению, СУБД, ОС);

3) реализация механизма управления доступом не должна быть жёстко привязана к среде выполнения и языку программирования.

Принципы атрибутного управления доступом [3] наиболее близко соответствуют данным требованиям. Во-первых, атрибутное управление доступом отличается от дру-

гих видов управления доступом тем, что не предоставляет какую-то предопределённую политику, как это принято, например, в ролевом или мандатном управлении доступом. В случае использования ABAC администратор или разработчик должен сам разработать такую политику в соответствии с предметной областью КС, а затем описать её на каком-либо DSL (например, в XACML для этого используется язык ALFA). Во-вторых, атрибутное управление доступом является наиболее общим и с некоторыми ограничениями может быть использовано для реализации других видов управления доступом (например, ролевого, дискреционного, мандатного) [4]. Видимо, оно не может быть использовано лишь для обеспечения безопасности информационных потоков в системах с мандатным управлением доступом.

В принципе, использование XACML [5] для реализации ABAC [3] позволяет, несмотря на наличие некоторых недостатков, выполнить первые два требования. Для выполнения всех требований предлагается модифицировать метод, используемый в XACML.

Далее предполагается, что читатель знаком с основными положениями стандарта XACML и с такими его функциональными элементами, как Policy Administration Point (PAP), Policy Enforcement Point (PEP), Policy Decision Point (PDP) и Policy Information Point (PIP).

Предлагается следующая модификация XACML, реализованная в разрабатываемом фреймворке Angine (ABAC Engine).

На уровне PAP выполняются следующие действия:

1) фиксируется целевая КС, для которой необходимо реализовать механизм управления доступом (например, СУБД MySQL);

2) фиксируется целевой язык программирования, на котором необходимо реализовать механизм управления доступом (например, Python);

3) все программные элементы управления доступом защищаемой КС (сущности, объекты, субъекты, атрибуты) и отношения между ними описываются на языке описания интерфейсов (IDL);

4) с помощью разработанного генератора кода выполняется интерпретация интерфейсов, заданных на IDL, и создание соответствующих подходящих структур данных (классов, типов, объектов) для выбранного языка программирования;

5) политика безопасности описывается на специально разработанном языке ALFAScript, основанном на XACML-совместимом языке ALFA [6]. При этом из ALFAScript возможен доступ ко всем атрибутам субъектов и сущностей доступа;

6) с помощью разработанного компилятора выполняется преобразование кода на языке ALFAScript в код на языке Lua, доступного для PDP.

На уровне PEP выполняются следующие действия:

1) синтаксический анализ запроса и создание структур данных, соответствующих запросу на доступ субъекта к сущности (Request, RequestContext). При необходимости выполняется получение атрибутов от PIP;

2) RequestContext отправляется PDP;

3) получение ResponseContext от PDP. Запрещение или разрешение запроса в соответствии с результатом проверки запроса.

На уровне PDP выполняются следующие действия:

1) создание среды выполнения кода на Lua средствами заданного языка программирования;

2) запуск и выполнение Lua-кода на RequestContext;

3) формирование контекста ответа ResponseContext и отправка его PEP. На уровне PIP выполняются следующие действия:

1) разрешение динамических атрибутов (например, IP-адрес, время);

2) получение значений статических атрибутов (например, уровень доступа, идентификатор).

Основной особенностью данного подхода является компиляция политики безопасности на ALFAScript в код на языке Lua. В известных фреймворках и библиотеках по политике управления доступом, выраженной на каком-либо языке, генерируется или XML-код, или код для целевого языка программирования (например, [7]), а затем данный код выполняется в КС. Выбор языка Lua в качестве универсальной платформы выполнения обосновывается тем, что в настоящее время Lua позиционируется и используется как встраиваемый язык. Все основные языки программирования (например, C++, Java, GoLang, Python, Ruby, NodeJS) имеют развитые средства для запуска программ на Lua и взаимодействия с ними через среду выполнения.

В рамках создаваемого фреймворка разработаны и реализованы следующие средства:

— прототип языка описания универсальных синтаксических деревьев (UST);

— прототип языка ALFAScript;

— компилятор политики безопасности из ALFAScript в Lua;

— генератор структур данных для языков C+—+, Python и Go;

— программные средства, реализующие функции PAP, PEP, PIP и PDP [5] для языков Python и Go;

— синтаксические анализаторы MySQL, TSQL, HTTP для PEP.

Рассмотрим пример. Пусть необходимо реализовать управление доступом на уровне межсетевого экрана для СУБД MySQL [1, 2]. Определим следующие интерфейсы элементов управления доступом:

1 interface Entity {

2 abstract id: String;

3 }

4

5 interface SQLEntity <: Entity {

6 database: String;

7 table: String;

8 column: String;

9 level: Number;

10 tags: [String] ;

11 } 12

13 interface Subject <: Entity {

14 name: String;

15 level: Number;

16 tags: [String];

17 }

Данные интерфейсы могут быть реализованы следующими классами на языке Python:

1 2

3

4

5

6

7

8 9

10 11 12

13

14

15

16

17

18

19

20 21 22

23

24

25

26

27

28

from abc import ABCMeta, abstractproperty, abstractmethod

class Entity(object) : def __init__ ( self ) :

super

@abstractproperty def id(self ) : pass

class SQLEntity(Entity) :

def __init__ (self , database = None , table = None , column = None, level=None, tags=None):

super

self.database = database

self.table = table

self.column = column

self.level = level

self.tags = tags

name=None, level=None, tags=None): self) .__init__

1 2

3

4

5

6

7

8 9

10

class Subject(Entity) def __init__ (self super(Subj ect self.name = name self.level = level self.tags = tags

Пример политики безопасности на языке ALFAScript:

namespace example { export policy Main {

target clause action == "select" apply denyUnlessPermit rule r1 { permit

target clause subject.level > entity.level

}

}

}

Код на языке Lua, реализующий приведённую выше политику безопасности:

local lib = require

local __test = lib.test

local __subseteq = lib.subseteq

local __issubseteq = lib.issubseteq

local __iselement = lib.iselement

1 2

3

4

5

6

7

8

local example = {}

9 local __example = function(example) 10

11 function example.Main

12 if not ctx.action then

13 return actions.indeterminate

14 end

15 if not ( ctx.action == "select" ) then

16 return actions.notapplicable

17 end

18

19

20 local function r1

21 if not ctx . ent ity . level or not ctx . subj ect . level then

22 return actions.indeterminate

23 end

24 if ( ctx.subject.level > ctx.entity.level ) then

25 return act ions.permit

26 end

27 return actions.notapplicable

28 end

29

30 local rules = { r0 = r1 }

31 for _, rule in pairs(rules) do

32 local decision = rule

33 if decision == actions.permit then

34 return act ions.permit

35 e nd

36 e nd

37 return actions.deny

38

39 end

40

41 end

42

43 __example

44

45 function __main

46 return example.Main

47 end

Пример итогового кода, реализующего управление доступом (PEP):

1 from Angine.policy import Policy

2 from Angine.pip import PIP

3 from Angine.pdp import PDP

4

5 alfa_mysql_policy = """

6 namespace example {

7 export policy Main {

8 target clause action == "select"

9 apply denyUnlessPermit 10 rule r1 {

11 permit

12 target clause subject.level > entity.level

13 }

14 }

15 }

16 ......

17

18 def pep () :

19 ...

20 request = get_request

21 policy = Pol icy

22 pip = PIP.init_data

23 pdp = PDP

24 ctx = pip.create_ctx

25 response = pdp.evaluate

26 if response["result"]["decision"] != "permit":

27 return None

28 else:

29 return process

Таким образом, в работе представлено расширение метода управления доступом из XACML — фрэймворк атрибутного управления доступом Angine, позволяющий гибко реализовывать механизм управления доступом в различных КС. Принципиально новым является компиляция заданной политики управления доступом на языке ALFAScript в код на языке Lua с последующим его запуском в среде выполнения языка программирования.

ЛИТЕРАТУРА

1. Колегов Д. Н.,Ткаченко Н. О. Неинвазивная реализация мандатного управления доступом в веб-приложениях на уровне СУБД // Прикладная дискретная математика. Приложение. 2015. №8. С. 89-92.

2. Колегов Д. Н.,Ткаченко Н. О. Неинвазивное устранение уязвимостей логического управления доступом в веб-приложениях [Электронный ресурс]. Режим доступа: https://www. youtube.com/watch?v=SPiY6D3M0yE

3. Hu V. C., Ferraiolo D., Kuhn R., et al. Guide to Attribute Based Access Control (ABAC) Definition and Considerations [Электронный ресурс]. Режим доступа: http://nvlpubs. nist.gov/nistpubs/specialpublications/NIST.sp.800-162.pdf

4. Jin X., Krishnan R., and Sandhu R. A Unified Attribute-Based Access Control Model Covering DAC, MAC and RBAC. [Электронный ресурс]. Режим доступа: http://www.profsandhu. com/confrnc/ifip/ABAC-dbsec12-preprint.pdf

5. OASIS Standard. extensible Access Control Markup Language (XACML) Version 3.0. [Электронный ресурс]. Режим доступа: http://docs.oasis-open.org/xacml/3.0/xacml-3. 0-core-spec-os-en.html

6. Axiomatics. How Can I Use Policy References in ALFA? [Электронный ресурс]. Режим доступа: https://www.axiomatics.com/blog/how-can-i-use-policy-references-in-alfa/

7. Decat M. STAPL. The Simple Tree-structured Attribute-based Policy Language. [Электронный ресурс]. Режим доступа: https://github.com/stapl-dsl