Июль 2010
Пн Вт Ср Чт Пт Сб Вс
« Янв    
 1234
567891011
12131415161718
19202122232425
262728293031  

Многоуровневая защита

Допустим, что требуется применить идеи мандатной схемы управления доступом к переменной-отношению поставщиков S. Для определенности и простоты будем считать, что единицей данных, на уровне которой требуется контролировать доступ, является отдельный кортеж этой переменной-отношения. Тогда каждый кортеж должен быть отмечен соответствующим классификационным уровнем, например так, как показано на 16.1. (Здесь значение 4 в столбце CLASS означает уровень “Совершенно секретно”, 3 — “Секретно”, 2 — “Для служебного пользования”.)
Теперь предположим, что пользователи U1 и U2 имеют уровни доступа 3 (”Секретно”) и 2 (”Для служебного пользования”) соответственно. Тогда переменная-отношение S для этих пользователей будет выглядеть по-разному! Запрос на выборку сведений обо всех поставщиках со стороны пользователя U1 возвратит четыре кортежа с данными о поставщиках с номерами ‘S1′, ‘S2′, ‘S3′ и ‘S5′. Аналогичный запрос со стороны пользователя U2 возвратит два кортежа с данными о поставщиках с номерами ‘S1′ и ‘S3′. Более того, в результатах выполнения обоих запросов будут отсутствовать сведения о поставщике с номером ‘ S4′.
Разобраться в приведенных выше утверждениях можно, применив метод модификации запроса. Рассмотрим приведенный ниже запрос (”Получить сведения о поставщиках из Лондона”).
S WHERE CITY = ‘LONDON’
Система модифицирует этот запрос и приводит его к следующему виду.
S WHERE CITY = ‘LONDON’ AND CLASS < <уровень доступа пользователя>
Аналогичные соображения будут справедливы и по отношению к операциям обновления. Например, пользователь U1 не знает о существовании кортежа для поставщика с номером ‘S4′, а потому приведенная ниже команда INSERT может показаться ему вполне законной.
INSERT INTO S RELATION { TUPLE { S# S# ( ‘S4′ ),
SNAME NAME ( ‘Baker’ ),
STATUS 25,
CITY ‘Rome’ } } ;
Система не должна отвергать команду INSERT, поскольку в этом случае пользователь U1 в конечном счете узнает о существовании поставщика с номером ‘S4′. Такую команду система примет, но модифицирует ее и приведет к следующему виду.
INSERT INTO S RELATION { TUPLE { S# S# ( ‘S4′ ),
SNAME NAME ( ‘Baker’ ),
STATUS 25,
CITY ‘Rome’,
CLASS CLASS ( 3 ) } } ;
Обратите внимание, что в данном случае первичным ключом для переменной-отношения поставщиков является уже не атрибут {S#}, а комбинация атрибутов {S#, CLASS}.
Замечание. Для простоты предполагается, что существует только один потенциальный ключ, который в этом случае можно рассматривать как первичный ключ.