理解 Informix 中的可信上下文功能

保护与 IBM Informix JDBC、ODBC 和 ESQL/C 驱动程序的连接

为数据源使用连接池可能会导致基于角色的安全性破坏。IBM® Informix® 服务器中对可信连接和可信上下文的支持能够灵活地重用连接,向中间层授予受控的权限,以及在三层应用程序中加强用户责任性而不损害其数据库安全性,所有这些都改善了系统性能。本文将讨论可信连接和可信上下文,展示如何使用 JDBC、ESQL/C 和 ODBC 驱动程序管理可信上下文。

Mamta Sharma, 软件工程师, IBM

Mamta Sharma 的照片Mamta Sharma 在 IBM India Software Lab 担任软件工程师。她积极参与 Informix JDBC 中各种功能的维护和开发。



Tapan Kumar Ghosh, 资深软件工程师, IBM

Tapan Ghosh 的照片Tapan Kumar Ghosh 在位于班加罗尔的 IBM India Lab 工作。Tapan 拥有 9 年多的 IT 从业经验。目前,Tapan 是 India Software Lab 中 IBM Informix CSDK(客户端软件开发工具包)的首席工程师。



Kollol Kumar Misra, 资深软件工程师, IBM

Kollol Misra 的照片Kollol Kumar Misra 在位于班加罗尔的 IBM India Lab 工作。Kollol 拥有 7 年多的 IT 从业经验。目前,Kollol 是印度软件实验室中 IBM Informix CSDK(客户端软件开发工具包)的首席工程师。



2012 年 7 月 16 日

免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

在传统的三层应用程序模型中,您只有在成功授权之后才能与数据库服务器交互,检查和审计由中间层执行。即使有多个用户登录到中间层,中间层服务器也仅使用单个用户 ID 来访问数据库,而且会在所有资源上授予权限。此模型无法获取尝试访问数据库的实际用户身份,以进行访问控制。另外,如果中间层用户 ID 被盗用,可能导致严重的安全威胁。

为了在中间层服务器与数据库服务器之间实现惟一的交互组,Informix 中引入了可信数据库连接 的概念。可信上下文 是在数据库服务器上创建的一种数据库安全对象,它定义了一个可信数据库连接的属性。在连接属性与 Informix 服务器上定义的惟一可信上下文属性匹配时,就会建立可信连接。中间层服务器建立可信连接后,可重用同一个物理连接,而无需在数据库服务器上对最终用户重新进行身份验证。

从应用程序开发人员的角度讲,可信连接的重要性离不开这样一个事实:单个数据库连接可与其他用户共享,同时维护每一个尝试访问数据库的应用程序或用户的 ID。对用户权限的控制有助于适当地授予或限制用户对敏感资源的访问,进而提高系统安全性和用户责任性。

使用 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 中所示。

使用 SQLSetConnectAttr() API:
SQLSetConnectAttr(hdbc1,SQL_ATTR_USE_TRUSTED_CONTEXT,SQL_TRUE,SQL_IS_INTEGER));

使用连接字符串参数:
TRUSTEDCONTEXT=1;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,使可信连接可在两个不同的用户 ID 下重用。当在用户 ID “Joe” 下重用时,不需要身份验证。但是,如果要在用户 ID “Bob” 下重用,则需要身份验证。另请注意,可信上下文有一个名为 “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;
  
  /* Retrieve the host name of computer */
  gethostname(strbuf,128);
  
  /* Retrieve IP address of computer */
  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 的请求,而不用提供身份验证信息,因为用户 Joe 被定义为可信上下文 CTX1 中不需要身份验证的用户。但是,如果不提供身份验证信息,将可信连接上的用户 ID 切换到用户 Bob 的请求就会失败,因为用户 Bob 在可信上下文 CTX1 中被定义为必须提供身份验证信息的用户。

可以在建立可信连接后切换用户 ID,但必须确保至少以下一个陈述是真的。

  • 新用户 ID 是可信上下文对象中定义的主要用户 ID。
  • 新用户 ID 明确定义为可信上下文对象中的用户。
  • 可信上下文对象定义为 WITH USE FOR PUBLIC。

在用户 ID 切换期间,数据库会保持连接,但切换会产生一个新的连接环境。在新环境中将会丢失临时表和 WITH HOLD 游标等对象。

要使用一个客户端驱动程序切换到不同的用户,可在应用程序中使用以下命令。

  • 对于没有身份验证需求的切换请求,可使用没有用户密码的 SET SESSION AUTHORIZATION 语句。SET SESSION AUTHORIZATION TO 'user_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 中,用户名可以是一个字符串或 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 语句(如清单 12 到 14 所示,分别针对 JDBC、ODBC 和 ESQL/C 驱动程序)来将现有用户 Joe 修改为在可信上下文中使用身份验证,添加其他所有用户以在不需要身份验证的情况下使用它。

清单 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 语句(如清单 15 到 17 所示,分别针对 JDBC、ODBC 和 ESQL/C 驱动程序)用于更改可信上下文对象的名称。

清单 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;

丢弃可信上下文

DROP TRUSTED CONTEXT 语句(如清单 18 到 20 所示,分别针对 JDBC、ODBC 和 ESQL/C 驱动程序)用于从 Informix 系统目录删除可信上下文定义。

清单 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.zip2KB
样例 ODBC 演示应用程序ODBCDemo.zip2KB
样例 ESQL/C 演示应用程序ESQLCDemo.zip2KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=825933
ArticleTitle=理解 Informix 中的可信上下文功能
publish-date=07162012