Проверка безопасности пользователей 1С
Со временем, даже в небольших конфигурациях 1С количество пользователей чаще всего увеличивается. А если еще и компания достаточно большая, то возникает необходимость следить за тем, чтобы учётки вовремя отключались. А еще и были безопасны с точки зрения использования. Например: достаточно часто пользователь меняет пароль, включена ли у него доменная авторизация и т.п., Фактически полноценная проверка безопасности пользователей 1С
В моём случае возникла необходимость регулярно мониторить служебные учётные данные. Количество разработчиков большое. Количество http и web сервисов не большое, но постоянно растёт, т.к. мы придерживаюсь принципа: один сервис — одна учётка для доступа. Делается это для того чтобы было удобнее логировать и отслеживать кто что и как. Соответственно необходимо чтобы эти служебные пользователи имели строго определенные доступы, и не имели возможность непосредственного входа в 1С через толстый и тонкий клиенты.
После калькуляции требований безопасности я выявил следующие показатели для того чтобы считать учётную запись «неблагонадёжной»:
- нет доменной авторизации
- разрешен вход в 1с (галочка «Доступ к информационной базе разрешен» в справочнике Пользователи)
- у пользователя включены роли ЗапускВебКлиента, ЗапускТолстогоКлиента, ЗапускВнешнегоСоединения
- При ответе «Да» на все три условия, пользователя помещаю в соответствующий список.
- Кроме того дополнительно провожу проверку, что в правах одной из ролей есть права: ЗапускВебКлиента, ЗапускТолстогоКлиента, ЗапускВнешнегоСоединения
В итоге родил такую обработку:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
Процедура СК_ГР_ПроверкаБезопасностиПользователя() экспорт УстановитьПривилегированныйРежим(Истина); Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); МассивДляОтчета=Новый Массив(); данные=""; бд=НСтр(СтрокаСоединенияИнформационнойБазы(), "Ref"); Для Каждого ЭлементМассива Из Выборка Цикл если ЭлементМассива.АутентификацияОС=ложь тогда если ЭлементМассива.АутентификацияСтандартная=истина тогда инф=Новый Структура("полноеимя,имя,email,датапароля,показыватьвспискевыбора,роли,пользователь,ЗапускВебКлиента,ЗапускТолстогоКлиента,ЗапускТонкогоКлиента,ЗапускВнешнегоСоединения"); инф.полноеимя=ЭлементМассива.ПолноеИмя; инф.имя=ЭлементМассива.Имя; инф.email=ЭлементМассива.АдресЭлектроннойПочты; инф.датапароля=ЭлементМассива.ДатаУстановкиПароля; инф.показыватьвспискевыбора=ЭлементМассива.ПоказыватьВСпискеВыбора; инф.роли=""; ЕстьПароль = ЭлементМассива.ПарольУстановлен; Роли = ЭлементМассива.Роли; Для Каждого Роль Из Роли Цикл если ПравоДоступа("ВебКлиент",Метаданные,Роль) тогда инф.роли=инф.роли+Роль.Имя+", "; иначеесли ПравоДоступа("ВнешнееСоединение",Метаданные,Роль) тогда инф.роли=инф.роли+Роль.Имя+", "; иначеесли ПравоДоступа("ТолстыйКлиент",Метаданные,Роль) тогда инф.роли=инф.роли+Роль.Имя+", "; иначеесли ПравоДоступа("ТонкийКлиент",Метаданные,Роль) тогда инф.роли=инф.роли+Роль.Имя+", "; конецесли; КонецЦикла; поль=Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",ЭлементМассива.УникальныйИдентификатор); ЗапускРоль=""; если поль<>Справочники.Пользователи.ПустаяСсылка() тогда инф.ЗапускВебКлиента=УправлениеДоступом.ЕстьРоль("ЗапускВебКлиента",, поль); если инф.ЗапускВебКлиента=истина тогда ЗапускРоль=ЗапускРоль+"Веб, "; конецесли; инф.ЗапускТолстогоКлиента=УправлениеДоступом.ЕстьРоль("ЗапускТолстогоКлиента",, поль); если инф.ЗапускТолстогоКлиента=истина тогда ЗапускРоль=ЗапускРоль+"Толстый, "; конецесли; инф.ЗапускТонкогоКлиента=УправлениеДоступом.ЕстьРоль("ЗапускТонкогоКлиента",, поль); если инф.ЗапускТонкогоКлиента=истина тогда ЗапускРоль=ЗапускРоль+"Тонкий, "; конецесли; инф.ЗапускВнешнегоСоединения=УправлениеДоступом.ЕстьРоль("ЗапускВнешнегоСоединения",, поль); если инф.ЗапускВнешнегоСоединения=истина тогда ЗапускРоль=ЗапускРоль+"Внешние, "; конецесли; конецесли; инф.пользователь=поль.Наименование; МассивДляОтчета.Добавить(инф); данные=данные+"<tr>"; данные=данные+" <td>"+инф.полноеимя+"</td>"; данные=данные+" <td>"+инф.имя+"</td>"; данные=данные+" <td>"+инф.пользователь+"</td>"; данные=данные+" <td>"+инф.email+"</td>"; данные=данные+" <td>"+инф.датапароля+"</td>"; данные=данные+" <td>"+инф.показыватьвспискевыбора+"</td>"; данные=данные+" <td>"+ЗапускРоль+"</td>"; данные=данные+" <td>"+инф.роли+"</td>"; данные=данные+"</tr>"; Конецесли; Конецесли; КонецЦикла; если МассивДляОтчета.Количество()>0 тогда тело="<style>td {border: 1px solid;} th{border: 1px solid;} table.table {word-wrap:true;border-collapse: collapse;border-spacing: 0;}table.table > thead > tr > th {font-size: 14px;font-weight: normal;padding-top: 7px;padding-bottom: 7px;}.table > thead > tr > th {vertical-align: bottom;border-bottom: 2px solid #ddd;}table.table th {background-color: #153e76;}</style>"; тело=тело+"Критерии попадания в этот список: отключена доменная авторизация, разрешен вход в 1С<br/>"; тело=тело+"<strong>Подозрительные учётки</strong>: <br/>"; тело=тело+"<table class='table'>"; тело=тело+" <thead>"; тело=тело+" <tr>"; тело=тело+" <th scope='col'> Полное имя</th>"; тело=тело+" <th scope='col'> Имя</th>"; тело=тело+" <th scope='col'> Пользователь</th>"; тело=тело+" <th scope='col'> Email</th>"; тело=тело+" <th scope='col'> Дата пароля</th>"; тело=тело+" <th scope='col'> В списке выбора</th>"; тело=тело+" <th scope='col'> Вид запуска</th>"; тело=тело+" <th scope='col'> Роли с доступом в 1С</th>"; тело=тело+" </tr>"; тело=тело+" </thead>"; тело=тело+" <tbody>"; тело=тело+данные; тело=тело+" </tbody>"; тело=тело+"</table>"; emails=Новый Массив(); emails.Добавить("цкуаука@куауцкацук.ru"); для каждого email из emails цикл если email<>"" тогда попытка ПараметрыПисьма = Новый Структура("Кому, Тема, Тело,ТипТекста", email, "Подозрительные учётки в БД: "+бд, тело,"HTML"); если бд="укму" тогда УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(); РаботаСПочтовымиСообщениями.ОтправитьСообщение(УчетнаяЗаписьПочты, ПараметрыПисьма); иначеесли бд="куепуке" тогда УчетнаяЗаписьПочты = РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(); РаботаСПочтовымиСообщениями.ОтправитьСообщение(УчетнаяЗаписьПочты, ПараметрыПисьма); иначеесли бд="укепуке" тогда РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(),ПараметрыПисьма); иначеесли бд="куепук" тогда РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(РаботаСПочтовымиСообщениями.СистемнаяУчетнаяЗапись(),ПараметрыПисьма); конецесли; исключение ЗаписьЖурналаРегистрации("Ошибка", УровеньЖурналаРегистрации.Ошибка,,ОписаниеОшибки(),); конецпопытки; конецесли; конеццикла; конецесли; УстановитьПривилегированныйРежим(ложь); КонецПроцедуры |
Обработкой я перебираю всех пользователей информационной базы, и ищу соответствующего пользователя из справочника «Пользователи». В том случае, если пользователя признаю потенциально не безопасным, то отправляю заинтересованному лицу уведомление на электронную почту.
Почитайте еще по теме 1С тут