Проверка безопасности пользователей 1С

Со временем, даже в небольших конфигурациях 1С количество пользователей чаще всего увеличивается. А если еще и компания достаточно большая, то возникает необходимость следить за тем, чтобы учётки вовремя отключались. А еще и были безопасны с точки зрения использования. Например: достаточно часто пользователь меняет пароль, включена ли у него доменная авторизация и т.п., Фактически полноценная проверка безопасности пользователей 1С

В моём случае возникла необходимость регулярно мониторить служебные учётные данные. Количество разработчиков большое. Количество http и web сервисов не большое, но постоянно растёт, т.к. мы придерживаюсь принципа: один сервис — одна учётка для доступа. Делается это для того чтобы было удобнее логировать и отслеживать кто что и как. Соответственно необходимо чтобы эти служебные пользователи имели строго определенные доступы, и не имели возможность непосредственного входа в 1С через толстый и тонкий клиенты.

После калькуляции требований безопасности я выявил следующие показатели для того чтобы считать учётную запись «неблагонадёжной»:

  • нет доменной авторизации
  • разрешен вход в 1с (галочка «Доступ к информационной базе разрешен» в справочнике Пользователи)
  • у пользователя включены роли ЗапускВебКлиента, ЗапускТолстогоКлиента, ЗапускВнешнегоСоединения
  • При ответе «Да» на все три условия, пользователя помещаю в соответствующий список.
  • Кроме того дополнительно провожу проверку, что в правах одной из ролей есть права: ЗапускВебКлиента, ЗапускТолстогоКлиента, ЗапускВнешнегоСоединения

В итоге родил такую обработку:

Процедура СК_ГР_ПроверкаБезопасностиПользователя() экспорт
	УстановитьПривилегированныйРежим(Истина);
	Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); 
	МассивДляОтчета=Новый Массив();
	данные="";   
	бд=НСтр(СтрокаСоединенияИнформационнойБазы(), "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С

Почитайте еще по теме 1С тут