内容


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

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

Comments
免费下载: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 中使用可信上下文。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

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