Изучаем реализацию доверительного контекста в Informix

Защищенные соединения с использованием драйверов IBM Informix JDBC, ODBC и ESQL/C

Использование несколькими пользователями с различными правами доступа объединенного подключения к источнику данных может привести к появлению брешей в системе защиты информации. Реализация доверительных соединений и доверительного контекста в сервере IBM® Informix® обеспечивает гибкие возможности повторного использования соединений за счет предоставления контролируемых прав доступа промежуточному уровню трехуровневой модели приложений, а также улучшает управление правами пользователей и повышает производительность системы без снижения уровня защиты базы данных. В данной статье обсуждается реализация доверительных соединений и доверительного контекста в Informix и демонстрируются возможности управления доверительным контекстом при использовании драйверов JDBC, ESQL/C и ODBC.

Мамта Шарма, инженер-программист, IBM

Author photo of Mamta SharmaМамта Шарма работает инженером-программистом в IBM India Software Lab. Ее основными задачами является поддержка существующего и разработка нового функционала в Informix JDBC.



Тапан Кумар Гхош, штатный инженер-программист, IBM

Photo of author Tapan GhoshТапан Кумар Гхош работает в IBM India Lab в Бангалоре. В ИТ-отрасли Тапан уже более 9 лет; в настоящее время он занимает позицию ведущего инженера IBM Informix CSDK (Client Software Development Kit) в India Software Lab.



Коллол Кумар Мисра, старший инженер-программист, IBM

Photo of author Kollol MisraКоллол Кумар Мисра (Kollol Kumar Misra) работает в индийской лаборатории IBM в Бангалоре. Коллол имеет более чем семилетний опыт работы в области ИТ. В настоящее время Коллол занимает должность ведущего инженера по разработке набора инструментальных средств IBM Informix CSDK (Client Software Development Kit) в Индийской лаборатории программного обеспечения (India Software Lab).



28.12.2012

Введение

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

Чтобы обеспечить уникальность каждой цепочки взаимодействий между сервером промежуточного ПО и сервером базы данных, в Informix реализована концепция доверительных соединений с базой данных (trusted database connection). Доверительный контекст (trusted context)— это объект безопасности базы данных, который создается на стороне сервера базы данных и определяет свойства доверительного соединения с базой. Доверительное соединение устанавливается при условии совпадения атрибутов соединения с атрибутами уникального доверительного контекста, определенного на стороне сервера Informix. После установления доверительного соединения между сервером промежуточного ПО и сервером базы данных то же самое физическое соединение может использоваться повторно без дополнительной аутентификации конечного пользователя на сервере базы данных.

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

Управление доверительным контекстом с помощью драйверов клиента Informix

В этом разделе мы расскажем о том, как создать, изменить или удалить доверительный контекст. Для создания доверительного контекста и управления им приложение должно установить TCP/IP соединение с сервером Informix. Поддержка доверительных соединений реализована в следующих драйверах клиента Informix (соответствующие API будут рассмотрены ниже):

  • Драйвер IBM Informix JDBC
  • Драйвер IBM Informix ODBC
  • Драйвер IBM Informix ESQL/C

Установление доверительного соединения

Установление доверительного соединения с использованием драйвера JDBC

Для установления доверительного соединения для JDBC-приложения укажите свойство TRUSTED_CONTEXT = TRUE; в URL базы данных (см. листинг 1).

Листинг 1. Установление доверительного соединения с использованием драйвера JDBC
  jdbc:informix-sqli://hostname:portnumber/database_name:INFORMIXSERVER = server_name;
  TRUSTED_CONTEXT = TRUE;

Установление доверительного соединения с использованием драйвера ODBC

Ниже приведены два способа установления доверительного соединения с использованием ODBC (пример конкретного подключения приведен в листинге 2).

Подключение с использованием API SQLSetConnectAttr() API:
SQLSetConnectAttr(hdbc1,SQL_ATTR_USE_TRUSTED_CONTEXT,SQL_TRUE,SQL_IS_INTEGER));

Подключение с использованием дополнительного параметра строки подключения:
TRUSTEDCONTEXT=1; or TCTX=1;

Листинг 2. Пример строки подключения при использовании драйвера ODBC
  "Server=ol_informix_1170;Host=9.124.123.54;Service=ol_informix_1170;Protocol=onsoctcp;
  Database=stores7;TRUSTEDCONTEXT=1;"

Установление доверительного соединения с использованием драйвера ESQL/C

При использовании драйвера ESQL/C для установления доверительного соединения в строке соединения наряду с именем и паролем пользователя необходимо указать ключевое слово TRUSTED (см. листинг 3).

Листинг 3. Установление доверительного соединения с использованием драйвера ESQL/C
  EXEC SQL CONNECT TO 'database_name' USER 'informix' USING :infx_passwd TRUSTED;

Создание доверительного контекста

Объект доверительного контекста создается администратором безопасности (SECADM).

В листингах 4-7 приведены команды создания доверительного контекста с использованием драйверов JDBC, ODBC и ESQL/C соответственно. В каждом примере для конкретного подключения создается доверительный контекст TCX1, который разрешает повторное использование доверительного соединения двум разным пользователям. В случае, если доверительное соединение используется пользователем с идентификатором Joe, повторная аутентификация не требуется. Для пользователя с идентификатором Bob каждая новая попытка использовать доверительное соединение требует повторной аутентификации. Обратите внимание: доверительному контексту по умолчанию присваивается роль Manager. Это означает, что все пользователи, работающие в рамках создаваемого доверительного контекста, наследуют привилегии, соответствующие роли Manager.

Листинг 4. Пример SQL запроса
  CREATE TRUSTED CONTEXT TCX1
  BASED UPON CONNECTION USING SYSTEM AUTHID informix
  DEFAULT ROLE MANAGER
  ENABLE
  ATTRIBUTES (ADDRESS '9.26.113.204')
  WITH USE FOR Joe WITHOUT AUTHENTICATION,
  Bob WITH AUTHENTICATION
Листинг 5. Создание объекта доверительного контекста с использованием драйвера Informix JDBC
  public void createTrustedContext(){
		try {
			stmt = conn.createStatement();
			stmt.executeUpdate("CREATE TRUSTED CONTEXT TCX1 "+
					"USER informix "+
					"DEFAULT ROLE MANAGER "+
					"ENABLE "+
					"ATTRIBUTES (ADDRESS '9.26.113.204') "+
					"WITH USE FOR Joe WITHOUT AUTHENTICATION, "+
					"Bob WITH AUTHENTICATION;"
			);
			System.out.println("Trusted context TCX1 created!");

		}
		catch (SQLException e){

			System.out.println("Trusted context Creation Failed");
		}
	}
Листинг 6. Создание объекта доверительного контекста с использованием драйвера Informix ODBC
  SQLExecDirect( hstmt, "Grant dbsecadm to Joe", SQL_NTS );
  SQLDriverConnect( hdbc, NULL, "dsn=MyDSN;uid=Joe;pwd=Big0data;",
  SQL_NTS,ConnStrOutp, 250, &pcbConnStrOut,SQL_DRIVER_NOPROMPT );
  SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt1 );
  gethostname(strbuf,128);
  addr =  gethostbyname(strbuf);
  sprintf( (char *)strbuf, "CREATE TRUSTED CONTEXT TCX1 BASED UPON CONNECTION"
  	" USING SYSTEM AUTHID informix ATTRIBUTES (ADDRESS '%s')"
  	" WITH USE FOR Joe WITHOUT AUTHENTICATION,Bob WITH AUTHENTICATION ENABLE",
  	inet_ntoa(*((struct in_addr **)addr->h_addr_list)[0]));
  SQLExecDirect( hstmt1, (unsigned char*)strbuf, SQL_NTS );
Листинг 7. Создание объекта доверительного контекста с использованием драйвера Informix ESQL/C
  EXEC SQL BEGIN DECLARE SECTION;
  char   trusted_context[1024];
  char   joe_passwd[20];
  EXEC SQL END DECLARE SECTION;
  
  /* Получаем имя компьютера */
  gethostname(strbuf,128);
  
  /* Получаем IP адрес компьютера */
  addr =  gethostbyname(strbuf);
  strcpy(joe_passwd,"Big0data");
  
  EXEC SQL GRANT DBSECADM TO Joe; 
  EXEC SQL CONNECT TO 'trusted' USER 'Joe' using :joe_passwd; 
  sprintf( (char *)trusted_context, "CREATE TRUSTED CONTEXT TCX1 BASED UPON  CONNECTION"
  	" USING SYSTEM AUTHID informix ATTRIBUTES (ADDRESS '%s')"
  	" WITH USE FOR Joe WITHOUT AUTHENTICATION, Bob WITH AUTHENTICATION ENABLE",
  	inet_ntoa(*((struct in_addr **)addr->h_addr_list)[0]));
  EXEC SQL PREPARE create_ctxt FROM :trusted_context;
  EXEC SQL EXECUTE create_ctxt;

Смена пользователя доверительного соединения

Предположим, что доверительное соединение уже установлено, но еще никак не используется. После установления доверительного соединения приложение может сменить идентификатор пользователя доверительного соединения на идентификатор другого пользователя, разрешенного в доверительном контексте, в рамках которого установлено рассматриваемое соединение. В примере 1 запрос сменить ID пользователя на Joe в рамках доверительного контекста CTX1 без предоставления данных авторизации будет выполнен, поскольку для пользователя Joe в доверительном контексте CTX1 повторной аутентификации не требуется. Запрос сменить ID пользователя на Bob в рамках доверительного контекста CTX1 без предоставления данных авторизации завершится ошибкой, поскольку для пользователя Bob в доверительном контексте CTX1 всегда требуется аутентификация.

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

  • Новый идентификатор пользователя является основным идентификатором пользователя, определенным в объекте доверительного контекста
  • Новый идентификатор пользователя явно указан в качестве идентификатора пользователя доверительного контекста
  • Объект доверительного контекста задан с опцией WITH USE FOR PUBLIC.

При смене ID пользователя само подключение к базе данных сохраняется, однако среда подключения обновляется. Это означает, что такие объекты как временные таблицы или курсоры WITH HOLD, определенные в среде исходного ID пользователя, не сохраняются в новой среде.

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

  • Чтобы сменить текущий ID пользователя на ID, для которого не требуется авторизация, используется предложение SET SESSION AUTHORIZATION без указания пароля пользователя: SET SESSION AUTHORIZATION TO 'user_ID'.
  • Чтобы сменить текущий ID пользователя на ID, для которого требуется авторизация, в предложении SET SESSION AUTHORIZATION необходимо указать пароль пользователя: SET SESSION AUTHORIZATION TO 'user_ID' USING 'user_password'.

При выполнении запроса на смену пользователя объект доверительного контекста, в рамках которого выполняется переключение, должен быть доступен. Как показано в листингах 8— 10 для драйверов JDBC, ODBC и ESQL/C, если объект доверительного контекста, соответствующий используемому доверительному соединению, на момент получения запроса на смену пользователя удален или недоступен, то система закрывает соединение и возвращает сообщение об ошибке с кодом sqlcode -26456.

Листинг 8. Смена пользователя при использовании драйвера Informix JDBC
 public void switchTrustedContext()
	{
		try{
			stmt.executeUpdate("SET SESSION AUTHORIZATION TO 'Joe'");
			System.out.println("Switched user to Joe");
		}
		catch (SQLException e){
    	System.out.println ("Error switching Joe");
		}

	}
Листинг 9. Смена пользователя при использовании драйвера Informix ODBC
  SQLExecDirect( hstmt1, "SET SESSION AUTHORIZATION TO 'Joe'", SQL_NTS );
  Or
  SQLExecDirect( hstmt1, "SET SESSION AUTHORIZATION TO 'Bob' using 'pwd123'", SQL_NTS );

При использовании драйвера ESQL/C параметр username может являться строкой или переменной хоста ESQL/C. Пароль пользователя в любом случае должен быть переменной хоста ESQL/C, содержащей в качестве значения действующий пароль пользователя, имя которого указано в user_ID.

Листинг 10. Смена пользователя при использовании драйвера Informix ESQL/C
  EXEC SQL SET SESSION AUTHORIZATION TO :username;
  Or
  EXEC SQL SET SESSION AUTHORIZATION TO 'Joe';
  Or
  EXEC SQL SET SESSION AUTHORIZATION TO 'Bob' USING :passwd;

Модификация доверительного контекста

Для изменения параметров доверительного контекста на текущем сервере используется предложение ALTER TRUSTED CONTEXT (см. листинг 11).

Листинг 11. Пример SQL-запроса ALTER TRUSTED CONTEXT
  ALTER TRUSTED CONTEXT TCX1 REPLACE USE FOR Bob WITHOUT AUTHENTICATION

Предположим, что доверительный контекст TCX1 уже создан. Воспользуемся оператором ALTER, чтобы отменить требование дополнительной аутентификации для пользователя Bob. Таким образом, оба пользователя доверительного соединения смогут использовать его без дополнительной аутентификации. Конкретные примеры для драйверов JDBC, ODBC и ESQL/C приведены в листингах 12 — 14.

Листинг 12. Модификация объекта доверительного контекста с использованием драйвера Informix JDBC
 public void alterTrustedConnection(){
		try{

			stmt.executeUpdate("ALTER TRUSTED CONTEXT TCX1 " +
					"REPLACE USE FOR Bob WITHOUT AUTHENTICATION"
			);
			System.out.println("Altered TCX1");
		}
		catch (SQLException e)
		{
			System.out.println("Alter Trusted Context Failed");
		}
	}
Листинг 13. Модификация объекта доверительного контекста с использованием драйвера Informix ODBC
  SQLExecDirect( hstmt,
  		"ALTER TRUSTED CONTEXT TCX1 REPLACE USE FOR Bob WITHOUT AUTHENTICATION ",
  		SQL_NTS );
Листинг 14. Модификация объекта доверительного контекста с использованием драйвера Informix ESQL/C
  EXEC SQL ALTER TRUSTED CONTEXT TCX1 REPLACE USE FOR Bob WITHOUT AUTHENTICATION;

Переименование доверительного контекста

Для переименования объекта доверительного контекста используется оператор RENAME TRUSTED CONTEXT. Соответствующие примеры для драйверов JDBC, ODBC и ESQL/C приведены в листингах 15 — 17.

Листинг 15. Переименование объекта доверительного контекста с использованием драйвера Informix JDBC
  public void renameTrustedConnection() {
		try        {
			stmt = conn.createStatement();
			stmt.executeUpdate("RENAME TRUSTED CONTEXT TCX1 TO TCX2");
			System.out.println("Renamed TCX1 to TCX2");

		}
		catch (SQLException e)
		{
			System.out.println("Could not rename the Trusted Context");

		}
	}
Листинг 16. Переименование объекта доверительного контекста с использованием драйвера Informix ODBC
  SQLExecDirect( hstmt,
  		" RENAME TRUSTED CONTEXT TCX1 TO TCX2 ",
  		SQL_NTS );
Листинг 17. Переименование объекта доверительного контекста с использованием драйвера Informix ESQL/C
  EXEC SQL RENAME TRUSTED CONTEXT TCX1 TO TCX2;

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

Для удаления определения доверительного контекста из системного каталога Informix используется оператор DROP TRUSTED CONTEXT. Соответствующие примеры для драйверов JDBC, ODBC и ESQL/C приведены в листингах с 18 по 20.

Листинг 18. Удаление объекта доверительного контекста при использовании драйвера Informix JDBC
public void dropTrustedContext(){
		try
		{
			stmt.executeUpdate("drop trusted context TCX2");
			System.out.println("Trusted Context TCX2 Dropped");
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			System.out.println(e.getMessage());
		}

	}
Листинг 19. Удаление объекта доверительного контекста при использовании драйвера Informix ODBC
  SQLExecDirect( hstmt,
  		" DROP TRUSTED CONTEXT TCX2",
  		SQL_NTS );
Листинг 20. Удаление объекта доверительного контекста при использовании драйвера Informix ESQL/C
  EXEC SQL DROP TRUSTED CONTEXT TCX2;

Заключение

Рассмотрены возможности управления доверительными соединениями с точки зрения использующих эти соединения приложений. В статье приводятся примеры выполнения различных операций с объектом доверительного контекста при использовании драйверов JDBC, ODBC и ESQL/C. В дополнение к примерам, приведенным в статье, вы можете загрузить примеры приложений, демонстрирующие использование доверительного контекста с драйверами JDBC, ODBC и ESQL/C.


Загрузка

ОписаниеИмяРазмер
Пример JDBC-приложенияJDBCDemo.zip2 КБ
Пример ODBC-приложенияODBCDemo.zip2 КБ
Пример ESQL/C-приложенияESQLCDemo.zip2 КБ

Ресурсы

Комментарии

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=853657
ArticleTitle=Изучаем реализацию доверительного контекста в Informix
publish-date=12282012