Статьи и публикации

Аутентификация в SAP Business Objects по цифровым сертификатам

Антонов Д.А.

Антонов Д.А.

Руководитель отдела разработки Департамента практики SAP ООО «ЭнергоДата»

Введение

Приобретенная SAP AG компания BusinessObjects значительно расширила набор доступных клиентам решений, особенно в области бизнес-аналитики. Консультанты SAP в процессе проработки стратегии активно продвигают для использования продукты именно линейки BusinessObjects, но в российских условиях заказчики (особенно имеющие отношение к государственному капиталу) зачастую предъявляют набор дополнительных требований к обеспечению информационной безопасности конечной системы. В последнее время набирает популярность применение специализированных персональных аппаратных ключей, поддерживающих российский стандарт криптографии ГОСТ 28147-89. Такой подход обеспечивает максимальный уровень защиты, исключает возможность кражи паролей иначе как вместе с аппаратным ключом и значительно снижает опасность доступа сотрудников к ресурсам предприятия из недоверенных сегментов сети (например, посредством Интернет), так как ключи шифрования и ЭЦП не могут быть перехвачены или скопированы. Идеальным вариантом является использование таких аппаратных ключей в полном цикле – от организации защищенного подключения к корпоративной сети до электронной подписи документов и авторизации конечных пользователей в бизнес-приложениях.

Большинство продуктов SAP поддерживает использование для авторизации сертификатов стандарта Х.509, однако даже при наличии поддержки стандартных сертификатов возникают множественные сложности с применением именно ГОСТ-реализации цифровых сертификатов. Проектной команде компании «ЭнергоДата» была поставлена задача по реализации решения, обеспечивающего авторизацию в продуктах BusinessObjects с применением аппаратных ключей ГОСТ-стандарта. Далее будет детально показан наш ход разрешения проблемы.

Общий подход к решению

После проработки требований ГОСТа был выбран следующий путь – проверять наличие в заголовках HTTP-запроса к системе SAP Business Objects Business Intelligence platform 4.0(далее по тексту – SAP BObj) сертификата X.509 и, в случае наличия такового, передать в систему SAP NetWeaver Business Intelligense 7.0 (далее по тексту – SAP BI) для выполнения дальнейшей аутентификации пользователя по сертификату. По результатам аутентификации в системе SAP BI в системе SAP BObj создается пользовательская сессия на основе данных о ролях и полномочиях пользователя, полученных из SAP BI. В случае отсутствия сертификата производится стандартная аутентификация пользователя в системе SAP BI с использованием пары «логин-пароль». Следует также заметить, что при разработке архитектуры решения одной из предпосылок была абсолютная безопасность соединения непосредственно между инсталляциями серверной части SAP BusinessObjects и SAP BI, так как они фактически расположены в едином защищенном изолированном центре обработки данных.

Расширение функционала SAP BusinessObjects

Модернизируемый продукт SAP BObj в качестве платформы для веб-представления использует распространённый веб-контейнер Apache Tomcat 6.0, а также набор библиотек для авторизации и аутентификации, написанных на языке Java. Соответственно, все изменения на стороне SAP BObj, выполнялись с использованием инструментария Java.

Первым шагом по решению задачи была разработка расширения модуля аутентификации системы SAP BObj. Для изменения поведения стандартного (входящего в поставку) модуля аутентификации произведено расширение класса LogonUtils пакета PlatformServices.jar плагина webpath.PlatformServices. В классе LogonUtils был расширен метод logon() и добавлены два новых метода getX509CertFromRequest() и getBase64String().

public static IEnterpriseSession logon(HttpServletRequest request, String   username, String password, String cms, String authType) 
   throws SDKException
{ 
   ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr(); 
   IEnterpriseLogonInformation logonInfo = ApplicationUtils.createEnterpriseLogonInformation(request, sessionMgr); 
   String authenticationObject = null;
   X509Certificate cert = getX509CertFromRequest(request); 
   if(cert == null) {
      authenticationObject = password; 
   } else {
      String certificateLink = JCOHelper.getX509LinkId(getBase64String(cert)); 
     if(certificateLink == null) { authenticationObject = password; }
     else { authenticationObject = certificateLink; }
   } 
   return ApplicationUtils.logon(request, username, authenticationObject,    cms, CLUSTERS_RESOURCEBUNDLE_NAME, CLUSTERS_PARAMETER_KEY, authType, logonInfo);
} 
private static X509Certificate getX509CertFromRequest(HttpServletRequest request) 
{ 
   X509Certificate certs[] = (X509Certificate[])(X509Certificate[]) 
      request.getAttribute("javax.servlet.request.X509Certificate"); 
   if(certs != null) return certs[0];
   return null;
} 
private static String getBase64String(X509Certificate cert) 
{ 
   String certLikeBase64String = null;
   try {
      certLikeBase64String = Base64Encoder.encode(cert.getEncoded()); 
   } catch (CertificateEncodingException e) {
      e.printStackTrace(); 
   } 
   return certLikeBase64String;
}

Модифицированный класс был помещен в пакет и установлен в систему.

Как видно из приведенного выше кода, для передачи содержимого сертификата, закодированного в формате Base64, используется дополнительный класс JCOHelper.

Основной задачей класса является установка JCo-соединения с системой SAP BW и передача в систему строки сертификата. Код класса приведен ниже.

package com.businessobjects.clientaction.shared.logon;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
public class JCOHelper {
   private static final String DESTINATION_NAME = "JCo_2_BW";
   public static String getX509LinkId(String cert) 
   { 
      if(processPropertiesFile()) {
         try {
            JCoDestination destination =   JCoDestinationManager.getDestination(DESTINATION_NAME); 
            JCoFunction function = destination.getRepository().getFunction("ZJCO_X509_CERT_STORE"); 
            if(function != null) {
               function.getImportParameterList().setValue("I_CERT", cert); 
               function.execute(destination); 
               return (String) function.getExportParameterList().getValue("E_SHA1");
            } 
         } catch (JCoException ex) {
            System.out 
.println("Unable to create JCoFunction. Reason: n" + ex); 
         } 
      } 
      return null;
   } 
   private static boolean processPropertiesFile() {
      Properties connectProperties = new Properties();
      try {
         StringBuilder configFilePath = 
new StringBuilder(System.getenv("CATALINA_HOME"))
.append(System.getProperty("file.separator")) 
.append("config.properties"); 
         connectProperties.load(new FileInputStream(
new File(configFilePath.toString())));
         createDestinationDataFile(DESTINATION_NAME, connectProperties); 
         return true;
      } catch (Exception ex) {
         ex.printStackTrace(); 
      } 
      return false;
   } 
   private static void createDestinationDataFile(String destinationName,  Properties connectProperties) {
      File destCfg = new File(destinationName + ".jcoDestination");
      try {
         FileOutputStream fos = new FileOutputStream(destCfg, false);
         connectProperties.store(fos, "X509 store procedure"); 
         fos.close(); 
      } catch (Exception e) {
         throw new RuntimeException("Unable to create a destination file", e);
      } 
   } 
}

Расширение функционала SAP NetWeaver BI

Для обработки строки сертификата на стороне SAP BI реализован функциональный модуль ZJCO_X509_CERT_STORE, поддерживающий вызовы по протоколу RFC. Код модуля приведен ниже.

FUNCTION ZJCO_X509_CERT_STORE.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(I_CERT) TYPE  STRING
*"  EXPORTING
*"     VALUE(E_SHA1) TYPE  HASH160
*"----------------------------------------------------------------------

  DATA: LV_HASH TYPE HASH160
      , WA_X509_STORE TYPE ZBOBJ_X509_STORE.

  E_SHA1 = ''.

  CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
    EXPORTING
      ALG            = 'SHA1'
      DATA           = I_CERT
    IMPORTING
      HASH           = LV_HASH
    EXCEPTIONS
      UNKNOWN_ALG    = 1
      PARAM_ERROR    = 2
      INTERNAL_ERROR = 3
      OTHERS         = 4.

  IF SY-SUBRC = 0.

    CLEAR: WA_X509_STORE.
    WA_X509_STORE-Z_SHA1 = LV_HASH.
    WA_X509_STORE-Z_X509 = I_CERT.

    MODIFY ZBOBJ_X509_STORE FROM WA_X509_STORE.
    IF SY-SUBRC = 0.
      E_SHA1 = LV_HASH.
    ENDIF.

  ENDIF.

ENDFUNCTION.

Алгоритм модуля вполне очевиден из приведенного кода – в качестве входного параметра модуль получает на вход строку сертификата, далее рассчитывает хэш-сумму сертификата по алгоритму SHA-1 и сохраняет пару значений «хэш-сумма и строка сертификата» в таблице ZBOBJ_X509_STORE (структура таблицы приведена на рисунке ниже). Возвращаемым значением модуля является вычисленная хэш-сумма строки сертификата.

схема работы решения на примере процесса согласования заявки на платеж

Взаимодействие систем

В модифицированной среде аутентификация пользователя производится в два этапа. На первом этапе при получении системой SAP BObj сертификата формата Х.509 создается JCo-соединение между системами SAP BI и SAP BObj. В ходе этого соединения в систему SAP BI передается ГОСТ-сертификат аутентифицируемого пользователя, в ответ на данное сообщение в SAP BObj возвращается хэш-сумма сертификата. Эта сумма в дальнейшем является ключом для извлечения сертификата пользователя из таблицы ZBOBJ_X509_STORE при проведении аутентификации по цифровому сертификату на втором этапе. Возвращаемая хэш-сумма помещается в поле штатного плагина SAP-аутентификации SAP BObj, используемое для передачи пароля пользователя. В случае, если пользователь аутентифицируется в системе SAP BI по логину и паролю (например, когда в HTTP-запросе отсутствует сертификат), в поле пароля стандартным образом передается значение, введенное пользователем в поле «Пароль» на экране входа в систему SAP BObj.

На втором этапе производится собственно аутентификация пользователя. В соответствии с архитектурой доступа пользователя в SAP-системы для аутентификации пользователей используется RFC функциональный модуль SUSR_CHECK_LOGON_DATA, в который также добавлено расширение. Код расширения представлен ниже:

схема работы решения на примере процесса согласования заявки на платеж

Расширение предназначено для обработки ситуации использования сертификата – в случае, если в значении принимаемого параметра «password» находится хэш-сумма, расширение производит поиск строки сертификата в таблице ZBOBJ_X509_STORE. При обнаружении строка сертификата дальнейшая аутентификация производится с использованием ГОСТ-сертификата, в противном случае – стандартным путем по логину и паролю пользователя.

Заключение

В результате выполненных проектной командой доработок конечные пользователи получили возможность авторизации в АРМ на базе SAP BusinessObjects с применением выдаваемых им аппаратных ключей стандарта ГОСТ. Безусловно, представленное решение не покрывает всех возможных вариантов использования и по необходимости может расширяться дополнительными функциями.

Источник: http://sapland.ru/articles/stats/autentiphikatsiya-v-sap-business-objects-po-tsiphrovim-sertiphikatam.html