Используйте в клиентских выражениях DB2 доверительный контекст

Большая безопасность в многоярусных окружениях для приложений DB2 CLI, XA и JDBC

Научитесь внедрять доверительный контекст в DB2 ® в командной строке интерфейса (CLI), XA или Java ™ Database Connectivity, базируемых на JDBC. Использование доверительного контекста в приложении может увеличить безопасность посредством ответственности на среднем ярусе, уменьшением числа предоставленных прав доступа и проверкой действий конечного пользователя.

Саманта Трэн, конструктор-разработчик безопасности программного обеспечения, IBM

Саманта Трэн (Samantha Tran) работает в IBM последние два года, и приняла участие в разработке доверительного контекста свойств безопасности для DB2 для Linux, UNIX и клиентской поддержки Windows CLI. Она недавно начала работу над свойствами безопасности для динамического сервера IBM Informix Dynamic Server.



Маной Мохан, конструктор-разработчик безопасности программного обеспечения, IBM

Маной Мохан (Manoj Mohan) работал разработчиком в команде IBM-IDS пять лет. У него есть опыт проектирования и внедрения съемного модуля аутентифиации (Pluggable Authentication Module) и IP V6 поддержки в IDS сервер. Также у него есть опыт проектирования и внедрения поддержки доверительного контекста в DB2 для Linux, UNIX и Windows.



01.12.2006

Введение

В трехъярусной модели приложения, где средний ярус (например, сервер приложений WebSphere Application Server или Domino) отвечает за аутентификацию пользователей, работающих с клиентскими приложениями и управлением соединением с сервером базы данных. ID авторизация среднего яруса должна обладать всеми привилегиями, присущими конечному пользователю, чтобы выполнять операции, необходимые конечным пользователям. Трехъярусная модель имеет много преимуществ, все связи с сервером базы данных (такие как запрос пользователя) осуществляются под контролем авторизации ID средним ярусом, что повышает проблемы безопасности, такие как (также смотрите рисунок 1):

  • Снижение распознаваемости пользователей: некоторые предметные области хотят распознавать всех пользователей, пользующихся базой данных в контрольных целях.
  • Сниженная ответственность пользователей: идентифицируемость посредством проверки действий - основной принцип безопасности базы данных. База данных должна быть способна различать действия среднего яруса для собственных целей, и действия от лица других пользователей.
  • Чрезмерное количество прав доступа: ID авторизация среднего яруса должна обладать всеми правами доступа, необходимыми для выполнения всех запросов пользователей. Элемент безопасности разрешает пользователям иметь доступ к определенной информации.
  • Ослабленная безопасность: Вдобавок к чрезмерному количеству прав доступа, этот принцип предусматривает, что авторизация ID, используемая для соединения средним ярусом должна иметь все права доступа к ресурсам, которые запрашиваются пользователями. Если авторизация среднего яруса будет различная, все ресурсы останутся незащищенными.
Рисунок 1. Трехъярусная модель приложения
Трехъярусная модель приложения

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

Необходим более совершенный принцип для подтверждения того, что распознаваемость реального пользователя и права доступа базы данных используются для запросов базы данных, осуществляемых средним ярусом от имени этого пользователя. Для увеличения производительности выбранный принцип должен позволить среднему ярусу использовать одно и то же физическое соединение без повторной аутентификации пользователя на сервере базы данных. В этом и заключается идея доверительного соединения.

Используйте доверительную связь

Чтобы установить доверительную связь, нужно создать в DB2 новый объект с именем trusted context (доверительный контекст), чтобы создать надежные взаимоотношения между DB2 и внешним элементом, таким как промежуточное программное обеспечение. Определение trusted context (доверительного контекста) включает определение критериев для специального соединения с использованием доверительного контекста, то есть доверительного соединения.

В случае установки доверительного соединения оценивается перечень атрибутов надежности, чтобы определить доверительный контекст. Взаимосвязь между соединением и доверительным контекстом устанавливается во время соединения с сервером и продолжается в течение всего времени соединения. После установки доверительного соединения, соединение может использоваться для разных имен авторизации посредством того, что средний ярус специфицирует имя нового пользователя, возможно даже без его аудентификации. (См. рисунок 2.)

Рисунок 2. Трехъярусная модель приложения с доверительным контекстом
Трехъярусная модель приложения с доверительным контекстом

Определение доверительного контекста

Доверительная связь - это новый объект, который основан на системе авторизации имен и одном, или нескольких атрибутах надежности установок соединения. Каждую доверительную связь основано на системе авторизации имен и одном или нескольких атрибутах надежности установок соединения, где каждая установка соответствует, как минимум, одному атрибуту надежности соединения:

  • Система авторизации имен: Первостепенным атрибутом надежности является авторизация имени, используемая для соединения. Всегда существует соответствие между системой авторизации имени, используемой для соединения, и специфическим доверительным контекстом.
  • Атрибуты надежности соединения: Установка атрибутов надежности соединения определяет критерии признания соединения доверительным, то есть основанном на доверительном контексте. Соединение должно соответствовать всем критериям для признания соединения доверительным, то есть основанном на доверительном контексте.
    • PROTOCOL (Протокол): Атрибут надежности протокола общения. Используется, чтобы определить, какой сетевой протокол общения может использовать доверительный контекст.
    • ADDRESS (Адрес): Атрибут надежности сетевого адреса. Используется наряду с атрибутом протокола, чтобы определить, какие адреса могут использоваться с доверительным контекстом. Это web-адрес реального клиента, или имя домена, используемое для общения с менеджером базы данных.
    • ENCRYPTION (Кодировка): атрибут надежности сетевой кодировки. Определяет для соединения минимальный уровень кодировки данных.
    • AUTHENTICATION (Аутентификация): Атрибут надежности аутентификации. Атрибут определяет уровень аутентификации, требуемый системой авторизации имен при установке соединения.

Примите во внимание, что администратор требует, чтобы связь была доверительной при условии, что система авторизации имени NEWTON и TCP/IP адрес - 9.26.146.201. Администратор может определить этот доверительный контекст посредством таких действий:

Пример 1. Пример определения доверительного контекста
CREATE TRUSTED CONTEXT ctxName1
BASED UPON CONNECTION USING SYSTEM AUTHID newton
ATTRIBUTES ( PROTOCOL 'TCPIP',
             ADDRESS '9.26.146.201',
             ENCRYPTION 'NONE' )
ENABLE
ALLOW USER zurbie

Если соединение установлено с использованием TCP/IP из адреса 9.26.146.201 с авторизацией имени NEWTON, согласовываются атрибуты соединения, формулируется доверительный контекст ctxName1, а кодировка не учитывается.

Администратор может удалять и изменять доверительный контекст объекта, используя операторы ALTER TRUSTED CONTEXT (изменить доверительный контекст) и DROP TRUSTED CONTEXT (удалить доверительный контекст).


Доверительная связь в CLI приложении

Выверенная связь может быть установлена и коммутирована для другого пользователя с использованием следующих действий:

  • Соединение SQLConnect API для CLI приложений
  • Атрибуты установки и получения соединения: SQLSetConnectAttr, SQLGetConnectAttr API - для CLI приложений

Для установки соединения SQLSetConnectAttr API в CLI приложениях представлены следующие атрибуты:

  • Атрибут использования доверительного контекста SQL_ATTR_USE_TRUSTED_CONTEXT: Величина показывающая требует ли клиент доверительного соединения. Эта величина может быть специфицирована перед установкой соединения либо после его окончания.
  • Атрибут доверительного контекста имени пользователя SQL_ATTR_TRUSTED_CONTEXT_USERID: Строчная величина, определяющая имя пользователя, которое будет использоваться в текущем доверительном соединении.
  • Атрибут доверительного контекста пароля SQL_ATTR_TRUSTED_CONTEXT_PASSWORD: Строчная величина, определяющая пароль, который может быть установлен приложением в целях аутентификации. Этот атрибут не будет оказывать какого-либо влияния до установки атрибута доверительного контекста имени пользователя SQL_ATTR_TRUSTED_CONTEXT_USERID.

Пример, приведенный ниже, показывает, как установить доверительное соединение для пользователя с именем "newton", чтобы протестировать базу данных в СLI приложении. Перед установкой доверительного соединения приложение должно установить атрибут SQL_ATTR_USE_TRUSTED_CONTEXT, используя SQLSetConnectAttr API. После установки атрибута доверительное соединение может быть установлено с использованием SQLConnect API. После установки соединения приложение может выбрать пользователя, заданного в доверительном контексте. В этом примере приложение включает соединение для пользователя с именем "zurbie" посредством установки атрибута SQL_ATTR_TRUSTED_CONTEXT_USERID.

Пример 2. Использование доверительного соединения в CLI программах
  int main(int argc, char *argv[])
{
  int rc = 0;
  SQLHANDLE henv; /* дескриптор окружения */
  SQLHANDLE hdbc; /* дескриптор соединения  */

  printf("\nTHIS SAMPLE SHOWS");
  printf("HOW TO CONNECT TO AND DISCONNECT FROM A DATABASE.\n");

  /* размещает дескриптор окружения  */
  SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

  /* размещает дескриптор соединения базы данных */
  SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);

  /* устанавливает атрибут доступа выверенного контекста  */
  SQLSetConnectAttr(hdbc1, 
                    SQL_ATTR_USE_TRUSTED_CONTEXT, 
                    SQL_TRUE,
                    SQL_IS_INTEGER);
  
  /* Устанавливает выверенное соединение, 
  чтобы протестировать базу данных и SQLConnect() */
  /* для пользователя newtown                                            */
  SQLConnect( hdbc1, "testdb", SQL_NTS, "newton", SQL_NTS, "xxxxx", SQL_NTS );

  
 // Выполняет некоторые действия: создание объектов, вставка данных и т.д. 
 // Все работы выполняются пользователем newton

  /* Переключите пользователя в выверенном соединении с newton на zurbie  */
  SQLSetConnectAttr( hdbc1, 
	           SQL_ATTR_TRUSTED_CONTEXT_USERID, 
	           "zurbie",
                     SQL_IS_POINTER );
  SQLSetConnectAttr( hdbc1, 
	           SQL_ATTR_TRUSTED_CONTEXT_PASSWORD, 
	           "xxxxx",
	           SQL_NTS );

  /* Выполняет действия для пользователя с именем zurbie */

  /* Отключение от testdb */
  SQLDisconnect( hdbc1 );

  SQLFreeHandle( SQL_HANDLE_DBC, hdbc1 );

  /* освобождает дескриптор окружения */
  SQLFreeHandle( SQL_HANDLE_ENV, henv );

  return 0;
} /* main */

Доверительная связь в XA приложении

Прикладная программа может использовать доверительное соединение в распределенных транзакциях. Процесс XA распределенного приложения запускает сервер приложений по операциям. В каждой операции сервера приложений соединение может быть установлено с использованием XA API (xa_open). Этот раздел описывает конфигурации окружения для запуска в этом окружении DB2 CLI приложений с доверительным контекстом.

Доверительное соединение может быть установлено, и переключатся для других пользователей посредством:

  • Установка параметра TCTX в строке правда(true) или ложь(fals) xa_open показывает, вошел ли клиент в режиме доверительного контекста.
  • Затем, приложение должно вызвать SQLConnect(), чтобы привязать открытые соединения Управления транзакциями (Тransaction Manager(TM)) к дескриптору соединения CLI/Open Database Connectivity (ODBC). Приложение может специфицировать имя и пароль пользователя в строке SQLConnect.
  • Впоследствии, приложение может вызвать xa_start, чтобы переслать имя транзакции ID (XID) в Менеджер ресурсов (Resource Manager (RM)), для того чтобы связать поток вызова с транзакцией.
  • Чтобы подключить пользователя к доверительному соединению, приложение должно сначала вызвать xa_end (TM_SUCCESS) и специфицировать имя нового пользователя и факультативный пароль, вызвав SQLSetConnectAttr.

Этот пример показывает, как разблокировать доверительный контекст и подключить имя пользователя к XA окружению приложения. Приложение должно вызвать xa_open с параметром "true"(правда) TCTX=TRUE, чтобы установить доверительное соединение с сервером базы данных. После установки доверительного соединения с использованием SQLConnect string, приложение может подключить имя пользователя, вызвав SQLSetConnectAttr и установив SQL_ATTR_TRUSTED_CONTEXT_USERID newton. Когда приложение вызовет xa_start, чтобы запустить транзакцию, работа быдет выполняться под доверительным именем пользователя newton. Запуск xa_close выключит базовое доверительное соединение. Даже если CLI дескриптор все еще существует, он не является более доверительным соединением, которое было создано с помощью XA сode вовремя выполнения xa_open. xa_close отключило доверительный контекст, так что любые соединения, установленные CLI, которые не используют XA, не являются доверительными.

Пример 3. Использование доверительного соединения в XA приложении
#---------------------------------------------------------------------------
#-- db2cli пример 
#-- Протестируйте XA при помощи выверенного контекста в соединении 
#---------------------------------------------------------------------------

#-- Разместите дескриптор окружения 
sqlallocenv 1

#-- Установите выверенный контекст, систему автоматизации имени и пароля 
xaopen 10 "DB=stlec1,sreg=t,SPM=domino,TCTX=
TRUE,uid=zurbie,PWD=xxxxxxxx" TMNOFLAGS

#-- Разместите дескриптор окружения 
sqlallocconnect 1 1
sqlconnect 1 stlec1 -3 zurbie -3 xxxxxxxx -3

#-- Присвойте пользователю имя newton и введите пароль 
sqlsetconnectattr 1 SQL_ATTR_TRUSTED_CONTEXT_USERID newton
sqlsetconnectattr 1 SQL_ATTR_TRUSTED_CONTEXT_PASSWORD yyyyy

#-- Запустите транзакцию 
#-- This will switch the user to newton
xastart 10 99 gtrid bqual TMNOFLAGS

sqlgetconnectattr 1 SQL_ATTR_USE_TRUSTED_CONTEXT

#-- Разместите дескриптор оператора и выполните какое-то действие 
sqlallocstmt 1 1

sqlexecdirect 1 "create table temp (int1 int)" -3

sqlexecdirect 1 "insert into temp values ( -99 )" -3

sqlexecdirect 1 "select * from temp" -3
fetchall 1
sqlclosecursor 1

sqlexecdirect 1 "delete from temp where int1 < 0" -3

sqlfreestmt 1 SQL_DROP

#-- Выполните транзакцию, используя 2PC
xaend 10 99 gtrid bqual TMSUCCESS
xaprepare 10 99 gtrid bqual TMNOFLAGS
xacommit 10 99 gtrid bqual TMNOFLAGS

#-- Отсоединитесь и освободите дескриптор соединения 
sqldisconnect 1
sqlfreeconnect 1

xaclose 10 TMNOFLAGS

#-- Освободите дескриптор окружения 
sqlfreeenv 1

Доверительное соединение в JDBC приложении

IBM DB2 драйвер для JDBC и SQLJ предоставляет методы, которые позволят вам установить и использовать доверительные соединения в Java программах. Чтобы избежать нарушения безопасности, сервер приложений, использующий доверительные методы, не использует методы не доверительного соединения.

Класс источника данных организации соединения (DB2ConnectionPoolDataSource) предоставляет некоторые версии методов доверительного соединения DB2TrustedPooledConnection, а класс источника данных ХА (DB2XADataSource) предоставляет некоторые версии метода соединения DB2XAConnection , которые позволяют серверу приложений установить начальное доверительное соединение. Вы выбираете метод, который основан на свойствах вашего типа соединения, и также использует безопасность Kerberos. Когда сервер приложений вызывает один из методов, драйвер IBM DB2 для JDBC и SQLJ возвращает массив объекта[] из двух элементов:

  • Первый элемент содержит копию начального соединения.
  • Второй элемент содержит уникальный пароль для соединения. Пароль генерируется драйвером JDBC и используется для аутентификации во время последующих соединений.

Класс соединения DB2PooledConnection предоставляет некоторые версии метода соединения DB2Connection, а класс DB2Connection предоставляет некоторые версии метода повторного использования DB2Connection, которое позволяет серверу приложений использовать повторно существующее доверительное соединение от имени нового пользователя. Сервер приложений использует этот метод, чтобы привести в соответствие к новому пользователю существующие установки:

  • Пароль для начального соединения.
  • Новые свойства соединения для повторного пользования соединением.

JDBC драйвер проверяет, соответствует ли введенный пароль ранее заданному паролю доверительного соединения, чтобы удостовериться, что запрошенное соединение совпадает с доверительным соединением сервера приложений. Если пароли совпадут, то соединение станет доступным для непосредственного пользования новым пользователем, правда с новыми свойствами.

Пример 4. Использование доверительного соединения в JDBC приложениях
 #---------------------------------------------------------------------------
#-- JDBC пример
#-- Протестируйте доверительный контекст соединения
#---------------------------------------------------------------------------

/* Первый элемент, взятый из предыдущего  */ 
getTrustedPooledConnection

/*  Вызов - это объект связи. Приведите его к форме объекта соединения */
javax.sql.PooledConnection pooledCon = (javax.sql.PooledConnection)objects[0];
properties = new java.util.Properties();

// Установите новые свойства для повторного использования объекта
// properties.put("property", "value");
// Второй элемент, взятый из предыдущего 
getTrustedPooledConnection

/*  Вызов - это пароль соединения. Приведите его к форме байтового массива. */
byte[] cookie = ((byte[])(objects[1]);

/* Введите имя пользователя для нового соединения.  */
String newuser = "newuser";

// Введите сервис построения отображений для отображения рабочей станции пользователя 
// ID to a z/OS RACF ID
String userRegistry = "registry";

/* /* Не вводите данные маркера безопасности, чтобы его нельзя было отследить. */
byte[] userSecTkn = null;

/* Не вводите имя предыдущего пользователя. */
String originalUser = null;

// Вызовите getDB2Connection,  чтобы обновить объект соединения
// user.java.sql.Connection con = ((com.ibm.db2.jcc.
DB2PooledConnection)pooledCon).
getDB2Connection(cookie,newuser,password,
userRegistry,userSecTkn,originalUser,properties);

Заключение

В мире электронной торговли многие приложения полагаются на аспекты безопасности серверов промежуточного программного обеспечения, таких как Domino и WebSphere Application Server, но доверительный контекст - идеальный метод улучшения безопасности окружения для таких приложений во избежание неполадок. Атрибуты безопасности доверительного контекста могут быть приспособлены для обеспечения безопасности доступа к серверам баз данных. Более того, возможность переключать пользователей с минимальными затратами и без аутентификации делает доверительный контекст идеальным для деловых приложений.

Ресурсы

Научиться

Получить продукты и технологии

  • Загрузите бесплатную пробную версию DB2 Enterprise 9 .
  • Теперь вы можете использовать DB2 бесплатно. Загрузите DB2 Express-C , бесплатную версию дополнения DB2 Express Edition, которая обладает всеми свойствами обработки данных и представляет собой базу для построения и инсталляции приложений.
  • Постройте новый проект разработки IBM trial software , доступный прямо из работ разработчиков.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=180922
ArticleTitle=Используйте в клиентских выражениях DB2 доверительный контекст
publish-date=12012006