软件保护思想催生USB Key
基于USB Key的身份认证技术是一种比普通的“用户名+口令”方法更安全,而又比生物特征身份识别技术更低廉的解决日益严峻的身份识别问题的方法。本文介绍了在Linux环境下建立这一身份认证系统的原理和方法。
全球信息安全解决方案提供商赛孚耐信息技术公司(SafeNet Inc.)今年3月底发布了《2004年度全球密码调查报告》,结果显示:50%的员工仍将他们的密码记录下来;超过三分之一的被调查者与别人共享密码;超过80%的员工有3个或更多密码;67%的被调查者用一个密码访问5个或5个以上的程序,另有31%访问9个或更多程序。这是目前密码管理状况堪忧的一个证明。从安全角度考虑,我们很容易理解和接受密码。不过,随着密码应用范围的增多,密码被忘记、丢失、偷听、窃取的几率也在增加。随着企业信息数据的增多和重要性加强,需要更好的技术来保证密码的安全。身份识别目前主要有三种手段:最常见的是使用用户名加口令的方式,当然这也是最原始、最不安全的身份确认方式,非常容易由于外部泄漏等原因或通过口令猜测、线路窃听、重放攻击等手段导致合法用户身份被伪造; 第二种是生物特征识别技术(包括指纹、声音、手迹、虹膜等),该技术以人体惟一的生物特征为依据,具有很好的安全性和有效性,但实现的技术复杂,技术不成熟,实施成本昂贵,在应用推广中不具有现实意义;第三种也是现在电子政务和电子商务领域最流行的身份方式――基于USB Key的身份认证系统。
软件保护思想催生USB Key
USB Key 这个概念最早是由加密锁厂家提出来的,加密锁是用来防止软件盗版的硬件产品,加密锁的概念是使安装在计算机内的应用程序脱离加密锁硬件无法运行来达到保护软件不被盗版的目的。此后,随着电子商务和PKI应用的兴起,数字证书作为确认用户身份和保护用户数据有效手段越来越被人们所接受。然而数字证书实质上表现为带有用户信息和密钥的一个数据文件,如何保护数字证书本身又成为PKI体系中最薄弱的环节。数字证书可以保存在各种存储介质上,如软盘、硬盘等。国内CA早期颁发的数字证书都是以软盘的形式发放,或者由用户从网络上下载,然后导入到系统中保存在硬盘上。然而,用软盘保存数据是非常不可靠和不安全的,软盘虽然便于携带,却非常容易损坏,而用硬盘保存数据虽然不容易损坏,但是不便于携带,更致命的是不论用硬盘还是用软盘保存数字证书都非常容易被复制或被病毒破坏。虽然一般数字证书都带有密码保护,然而一旦证书被非法复制,整个安全系统的安全性就降低到仅仅靠密码保护的级别。于是,专门用于存储秘密信息的USB Key就很自然地成为数字证书的最佳载体。
USB Key 厂家将USB Key与PKI技术相结合,开发出了符合PKI标准的安全中间件,利用USB Key来保存数字证书和用户私钥,并对应用开发商提供符合PKI标准的编程接口,如PKCS#11和MSCAPI,以便于开发基于PKI的应用程序。由于USB Key 本身作为密钥存储器,其自身的硬件结构决定了用户只能通过厂商编程接口访问数据,这就保证了保存在USB Key中的数字证书无法被复制,并且每一个USB Key都带有PIN码保护,这样USB Key的硬件和PIN码构成了可以使用证书的两个必要因子。如果用户PIN码被泄漏,只要保存好USB Key的硬件就可以保护自己的证书不被盗用,如果用户的USB Key丢失,获得者由于不知道该硬件的PIN码,也无法盗用用户存在USB Key中的证书。与PKI技术的结合使USB Key的应用领域从仅确认用户身份,到可以使用数字证书的所有领域。
Linux PAM工作原理
然而目前的硬件设备USB Key产品一方面价格昂贵(2000元至12800元不等),另外主要用于Windows操作系统。这里笔者介绍如何在Linux环境下通过软硬结合的方法自己制作USB Key。本文以Red Hat Enterprise Linux 3.0为例,使用具有双启动型功能的USB闪盘(容量8兆以上就可)建立基于Linux的USB Key。
Linux下的USB Key的工作原理是通过USB闪盘和pam_usb软件共同构建的。pam_usb是一个开放源代码软件项目。首先读者需要对PAM有所了解, PAM全称是Pluggable Authentication Module (嵌入式认证模块)。它最初由Sun公司开发,很快被Linux社区接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是:认证管理、账号管理、会话期间管理和密码管理。可插入的认证模块用于实现应用程序的认证机制,使程序员或管理员不需要重新编写或编译程序就可以改变认证机制。
PAM模块详述
可以将PAM认为是这样的工具:它将应用程序从认证的重任中释放出来,包括可以让某个应用程序使用多个认证机制。下面的代码是一个标准的PAM应用于rlogin(远程登录)的代码:
auth required /lib/security/pam_securetty.so
auth sufficient /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
每一行包括以下内容:module-type(模块类型)、control-flag(控制字)、module-path(模块路径)、module-args(模块参数)。对于以上四个选项,这里我们主要介绍module-type(模块类型)和control-flag(控制字),见表1、表2。在Redhat Linux中模块路径存储在lib/security目录下。
建立pam_usb应用