如今,在线数据激增,当涉及到数据的隐私和安全性时,云中的数据是一个大问题。和以往任何时候相比,现在更有必要尽量减少,甚至消除安全漏洞,让通过线路共享的数据受到更好的保护。Kerberos 是一种网络身份验证协议,旨在为 “客户端-服务器” 应用程序提供强大的身份验证。在这里,我们将重点介绍利用 Kerberos 为使用 IBM Data Server Driver for JDBC and SQLJ、CLI 和 .NET 驱动程序的应用程序提供安全的身份验证。
回页首
Kerberos 是一种网络身份验证协议,旨在为 “客户端-服务器” 应用程序提供一种强大的身份验证手段。
Kerberos 这个词来自 Cerberus,即希腊冥王 Hades 的三只头的看门狗。这种神话生物的三个头被比喻成组成 Kerberos 环境的三个关键实体:
使用 Kerberos,客户端机器可以对服务器证明其身份,即使两者都在不安全的网络上也没问题。不需要在网络上传输用户 ID 和密码,在这里使用的是加密的票据。这些票据由称为 Kerberos 身份验证服务器的实体颁发。
Kerberos 使用两种类型的凭据进行身份验证:票据和鉴别码:
即使客户机和服务器都在不安全网络上,它们也能使用 Kerberos 相互限定对方的身份。
本教程将帮助读者在 Windows 上建立一个 Kerberos 环境,配置 DB2® 服务器,并配置客户端驱动程序,以便使用 Kerberos 验证用户身份。本文全文都会提及 “客户端驱动程序”。其中包括 IBM Data Server Drivers for JDBC and SQLJ (JCC Driver);IBM Data Server Driver for ODBC and CLI (CLI Driver);.NET 驱动程序;名为 CLPPlus 的一种交互式客户端工具,能够执行 SQL 语句、脚本并生成自定义报告。这些客户端驱动程序都打包在 IBM Data Server Driver Package (DS Driver) 中。DS Driver 包中含有用于各种编程语言环境的驱动程序和库。JCC 驱动程序也随 DB2 安装提供。
在下面的图 1 示出了端到端 Kerberos 身份验证技术,以及如何结合使用多个组件。
Kerberos 协议与 DB2、DB2 Connect 驱动程序(JCC、CLI、CLPPlus 工具)流程
点击查看大图
关闭 [x]
上面所示的 Kerberos 协议流程如下:
回页首
配置 Kerberos 将它用于 Windows 上的 IBM Data Server Driver for JDBC and SQLJ
我们的 Kerberos 安装有一个 Windows Active Directory Domain Controller,充当密钥分发中心 (KDC)。为了让 Java™ 识别这个环境,需要在客户端和服务器端进行额外的配置,我们将稍后处理这些配置。
Kerberos KDC 是一个网络服务,它向 Active Directory 域中的用户和计算机提供会话票据和临时会话密钥。KDC 运行域控制器被作为 Active Directory 域服务 (AD DS) 的一部分。因此,在建立 AD DS 时,我们可以利用 Kerberos 的功能对请求访问 DB2 数据库的用户进行身份验证。DB2 数据库可以安装在该域中的任何机器上。在本设置中,我们使用 Windows Server 2008 R2 托管 KDC,而 DB2 服务器安装在 Windows Server 2012 R2 计算机上。
设置 KDC 和 DB2 服务器的前两个步骤对于所有客户端驱动程序都很常见。希望安装特定驱动程序的用户可以跳过下面相应的驱动程序部分。
创建一个 KDC
DB2 总是先查看本地安装,然后再查看域。因此,在安装 DB2 之前,请确保本地用户和域用户没有使用相同的名称(如果您打算创建一个名为 kerbuser
的域用户,请确保本地目录中不存在这个名称的本地用户)。
db2 update dbm cfg
使用身份验证 Kerberos。 回页首
想要查看非 Java 驱动程序设置步骤的读者可以跳到IBM Data Server CLI Driver 设置。
当某个客户端应用程序请求建立连接时,应该使用 TGT 执行此操作。如果没有提供用户 ID /密码,则应检查默认凭据缓存中是否存在 TGT。如果不存在 TGT,则会使用连接字符串中指定的用户 ID 和密码来获得 TGT。
大多数情况下,会在数据库连接之前获得 TGT,而且两者是彼此独立的。通常情况下,通过从命令行发出命令 kinit
,可以得到 TGT。如果连接字符串中提供了用户 ID 和密码,则会假设是 DB2 明确获得了 TGT,从而获得 Kerberos 票据。
如果成功返回 TGT,则会获得一个 Kerberos 5 票据,并将它发送给 DB2 执行身份验证。如果身份验证通过,则会将连接返回给客户端。
在设置 JDBC 驱动程序之前,要解释几个术语:
com.ibm.security.jgss.mech.krb5.Krb5JAASLoginModule
作为要使用的登录模块。 kinit
连接到 DB2 工具的语法如下: java com.ibm.security.krb5.tools.Kinit [-f] [-F] [-p] [-P] [-c cache name] [principal] [password]
不同选项的含义是:
GSS-API 本身并没有提供任何安全性。相反,安全服务商通常以与其安全软件一起安装的库的形式来提供 GSS-API 实现。可以用 GSS-API 包装或加密敏感的应用程序消息,从而提供客户端和服务器之间的安全通信。GSS-API 包装提供的典型保护包括机密性(保密)和完整性(真实性)。GSS-API 还可以为远程用户或远程主机的身份提供本地认证。
primary-name.instance-name@realm-name
。主名称可以是用户的名称、主机或服务的名称。DB2TEST.com 领域中的主体示例是 db2kuser@DB2TEST.com。 需要正确设置一些配置和策略文件,才可以执行 Kerberos 身份验证:
kinit
过程中将会使用此文件。IBM JGSS 需要 Kerberos 配置文件。Kerberos 配置文件的默认名称和位置取决于使用的操作系统。按以下顺序搜索默认的配置文件:
在 Kerberos 配置文件中,用户需要设置领域 domain_realm 和一些特性,比如 default_keytab_name、default_realm、kdc_timeout,等等。
Windows 的示例 krb.ini 文件
-***change this*** means to change this to fit your own setting. [libdefaults] default_keytab_name = c:/ibmjgss/config/krb5kt default_realm = DB2TEST.COM -> change this default_tkt_enctypes = rc4-hmac default_checksum = rsa-md5 kdc_timesync = 0 kdc_default_options = 0x40000010 clockskew = 300 check_delegate = 0 ccache_type = 3 kdc_timeout = 10000000 [realms] DB2TEST.COM= { -> change this kdc = yourmachinewithKDC.db2test.com:88 -> change this } [domain_realm] .db2test.com=DB2TEST.COM -> change this db2test.com=DB2TEST.COM -> change this
/jre/lib/security/java.security
中将该文件指定为 Java 属性 java.security.auth.login.config
的值,或者将它指定为属性 login.config.url.
的值。将 java_home/jre/lib/security/java.security
修改如下: 示例 jaas.conf 文件内容
JaasClient{ com.ibm.security.auth.module.Krb5LoginModule optional debug=true useDefaultCcache=false; };
使用以下语法在 java.security 文件中配置 jaas.conf
: login.config.url.1=file:D:/Kerberos/jaas.conf
(使用 / 而不是 /)。
security.provider.1=com.ibm.crypto.provider.IBMJCE
。 security.provider.2=com.ibm.security.jgss.IBMJGSSProvider
。 KerberosServerPrincipal:例如, user@DB2TEST.com
(DB2TEST.com) 是域名,用您刚刚创建的域替换它)
SecurityMechanism:例如, com.ibm.db2.jcc.DB2BaseDataSource.KERBEROS_SECURITY
(值是 11)
示例代码
DriverManager interface: java.util.Properties properties = new java.util.Properties(); properties.put("user", USER); properties.put("password", PASSWORD); properties.put("securityMechanism", new String("11"));//11 is the integer value for kerberos properties.put("KerberosServerPrincipal", "sample/machinename.db2test.com@DB2TEST.COM"); Class.forName("com.ibm.db2.jcc.DB2Driver"); String url = "jdbc:db2://serverName/STLEC1"; Connection con = DriverManager.getConnection(url, properties); Datasource interface:c com.ibm.db2.jcc.DB2SimpleDataSource dataSource = new com.ibm.db2.jcc.DB2SimpleDataSource(); dataSource.setDatabaseName ("STLEC1"); dataSource.setServerName (serverName); dataSource.setDriverType (4); dataSource.setPortNumber (50000); dataSource.setSecurityMechanism(11); //11 is for kerberos dataSource.setKerberosServerPrincipal("sample/machinename.db2test.com@DB2TEST.COM"); Connection con = dataSource.getConnection (USER ,PASSWORD);
kinit
流程,在该流程中,应用程序不必提供用户名和密码。用户主体在凭据缓存中保存其 Kerberos 凭据。用户凭据缓存的位置顺序如下:
设置您的应用程序在访问 DB2 数据库时引用的数据源。对于没有用户名和密码的身份验证{使用票据},您只需要:
在本例中,您必须使用缓存,并使用 kinit
填充它。您不必在 java.security
文件中使用 jaas.conf
。
执行以下命令,启动 kinit:
db2kuser@DB2TEST.com 的密码:
输入密码,您会看到类似这样的一条消息:
一旦不再需要它,则转至位置 'C:/Users/db2kuser/krb5cc_db2kuser,并删除所生成的缓存。
没有用户名和密码的 DB2 连接的示例代码:
DriverManager interface: java.util.Properties properties = new java.util.Properties(); properties.put("securityMechanism", new String("11")); //11 is the integer value for kerberos properties.put("KerberosServerPrincipal", "machinename.db2test.com@DB2TEST.COM"); //the name DB2 registers with KDC. Class.forName("com.ibm.db2.jcc.DB2Driver"); String url = "jdbc:db2://HOSTNAME/STLEC1"; Connection con = DriverManager.getConnection(url, properties); Datasource interface: com.ibm.db2.jcc.DB2SimpleDataSource dataSource = new com.ibm.db2.jcc.DB2SimpleDataSource(); dataSource.setDatabaseName ("DBNAME; dataSource.setServerName (HOSTNAME); dataSource.setDriverType (4); dataSource.setPortNumber (50000); dataSource.setSecurityMechanism(11); //11 is for kerberos dataSource.setKerberosServerPrincipal("machinename.db2test.com@DB2TEST.COM""); //the name DB2 registers with KDC. Connection con = dataSource.getConnection ();
securityMechanism
和 KerberosServerPrincipal
属性性,并使用委托凭据来设置 GSSCredential。 使用委托凭据连接的示例代码
DriverManager interface: java.util.Properties properties = new java.util.Properties(); properties.put("securityMechanism", new String("11"));//11 is the integer value for kerberos properties.put("KerberosServerPrincipal", KerberosServerPrincipalName); DB2Configuration.setGSSCredential(delegatedCredential); Class.forName("com.ibm.db2.jcc.DB2Driver"); String url = "jdbc:db2://machineName/DBName"; Connection con = DriverManager.getConnection(url, properties); Datasource interface: com.ibm.db2.jcc.DB2SimpleDataSource dataSource = new com.ibm.db2.jcc.DB2SimpleDataSource(); dataSource.setDatabaseName (DBName); dataSource.setServerName (ServerName); dataSource.setDriverType (4); dataSource.setPortNumber (50000); dataSource.setSecurityMechanism(11); //11 is for kerberos dataSource.setKerberosServerPrincipal(KerberosServerPrincipalNam); DB2Configuration.setGSSCredential(delegatedCredential); Connection con = dataSource.getConnection (username, password);
-clplus
。 conn
并单击 Enter 。 db2kuser@DB2TEST.com
。 machineName.domainName
,在我们的示例中,主机名是 xxxmachine.db2test.com。 如果返回一个 SQL 提示,那么我们已成功使用 Kerberos 连接到数据库。
回页首
设置 IBM Data Server Driver for ODBC and CLI (CLI Driver)、.NET 驱动程序和 DB2 CLPlus
要集合使用 CLI 驱动程序与 Kerberos,需要修改 db2cli.ini 文件。
在 CLI 中,用户名要指定完全限定域名用户,否则 DB2 会在 localSystem 中寻找用户,而且会失败,提示 "Local System Authority can't be located" 错误:
sqldriverconnect 1 0 "Authentication=KERBEROS;database=testKerb;hostname=9.xx.xx.xx;port=50000;uid=db2kuser@DB2TEST.COM;pwd=******;protocol=tcpip;" -3 235 SQL_DRIVER_NOPROMPT
示例 db2cli.ini 文件
; Comment lines start with a semi-colon. [tstcli1x] uid=userid pwd=password autocommit=0 TableType="'TABLE','VIEW','SYSTEM TABLE'" [tstcli2x] ; Assuming dbalias2 is a database in DB2 for MVS. SchemaList="'OWNER1','OWNER2',CURRENT SQLID" [MyVeryLongDBALIASName] dbalias=dbalias3 SysSchema=MYSCHEMA [Common] TargetPrincipal =HOST/machineName.domainname@DOMAINNAME trace=1 tracefilename=traceFileName
在 db2dsdriver.cfg
中的 Kerberos 参数必须设置为 testconn40
才可以获得成功。
示例 db2dsdriver.cfg 文件
<configuration> <dsncollection> <dsn alias="S" name="test1" host="9.xx.xx.xx" port="50000"> </dsn> </dsncollection> <databases> <database name="test1" host="9.184.112.161" port="50000"> <parameter name="UserID" value="db2kuser"/> </database> </databases> <parameters> <parameter name="Authentication" value="KERBEROS"/> </parameters> </configuration>
示例 testconn40 输出
C:/ProgramData/IBM/DB2/DB2COPY1/cfg>testconn40 Database=test1 Step 1:Printing version info .NET Framework version:4.0.30319.33440 64-bit DB2 .NET provider version:9.7.4.4 DB2 .NET file version:10.5.4.4 Capability bits:ALLDEFINED Build: s140325 Factory for invariant name IBM.Data.DB2 verified Elapsed:0.2500056 Step 2:DB2DSDRIVER_CFG_PATH env var: unset Validating db2dsdriver.cfg against db2dsdriver.xsd schema file C:/ProgramData/IBM/DB2/DB2COPY1/cfg/db2dsdriver.cfg against C:/SQLLIB/cfg/db 2dsdriver.xsd Elapsed:0.0156191 Step 3:Connecting using "Database=test1" Server type and version:DB2/NT64 10.05.0004 Elapsed:5.4218871 Step 4:Selecting rows from SYSIBM.SYSTABLES to validate existence of packages SELECT * FROM SYSIBM.SYSTABLES FETCH FIRST 5 rows only Elapsed:0.5625038 Step 5:Calling GetSchema for tables to validate existence of schema functions Elapsed:1.2500091
回页首
useDefaultCcache=false
。 reuseTGT=true
,而且 JAAS 重用了目前已过时的票据。从 jaas.conf 文件中删除 reuseTGT=true
。 useTicketCache=true
,Java 会尝试从 Windows Local Security Authority (LSA) 获得凭据缓存 (ccache)。如果没有 ccache,那么 Java 会尝试 Kerberos 登录。在应用程序中提供用户名和密码,然后再试一次。 ;
) 的位置。 Password length, 0, is not allowed.ERRORCODE=-4461, SQLSTATE=42815
。使用空密码不能创建用户帐号。空密码不符合标准的密码要求,所以 JCC 驱动程序不允许使用空密码 (""),也就是说,不允许使用零长度的密码。 回页首
Kerberos 是身份管理和安全领域中领先的行业标准之一。它是许多网络安全问题的可靠解决方案。本教程展示了如何可以结合使用 DB2 Connect 驱动程序与 Kerberos,实现 DB2 服务器中的安全身份验证。