Если в Tessa объект «роль — условия — разрешения — объект» является квантом модели предоставления прав, то правило доступа должно быть логичным кластером подобных квантовых объектов. Далее предпринята попытка анализа подобных кластеров.
Загрузка библиотек¶
In [4]:
import pandas as pd
import numpy as np
Выгрузка данных из БД Tessa¶
-- Все правила доступа с русским переводом параметров
SELECT kp.ID AS [ID npasmna AocTyna],
kp.Caption AS [Ha3BaHne npaBuna AocTyna],
CASE WHEN kp.IsDisabled ='1' THEN 'True' ELSE 'False' END AS [Правило отключено],
CASE WHEN kp.IsRequired ='1' THEN 'True' ELSE 'False' END AS [Всегда проверять правило],
CASE WHEN kp.IsExtended ='1' THEN 'True'ELSE 'False' END AS [РПД],
CASE WHEN kp.Conditions LIKE '%ConditionTypeID%' THEN 'True' ELSE 'False' END AS [Типы условий],
-- Разрешения из правил доступа
CASE WHEN kp.CanCreateCard ='1' THEN 'True' ELSE 'False' END AS [Создание карточки],
CASE WHEN kp.CanReadCard ='1' THEN 'True' ELSE 'False' END AS [Чтение карточки],
CASE WHEN kp.CanEditCard ='1' THEN 'True' ELSE 'False' END AS [Редактирование карточки]]
CASE WHEN kp.CanEditFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование файлов],
CASE WHEN kp.CanAddFiles ='1' THEN 'True' ELSE 'False' END AS [Добавление файлов],
CASE WHEN kp.CanEditRoute ='1' THEN 'True' ELSE 'False' END AS [Редактирование маршрута],
CASE WHEN kp.CanDeleteCard ='1' THEN 'True' ELSE 'False' END AS [Удаление карточки],
CASE WHEN kp.CanStartProcess ='1' THEN 'True' ELSE 'False' END AS [Инициация типового процесса отправки задач],
CASE WHEN kp.CanEditNumber ='1' THEN 'True' ELSE 'False' END AS [Ручное редактирование номера],
CASE WHEN kp.CanCreateResolutions ='1' THEN 'True' ELSE 'False' END AS [Создание резолюций],
CASE WHEN kp.CanDeleteFiles ='1' THEN 'True' ELSE 'False' END AS [Удаление всех файлов],
CASE WHEN kp.CanEditOwnFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование собственных файлов].
CASE WHEN kp.CanDeleteownFiles ='1' THEN 'True'ELSE 'False' END AS [Удаление собственных файлов],
CASE WHEN kp.CansignFiles ='1' THEN 'True' ELSE 'False' END AS [Подписание файлов],
CASE WHEN kp.CanAddTopics ='1' THEN 'True'ELSE 'False'END AS [Создание обсуждений].
CASE WHEN kp.CanSuperModeratorMode ='1' THEN 'True'ELSE 'False' END AS [Права супермодератора],
CASE WHEN kp.CanSubscribeForNotifications = '1' THEN 'True' ELSE 'False' END AS [Подписка на уведомления],
CASE WHEN kp.CanCreateTemplateAndCopy ='1' THEN 'True' ELSE 'False' END AS [Создание шаблона и копирование],
CASE WHEN kp.CanSkipStages ='1' THEN 'True' ELSE 'False' END AS [Пропуск этапов],
CASE WHEN kp.CanFullRecalcRoute ='1' THEN 'True' ELSE 'False' END AS [Полный пересчет маршрута].
CASE WHEN kp.CanEditMyMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование своих сообщений],
CASE WHEN kp.CanEditAllMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование всех сообщений],
CASE WHEN kp.CanReadAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение обсуждений],
CASE WHEN kp.CanReadAndSendMessageInAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение и отправка сообщений]
FROM KrPermissions (NOLOCK) kp;
-- Обогащение правил доступа дополнительными данными о ролях
SELECT DISTINCT
-- Правила доступа
kpr.ID AS [ID правила доступа],
-- Роли
kpr.RoleID AS [ID роли],
kpr.RoleName AS [Название роли]
FROM krPermissionRoles (NOLOCK) kpr;
-- Обогащение правил доступа дополнительными данными о типах документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Тип карточки
kpt.TypeCaption AS [ID ЛФО типа карточки]
dbo.Localize(kpt.TypeCaption, 25) AS [Тип карточки]
FROM KrPermissionTypes (NOLOCK) kpt;
-- Обогащение правил доступа дополнительными данными о состояниях документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Состояние карточки
kps.StateName AS [ID ЛФО состояния карточки]
dbo.Localize(kps.StateName, 25) AS [Состояние карточки]
FROM KrPermissionstates (NOLOCK) kps
-- Расширенные правила доступа (РПД)
SELECT
DISTINCT
-- Правила доступа
kp.ID AS [ID правила доступа],
-- Параметры РПД
kpecr.SectionName AS [РПД. Секция карточки].
kpecrf.FieldName AS [РПД. Поле карточки],
kpecr. AccessSettingName AS [РПД. Разрешение],
dbo.Localize(kpecr.AccesssettingName, 25) AS [РПД. Разрешение (рус)]
FROM KrPermissions AS kp
LEFT JOIN KrPermissionExtendedcardRules (NOLOCK) kpecr ON kpecr.ID = kp. ID
LEFT JOIN KrPermissionExtendedcardRulefields (NOLOCK) kpecrf ON kpecrf. ID = kp.ID;
-- Вхождение PersonalRoles в любые Roles, кроме ContextRoles
SELECT pr.ID AS [ID пользователя],
pr.Name AS [Имя пользователя],
pr.Position AS [Должность пользователя],
pr.AccessLevelID AS [Уровень доступа пользователя],
pr.LoginTypeID AS [Тип учетной записи пользователя],
pr.Login AS [Логин пользователя],
CASE WHEN pr.Blocked ='1' THEN 'True' END AS [Блокировка учетной записи пользователя],
r.ID AS [ID роли],
r.Name AS [Название роли],
r.TypeID AS [Тип роли]
FROM Roles (NOLOCK)r
LEFT JOIN RoleUsers (NOLOCK) ru ON ru.ID = r.ID
LEFT JOIN PersonalRoles (NOLOCK) pr ON pr.ID - ru.UserID
WHERE (ru. IsDeputy = O OR ru.IsDeputy IS NULL)
ORDER BY pr.Name, r.Name;
-- ContextRoles
SELECT cr.ID AS [ID роли],
cr.SqlText AS [Код SQL]
FROM ContextRoles (NOLOCK) cr;
-- Для выявления вхождения идентификаторов ролей в коды контекстных ролей
-- (очень долгая операция, лучше реализовать локально на Python)
--LEFT JOIN Roles (NOLOCK) r ON cr.SqlText LIKE '%'+CONVERT(VARCHAR(50), .ID)+'%'
Загрузка данных¶
In [ ]:
# Данные из таблицы KrPermissions, предварительно выгруженные из БД Tessa
KrPermissions = pd.read.csv('KrPermissions.csv', sep=';')#, encoding='utf-8-sig')
print(KrPermissions.info())
KrPermissions.head(5)
In [ ]:
# Данные из таблицы KrPermissionRoles, предварительно выгруженные из БД Tessa
KrPermissionRoles = pd.read.csv('KrPermissionRoles.csv', sep=';')#, encoding='utf-8-sig')
print(KrPermissionRoles.info())
KrPermissionRoles.head(5)
In [ ]:
# Данные из таблицы KrPermissionTypes, предварительно выгруженные из БД Tessa
KrPermissionTypes = pd.read.csv('KrPermissionTypes.csv', sep=';')#, encoding='utf-8-sig')
print(KrPermissionTypes.info())
KrPermissionTypes.head(5)
In [ ]:
# Данные из таблицы KrPermissionStates, предварительно выгруженные из БД Tessa
KrPermissionStates = pd.read.csv('KrPermissionStates.csv', sep=';')#, encoding='utf-8-sig')
print(KrPermissionStates.info())
KrPermissionStates.head(5)
In [ ]:
# Данные из таблицы KrPermissionCardRules, предварительно выгруженные из БД Tessa
KrPermissionCardRules = pd.read.csv('KrPermissionCardRules.csv', sep=';')#, encoding='utf-8-sig')
print(KrPermissionCardRules.info())
KrPermissionCardRules.head(5)
In [ ]:
# Данные из таблицы RoleUsers, предварительно выгруженные из БД Tessa
RoleUsers = pd.read.csv('RoleUsers.csv', sep=';')#, encoding='utf-8-sig')
print(RoleUsers.info())
RoleUsers.head(5)
In [ ]:
# Данные из таблицы ContextRoles, предварительно выгруженные из БД Tessa
ContextRoles = pd.read.csv('ContextRoles.csv', sep=';')#, encoding='utf-8-sig')
print(ContextRoles.info())
ContextRoles.head(5)
Предобработка данных¶
Перемещение дополнительной информации из датафреймов с правилами в отдельные датафреймы¶
In [ ]:
# Перемещение данных о правилах доступа в отдельный датафрейм
rules_data = KrPermissions[['ID правила доступа', 'Название правила доступа',
'Правило отключено', 'Всегда проверять правило',
'РПД', 'Типы условий']]\
.groupby(['ID правила доступа', 'Название правила доступа',
'Правило отключено', 'Всегда проверять правило',
'РПД', 'Типы условий']).count().reset_index()
KrPermissions = KrPermissions.drop(['Название правила доступа',
'Правило отключено', 'Всегда проверять правило',
'РПД', 'Типы условий'], axis=1)
print(rules_data.info())
rules_data.head(5)
In [ ]:
# Перемещение названий ролей из правил доступа в отдельный датафрейм
roles_name = KrPermissionRoles[['ID роли', 'Название роли']]\
.groupby(['ID роли', 'Название роли']).count().reset_index()
KrPermissionRoles = KrPermissionRoles.drop(['Название роли'], axis=1)
print(rules_data.info())
rules_data.head(5)
Перемещение дополнительной информации из датафреймов с ролями в отдельные датафреймы¶
In [ ]:
# Перемещение данных о правилах доступа в отдельный датафрейм
user_data = RoleUsers[['ID пользователя',
'Имя пользователя',
'Логин пользователя',
'Должность пользователя',
'Уровень доступа пользователя',
'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя']]\
.groupby(['ID пользователя',
'Имя пользователя',
'Логин пользователя',
'Должность пользователя',
'Уровень доступа пользователя',
'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'],
# Не удалять строки с пропусками
dropna=False)\
.count().reset_index()
user_data = user_data[~user_data['ID пользователя'].isnull()]
RoleUsers = RoleUsers.drop(['Имя пользователя',
'Логин пользователя',
'Должность пользователя',
'Уровень доступа пользователя',
'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'], axis=1)
print(user_data.info())
user_data.head(5)
In [ ]:
# Перемещение данных о правилах доступа в отдельный датафрейм
role_name = RoleUsers[['ID роли', 'Название роли']]\
.groupby(['ID роли', 'Название роли']).count().reset_index()
RoleUsers = RoleUsers.drop(['Название роли'], axis=1)
print(role_name.info())
role_name.head(5)
In [ ]:
# Перемещение данных од известных роляъ в отдельный датафрейм
roles = RoleUsers[RoleUsers['ID роли'] != 'Unknown'].drop_duplicates()
print(roles.info())
roles.head(5)
Кластеризация правил и ролей¶
Правила и роли не дающие прав пользователям¶
In [ ]:
# Связка полной информации о ролях с идентификаторами правил,
# в которых роли используются
rules_roles = pd.merge(KrPermissionRoles,
roles,
on='ID роли', how-'left')
rules_roles = pd.merge(rules_roles,
rules_data[['ID правила доступа', 'Правило отключено']],
on='ID правила доступа', how-'left')
print(rules_roles.info())
rules_roles.head(5)
In [ ]:
# Правила с групповыми ролями, о не контекстными, по которым практически
# не возможно отследить, кому они предоставляют права
rules_not_contextuel_roles = rules_roles[rules_roles['Тип роли'] != 4]
print('-'*5, 'Правила без контекстных ролей', '-'*5)
print(rules_roles.info())
rules_roles.head(5)
In [ ]:
# Предварительный список правил с ролями без пользователей
_rules_without_users = rules_not_contextuel_roles[rules_not_contextuel_roles['ID пользователя'].isnull()]\
sort_values(['ID правила доступа', 'ID роли'])\
.drop(['ID пользователя', 'Должность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'], axis=1).drop_duplicates()
# Правила с ролями без пользователей
rules_without_users = pd.merge(_rules_without_users['ID правила доступа']).drop_duplicates(),
rules_data[['ID правила доступа', 'Название правила доступа', 'Правило отключено']],
on='ID правила доступа', how='inner')
rules_without_users.to_csv('clusters/rules_without_users.csv')
print('-'*5, 'Правила с ролями без пользователей', '-'*5)
print(rules_without_users.info())
rules_without_users.head(5)
In [ ]:
# Роли без пользователей в правилах
roles_without_users = pd.merge(_rules_without_users[['ID роли', 'Тип роли']]).drop_duplicates(),
rules_data[['ID роли', 'Название роли']],
on='ID роли', how='left')[['ID роли', 'Название роли', 'Тип роли']]
roles_without_users.to_csv('clusters/rules_without_users.csv')
print('-'*5, 'Роли без пользователей (в правилах)', '-'*5)
print(roles_without_users.info())
roles_without_users.head(5)
In [ ]:
# Предварительный список правил с ролями с пользователями
_rules_with_users = rules_not_contextuel_roles[~rules_not_contextuel_roles['ID пользователя'].isnull()]\
sort_values(['ID правила доступа', 'ID роли'])\
.drop(['ID пользователя', 'Должность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'], axis=1).drop_duplicates()
# Правила с ролями с пользователями
rules_with_users = pd.merge(_rules_with_users['ID правила доступа']).drop_duplicates(),
rules_data[['ID правила доступа', 'Название правила доступа', 'Правило отключено']],
on='ID правила доступа', how='inner')
rules_with_users.to_csv('clusters/rules_with_users.csv')
print('-'*5, 'Правила с ролями с пользователями', '-'*5)
print(rules_with_users.info())
rules_with_users.head(5)
In [ ]:
# Роли с пользователями в правилах
roles_with_users = pd.merge(_rules_with_users[['ID роли', 'Тип роли']]).drop_duplicates(),
rules_data[['ID роли', 'Название роли']],
on='ID роли', how='left')[['ID роли', 'Название роли', 'Тип роли']]
roles_with_users.to_csv('clusters/roles_with_users.csv')
print('-'*5, 'Роли с пользователями (в правилах)', '-'*5)
print(roles_with_users.info())
roles_with_users.head(5)
Правила с заблокированными пользователями¶
In [ ]:
# Карточки заблокирванных пользователей
blocked_users = user_data[
(user_data['Логин пользователя'].isna())
| (user_data['Блокировка учетной записи пользователя'] == 1)
& ~(user_data['ID пользователя'] == '11111111-1111-1111-1111-111111111111')
][['ID пользователя', 'Имя пользователя']]
# Карточки не заблокированных пользователей
non_blocked_users = user_data[
~(user_data['Логин пользователя'].isna())
| ~(user_data['Блокировка учетной записи пользователя'] == 1)
][['ID пользователя', 'Имя пользователя']]
print('-'*5, 'Заблокированные пользователи', '-'*5)
print(blocked_users.info())
display(blocked_users.head(5))
print('-'*5, 'Не заблокированные пользователи', '-'*5)
print(non_blocked_users.info())
display(non_blocked_users.head(5))
In [ ]:
# Правила с заблокированными пользователями
_rules_with_blocked_users = rules_not_contextuel_roles[
rules_not_contextuel_roles['ID пользователя'].isin(blocked_users['ID пользователя'])
]['ID правила доступа'].drop_duplicates()
rules_with_blocked_users = rules_with_users[rules_with_users['ID правила доступа'].isin(_rules_with_blocked_users)].drop_duplicates()
rules_with_blocked_users.to_csv('clusters/rules_with_blocked_users.csv')
# Правила с не заблокированными пользователями
_rules_with_non_blocked_users = rules_not_contextuel_roles[
rules_not_contextuel_roles['ID пользователя'].isin(non_blocked_users['ID пользователя'])
]['ID правила доступа'].drop_duplicates()
rules_with_non_blocked_users = rules_with_users[rules_with_users['ID правила доступа'].isin(_rules_with_non_blocked_users)].drop_duplicates()
rules_with_non_blocked_users.to_csv('clusters/rules_with_non_blocked_users.csv')
print('-'*5, 'Правила с заблокированными пользователями', '-'*5)
print(rules_with_blocked_users.info())
display(rules_with_blocked_users.head(5))
print()
print('-'*5, 'Правила с не заблокированными пользователями', '-'*5)
print(rules_with_non_blocked_users.info())
display(rules_with_non_blocked_users.head(5))
Правила с сотрудниками без групповых ролей¶
In [ ]:
# Предварительный список правил с сотрудниками без групповых ролей
_rules_with_users_without_roles = rules_not_contextuel_roles[
rules_not_contextuel_roles['Тип роли'] == 1 # Тип роли Сотрудник
].sort_values(['ID правила доступа', 'ID роли']).drop(['ID пользователя', 'Должность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'], axis=1).drop_duplicates()
# Правила с сотрудниками без групповых ролей
rules_with_users_without_roles = pd.merge(_rules_with_users_without_roles['ID правила доступа'].drop_duplicates(),
ules_data[['ID правила доступа', 'Название правила доступа', 'Правило отключено']],
on='ID правила доступа', how='inner')
rules_with_users_without_roles.to_csv('clusters/rules_with_users_without_roles.csv')
# Пользователи без групповых ролей в правилах
roles_with_users_without_roles = pd.merge(_rules_with_users_without_roles[['ID роли', 'Тип роли']].drop_duplicates(),
roles_name[['ID роли', 'Название роли']],
on='ID роли', how='left')[['ID роли', 'Название роли', 'Тип роли']]
roles_with_users_without_roles.to_csv('clusters/roles_with_users_without_roles.csv')
print('-'*5, 'Правила с сотрудниками без групповых ролей', '-'*5)
print(rules_with_users_without_roles.info())
display(rules_with_users_without_roles.head(5))
print()
print('-'*5, 'Пользователи без групповых ролей в правилах', '-'*5)
print(roles_with_users_without_roles.info())
display(roles_with_users_without_roles.head(5))
Правила с пользователем System¶
In [ ]:
# Предварительный список правил с пользователем System
_rules_with_system = rules_not_contextuel_roles[
rules_not_contextuel_roles['ID пользователя'] == '11111111-1111-1111-1111-111111111111' # Пользователь System
].sort_values(['ID правила доступа', 'ID роли']).drop(['ID пользователя', 'Должность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'], axis=1).drop_duplicates()
# Правила с пользователем System
rules_with_system = pd.merge(_rules_with_system['ID правила доступа'].drop_duplicates(),
rules_data[['ID правила доступа', 'Название правила доступа', 'Правило отключено']],
on='ID правила доступа', how='inner')
rules_with_system.to_csv('clusters/rules_with_system.csv')
# Роли с пользователем System
roles_with_system = pd.merge(_rules_with_system[['ID роли', 'Тип роли']].drop_duplicates(),
roles_name[['ID роли', 'Название роли']],
on='ID роли', how='left')[['ID роли', 'Название роли', 'Тип роли']]
roles_with_system.to_csv('clusters/roles_with_users_without_roles.csv')
print('-'*5, 'Правила с пользователем System', '-'*5)
print(rules_with_system.info())
display(rules_with_system.head(5))
print()
print('-'*5, 'Роли с пользователем System', '-'*5)
print(roles_with_system.info())
display(roles_with_system.head(5))
Правила с системными ролями¶
In [ ]:
# Предварительный список правил с системными пользователями
_rules_with_systems_roles = rules_not_contextual_roles[rules_not_contextual_roles['ID пользователя'].isin([
#'11111111-1111-1111-1111-111111111111', #'System'
'00000000-0000-0000-0000-000000000002', # 'Бухгалтерские сервисы'
'00000000-0000-0000-0000-000000000003', # 'ИТ-сервисы'
'00000000-0000-0000-0000-000000000004', # 'Сайт компании'
'00000000-0000-0000-0000-000000000005', # 'Робот службы безопасности'
'00000000-0000-0000-0000-000000000006', # 'Робот финансовой службы'
'00000000-0000-0000-0000-000000000007' # 'Юридические сервисы'
])].sort_values([
'ID правила доступа',
'ID роли'
]).drop(['ID пользователя',
'Должность пользователя',
'Уровень доступа пользователя',
'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'
], axis=1).drop_duplicates()
# Правила с системными пользователями
rules_with_systems_roles = pd.merge(
_rules_with_systems_roles['ID правила доступа'].drop_duplicates(),
rules_data[['ID правила доступа','Название правила доступа','Правило отключено']],
on='ID правила доступа', how='inner')
rules_with_systems_roles.to_csv('clusters/rules_with_system.csv')
# Роли с системными пользователями в правилах
roles_with_systems_roles = pd.merge(
_rules_with_systems_roles[['ID роли','Тип роли']].drop_duplicates(),
role_name[['ID роли','Название роли']],
on='ID роли', how='left'
)[['ID роли','Название роли','Тип роли']]
roles_with_systems_roles.to_csv('clusters/roles_with_system.csv')
print('-'*5,'Правила с системными пользователями',‘-**5)
print(rules_with_systems_roles.info())
display(rules_with_systems_roles.head(5))
print()
print('-'*5,'Роли с системными пользователями в правилах',·_'*5)
print(roles_with_systems_roles.info())
display(roles_with_systems_roles.head(5))
Правила с администраторами¶
In [ ]:
# Предварительный список правил с администраторами
_rules_with_admins = rules_not_contextual_roles[
(rules_not_contextual_roles['ID пользователя'].isin(['00000000-0000-0000-0000-000000000008'])) # Статическая роль 'Сотрудники с правами Администратора
| (rules_not_contextual_roles['Уровень доступа пользователя']== 1) # Административный уровень доступа
].sort_values(['ID правила доступа','ID роли']).drop([
'ID пользователя', 'Доложность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Блокировка учетной записи пользователя'
], axis=1).drop_duplicates()
# Правила с администраторами
rules_with_admins = pd.merge(_rules_with_admins['ID npaBwna AocTyna'].drop_duplicates(),
rules_data[['ID правила доступа',
'Название правила доступа',
'Правило отключено']], on='ID правила доступа', how='inner')
rules_with_admins.to_csv('clusters/rules_with_admins.csv')
# Роли с администраторами
roles_with_admins = pd.merge(_rules_with_admins[['ID роли','Tun роли']].drop_duplicates(),
role_name[['ID роли','Название роли']],
on='ID роли', how='left')[['ID роли','Название роли','Тип роли']]
roles_with_admins.to_csv('clusters/roles_with_admins.csv')
print('-'*5,'Правила с администраторами','-'*5)
print(rules_with_admins.info())
display(rules_with_admins.head(5))
print()
print('-'*5,'Роли с администраторами в правилах','-'*5)
print(roles_with_admins.info())
display(roles_with_admins.head(5))
Объединение данных о результатах анализа правил¶
In [ ]:
# Данные о правилах
result_rules = rules_data[['ID правила доступа','Название правила доступа','Правило отключено']].drop_duplicates()
result_rules['РПД'] = np.where(result_rules['ID правила доступа'].isin(rules_data[rules_data['РПД'] == True]['ID правила доступа']), True, False)
result_rules['Типы условий'] = np.where(result_rules['ID правила доступа'].isin(rules_data[rules_data['Типы условий'] == True]['ID правила доступа']), True, False)
# Данные о ролях в правилах
result_rules['Контекстные роли'] = np.where(result_rules['ID правила доступа'].isin(rules_roles[rules_roles['Тип роли'] == 4]['ID правила доступа']), True, False)
result_rules['Роли с пользователями'] = np.where(result_rules['ID правила доступа'].isin(rules_with_users['ID правила доступа']), True, False)
result_rules['Роли без пользователей'] = np.where(result_rules['ID правила доступа'].isin(rules_without_users['ID правила доступа']), True, False)
result_rules['Роли с не заблокированными пользователями'] = np.where(result_rules['ID правила доступа'].isin(rules_with_non_blocked_users['ID правила доступа']), True, False)
result_rules['Роли с заблокированными пользователями'] = np.where(result_rules['ID правила доступа'].isin(rules_with_blocked_users['ID правила доступа']), True, False)
result_rules['Пользователи без групповых ролей'] = np.where(result_rules['ID правила доступа'].isin(rules_with_users_without_group_roles['ID правила доступа']), True, False)
result_rules['Роли с System'] = np.where(result_rules['ID правила доступа'].isin(rules_with_system['ID правила доступа']), True, False)
result_rules['Роли с системными пользователям'] = np.where(result_rules['ID правила доступа'].isin(rules_with_systems_roles['ID правила доступа']), True, False)
result_rules['Роли с администраторами'] = np.where(result_rules['ID правила доступа'].isin(rules_with_admins['ID правила доступа']), True, False)
# Данные о разрешениях
result_rules['Чтение карточки'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Чтение карточки'] == True]['ID правила доступа']), True, False)
result_rules['Создание карточки'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Создание карточки'] == True]['ID правила доступа']), True, False)
result_rules['Редактирование карточки'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Редактирование карточки'] == True]['ID правила доступа']), True, False)
result_rules['Удаление карточки'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Удаление карточки'] == True]['ID правила доступа']), True, False)
result_rules['Добавление файлов'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Добавление файлов'] == True]['ID правила доступа']), True, False)
result_rules['Редактирование файлов'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Редактирование файлов'] == True]['ID правила доступа']), True, False)
result_rules['Удаление всех файлов'] = np.where(result_rules['ID правила доступа'].isin(KrPermissions[KrPermissions['Удаление всех файлов'] == True]['ID правила доступа']), True, False)
print('-'*5,'Результаты анализа правил','-'*5)
print(result_rules.info())
display(result_rules.head(5))
Кластеризация правил¶
In [ ]:
# Кластеры правил и рекомендации
result_rules['Кластеры'] = ''
result_rules['Рекомендации'] = ''
# Все роли пустые
mask = ((result_rules['Роли с пользователями'] == False)
& (result_rules['Роли без пользователей'] == True)
| ( (result_rules['Роли с не заблокированными пользователями'] == False)
& (result_rules['Роли с заблокированными пользователями'] == True))
& (result_rules['Кластеры'] = ''))
result_rules.loc[mask, 'Кластеры'] = 'Все роли пустые. '
result_rules.loc[mask, 'Рекомендации'] = 'Удалить правила и роли внутри них. '
# Есть пустые роли
mask = ((result_rules['Роли с пользователями'] == True)
& (result_rules['Роли без пользователей'] == True)
| ( (result_rules['Роли с не заблокированными пользователями'] == True)
& (result_rules['Роли с заблокированными пользователями'] == True)))
result_rules.loc[mask, 'Кластеры'] = 'Пустые роли. '
result_rules.loc[mask, 'Рекомендации'] = 'Проверить правила и роли внутри них. '
# Иднивидуальные роли
mask = (result_rules['Пользователи без групповых ролей'] == True)
result_rules.loc[mask, 'Кластеры'] += 'Индивидуальные роли. '
result_rules.loc[mask, 'Рекомендации'] += 'Использовать групповые роли вместо иднивидуальных'
# Контекстные роли
mask = (result_rules['Контекстные роли'] == True)
result_rules.loc[mask, 'Кластеры'] += 'Контекстные роли. '
result_rules.loc[mask, 'Рекомендации'] += 'Контекстные роли заменить на групповые роли и типы условий. '
# Системные роли
mask = ((result_rules['Роли с системными пользователям'] == True))
result_rules.loc[mask, 'Кластеры'] += 'Системные роли. '
result_rules.loc[mask, 'Рекомендации'] += 'Сверить права системных ролей с их ТЗ. '
# Административные права
mask = ((result_rules['Роли с System'] == True)
| (result_rules['Роли с администраторами'] == True))
result_rules.loc[mask, 'Кластеры'] += 'Административные права. '
result_rules.loc[mask, 'Рекомендации'] += 'Особое внимание на список администраторов. '
# Полные права на модификацию документов
mask = ((result_rules['Редактирование карточки'] == True)
& (result_rules['Удаление карточки'] == True)
& (result_rules['Добавление файлов'] == True)
& (result_rules['Редактирование файлов'] == True)
& (result_rules['Удаление всех файлов'] == True))
result_rules.loc[mask, 'Кластеры'] += 'Полные права на модификацию документов. '
result_rules.loc[mask, 'Рекомендации'] += 'Проверить риск возможности подлога документов. '
# Права на чтение
mask = ((result_rules['Чтение карточки'] == True))
result_rules.loc[mask, 'Кластеры'] += 'Права на чтение. '
result_rules.loc[mask, 'Рекомендации'] += 'Сверить права с бизнес-требованиями на доступ к документам. '
# Права на создание
mask = ((result_rules['Создание карточки'] == True))
result_rules.loc[mask, 'Кластеры'] += 'Права на создание. '
result_rules.loc[mask, 'Рекомендации'] += ''
result_rules.to_csv('clusters/result_rules.csv', sep=';', encoding='utf-8-sig')
result_rules.head()


