Интеграция ИС с ЕСИА посредством SAML

в 10:00, , рубрики: denjoy, php, saml, SimpleSaml, госзаказ, госуслуги, есиа, интеграция с есиа, информационная безопасность, Разработка веб-сайтов, метки:

Интеграция с ЕСИА

При выполнении очередного госзаказа наша команда столкнулась с проблемой интеграции сайта с ЕСИА. Инструкции по решению этой задачи в сети нет, кроме информации в официальных документах МинКомСвязи (примерно 300 страниц в трех регламентах). Также есть компании, которые оказывают платные услуги по интеграции ЕСИА. Мы реализовали, описали процесс интеграции и решили поделиться с сообществом habrahabr.

Что такое ЕСИА

Единая Система Идентификации и Аутентификации — российская информациия система, обеспечивающая доступ (регистрация, аутентификация) на сайты государтсвенных структур и некоторых коммерческих организаций. Подробнее на википедии

В процессе интеграции ЕСИА, система сможет отправлять запрос на ЕСИА и при успешной авторизации получать в качестве ответа данные пользователя

Сценарий авторизации выглядит примерно так:

  • Пользователь на сайте, на котором внедряется ЕСИА, в личном кабинете нажимает на кнопку «Войти через ГосУслуги»
  • Система переадресует на сайт ЕСИА
  • Пользователь вводит свои логин и пароль на сайте ЕСИА
  • При успешной авторизации ЕСИА возвращает пользователя обратно на сайт и по защищенному протоколу передает его личные данные

Содержание

  1. Общие сведения
  2. Установка SimpleSAMLphp
  3. Настройка SimpleSAMLphp для подключения к тестовой среде ЕСИА
  4. Конфигурация файла метаданных
  5. Отправка заявки в адрес МинКомСвзяи на подключение ИС к тестовой среде ЕСИА
  6. Функциональная интеграция с ЕСИА и получение данных авторизированных пользователей через ЕСИА
  7. Отправка заявки на подключение ИС к продуктивной среде ЕСИА

Общие сведения

На сайте МинКомСвязи размещен документ, именуемый «Методические рекомендации по использованию Единой системы идентификации и аутентификации», последнюю актуальную версию всегда можно найти на сайте МинКомСвязи. Документ сам по себе немаленький — почти 200 страниц, и, конечно же мало кто захочет его подробно изучать, да и понятен он будет не всем желающим, поэтому опишу тут процесс в сухом остатке.

Подключить ИС к ЕСИА возможно двумя способами:

  • Посредством стандарта SAML 2.0
  • На базе подхода REST

Если сравнивать 2 подхода, то по факту разницы между ними большой нет, есть несколько плюсов у способа на базе подхода REST. Есть ребята, которые на мой взгляд за немалые деньги подключают ЕСИА и о преимуществах REST они написали тут.

Но для подавляющего большинста случаев первый подход охватывает все необходимые функции. Поэтому расскажу о внедрении ЕСИА посредством SAML 2.0

Установка SimpleSAMLphp

Для интеграции будем использовать SimpleSAMLphp. Если система, которую вы настраиваете написана не на PHP, то все равно можно использовать этот модуль, просто на вашем сайте будет функция аутентификации реализована на php, данные от ЕСИА вы получите в xml формате.

Последняя официальная версия SimplSAMLphp доступна на официальном сайте SimpleSamlPHP. Скачиваете архив, распаковываете модуль в папку /var.В целях безопасности для папки с разархивированным модулем необходимо настроить права доступа только для root пользователя. В конфигурации сервера необходимо добавить алиас и следующие правила:

<VirtualHost *>
ServerName service.example.com
    DocumentRoot /var/www/service.example.com
    SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config
    Alias /simplesaml /var/simplesamlphp/www
    <Directory /var/simplesamlphp/www>
        <IfModule !mod_authz_core.c>
        # For Apache 2.2:
        Order allow,deny
        Allow from all
        </IfModule>
        <IfModule mod_authz_core.c>
        # For Apache 2.4:
        Require all granted
        </IfModule>
    </Directory>
</VirtualHost>

Суть в том, чтобы по запросу ServerName/simplesaml открывалась приветственная страница simplesaml. Если вы все сделали правильно, то по запросу ServerName/simplesaml вы увидите такую страничку

SimpleSamlPHP

Настройка SimpleSAMLphp для подключения к тестовой среде ЕСИА

Для интеграции необходимы сертификат (cert.crt) и ключ (key.key). Важно(!) с ГОСТовским сертфикатом ничего не выйдет, можно получить бесплатный сертификат, погуглив как это делается, либо выпустить сертификат самому. Ключ и сертификат кладем в папку simplesamlphp/cert

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

  • simplesamlphp/config/config.php
  • simplesamlphp/config/authsources.php
  • simplesamlphp/metadata/saml20-idp-remote.php

Важное замечание — время на сервере не должно отличаться от времени ЕСИА больше 1 минуты.

simplesamlphp/config/config.php:

//путь к папке с сертификатом и ключом относительно директории simplesamlphp
'certdir' => 'cert/'

// соль
'secretsalt' => 'defaultsecretsalt',
//Контакты администратора
'technicalcontact_name' => 'Familiya Imya',
'technicalcontact_email' => 'po4ta@domen.zone',

Важно знать, есть ли у системы entityID, если его нет, то в поле 'entityID' необходимо указать адрес системы

simplesamlphp/config/authsources.php:


esia' => array (
	'saml:SP',
	'name' => 'Esia',
//файл закрытого ключа
	'privatekey' => 'key.key',
//пароль ключа
	'privatekey_pass' => '12345678',
//сертификат открытого ключа
	'certificate' => 'cert.crt',
//идентификатор системы,
	'entityID' => 'ServerName',
	'discoURL' => NULL,
	'redirect.sign' => TRUE,
	'redirect.validate' => TRUE,
	'validate.logout' => FALSE,
//idp поставщика услуг для тестовой среды
	'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth',
//idp поставщика услуг для продуктивной среды
//	'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth',
//Наименование организации
	'OrganizationName' => 'Organization Name',
//url организации
	'OrganizationURL' => 'ServerName',

Теперь надо получить подпись для нашего сертификата (fingerprint). Это можно сделать в терминале одной из команд

  • openssl x509 -noout -fingerprint -in "cert.crt" SHA1
  • sha1sum cert.crt

simplesamlphp/metadata/saml20-idp-remote.php:


// idp поставщика услуг для тестовой среды
$metadata['https://esia-portal1.test.gosuslugi.ru/idp/shibboleth'] = array(
	'name' => array(
		'en' => 'Esia',
		'no' => 'ESIA',
	),
//idp SignOn поставщика услуг
	'SingleSignOnService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SSO',
//idp LogOut поставщика услуг
	'SingleLogoutService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SLO',
//Fingerprint сертификата
	'certFingerprint' => 'f17393ae5927293ae5927261b6515c44501e4450',
);

Конфигурация файла метаданных

Теперь необходимо сгонфигурировать файл метаданных для того, чтобы его отправить вместе с заявкой в ЕСИА

Файл метаданных доступен по ссылке: ServerName/simplesaml/module.php/saml/sp/metadata.php/esia?output=xhtml

Пример файла метаданных:

<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="ServerName">
  <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>
		//Сертификат
	  </ ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>
		//Сертификат
	  </ ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="ServerName/simplesaml/module.php/saml/sp/saml2-logout.php/esia"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="0"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia" index="1"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="2"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia/artifact" index="3"/>
  </md:SPSSODescriptor>
  <md:Organization>
    <md:OrganizationName xml:lang="en">Organization Name</md:OrganizationName>
    <md:OrganizationDisplayName xml:lang="en">Organization Name</md:OrganizationDisplayName>
    <md:OrganizationURL xml:lang="en">ServerName</md:OrganizationURL>
  </md:Organization>
  <md:ContactPerson contactType="technical">
    <md:GivenName>Imya</md:GivenName>
    <md:SurName>Familiya</md:SurName>
    <md:EmailAddress>po4ta@domen.zone</md:EmailAddress>
  </md:ContactPerson>
</md:E</ntityDescriptor>

Но, к сожалению, SimpleSaml формирует файл метаданных, который немного отличается от требования ЕСИА, поэтому необходимо его подкорретировать в соотвествии с рекомендациями пункт А.6 Шаблон файла метаданных

Пример файла метаданных, удовлетворяющий требованиям ЕСИА, может скачать по ссылке example.xml

Отправка заявки в адрес МинКомСвзяи на подключение ИС к тестовой среде ЕСИА

Теперь формируем заявку по форме «E» Регламента информационного взаимодействия Участников с Оператором ЕСИА. Форму заявки в формате docx можете скачать с нашего сайта по ссылке.

Теперь необходимо отправить заявку на почту esia@minsvyaz.ru с темой «Интеграция тестовой ЕСИА» и к письму необходимо приложить три файла:

  • скан заявки в формате pdf,
  • сертификат в формате crt
  • файл метаданных xml

После получения ответа от поставщика услуг (ЕСИА) со статусом «Решен» и приложенными файлами для тестирования, переходим к следующему шагу.

Возможно Вам придет ответ с темой «Требуется дополнительная информация по запросу #», в этом случае в письме будет информация о том, что необходимо исправить.

Функциональная интеграция с ЕСИА и получение данных авторизированных пользователей через ЕСИА

Проверить подключения ИС к тестовой среде можно по ссылке
ServerName/simplesaml/module.php/core/authenticate.php?as=esia.

При корректном выполнении всех предыдущих пунктов по ссылке откроется страница с тестовой средой ЕСИА. Для аутентификации в тестовой среде используются данные, полученные от ЕСИА в письме со статусом «Решен». После аутентификации произойдет переход на страницу SimpleSAML с таблицей с полученными данными от ЕСИА.

xml ответ ЕСИА

Теперь напишем скрипт, который будет обрабатывать данные. Для начала добавим кнопку для авторизации на сайт.


//в аттрибуте action указываем путь к файлу с будущим обработчиком данных
<form action="inc/esia.php" method="POST">
	<input name="esia" type="submit" value="Войти через Госуслуги"/>
</form>

Обработчик inc/esia.php. Тут мы получаем данные и можем записать их в базу, добавить в сессию и т.д. Вообще надо правильно парсить xml. Сейчас просто выведем данные на экран.

if (isset($_POST['esia'])){
//Настраиваем путь до simplesamlphp/lib/_autoload.php
	require_once('../../simplesamlphp/lib/_autoload.php');
	$as = new SimpleSAML_Auth_Simple('esia');
	$as->requireAuth();
	$attributes = $as->getAttributes();
	foreach($attributes as $key => $value) {
		echo ($key . ' ' . $value . '<br/>');
	}
}

Отправка заявки на подключение ИС к продуктивной среде ЕСИА

Теперь формируем заявку по форме «М» Регламента информационного взаимодействия Участников с Оператором ЕСИА. Она не сильно отличается от формы Е, но внимательно изучите форму, необходимо в форме добавить запрашиваемые данные и уже не надо прикреплять файл сертификата.

В файлах simplesamlphp/config/authsources.php, simplesamlphp/metadata/saml20-idp-remote.php необходимо заменить idp поставщика услуг с Тестовой среды на продуктивную:


//idp поставщика услуг для тестовой среды
//	'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth',
//необходимо заменить на idp поставщика услуг для продуктивной среды
	'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth',

Теперь формируем новый файл метаданных, по факту меняются только ссылки в полях Service

По адресу esia@minsvyaz.ru отправляем письмо и прикрепляем 2 файла:

  • Новый файл метаданных
  • Заявку по форме М

Теперь вы должны получить ответ со статусом «Решен», после этого можете вводить функцию входа через ЕСИА в эксплуатацию.

На момент написания статьи актуальная версии Регламента — 2.7. При обновлении регламента возможны некоторые изменения во взаимодействии ИС с ЕСИА.

Автор: denjoy

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js