红联Linux门户
Linux帮助

Linux技巧:如何制作Linux下的USB Key

发布时间:2005-12-26 09:16:51来源:红联作者:reing
软件保护思想催生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的应用领域从仅确认用户身份,到可以使用数字证书的所有领域。
文章评论

共有 5 条评论

  1. waq 于 2006-04-24 00:12:45发表:

    好文章!

  2. reing 于 2005-12-26 09:20:34发表:

    应用实例.

    如果希望为Linux服务器的root用户建立一对2048位长度的公私密码钥匙(各1024位),使用下面命令:

    # # usbadm keygen /mnt/usb root 1024

    [!] Directory /root/.auth/ not found, creating one...

    [!] Directory /mnt/usb/.auth/ not found, creating one...

    [!] Generating 1024 DSA key pair for root@host

    [!] Extracting private key...

    [+] Private key extracted.

    [+] Private key successfully written.

    [!] Writing public key...

    [+] Public key successfully written.

    这样公私密码钥匙就建立了并且私钥会复制到USB闪盘中。这样基于Linux应用环境(2.4以上内核)的低成本(目前8兆容量的USB闪盘成本低于50元)的USB key就建立了。本文介绍的是用USB闪盘存放密钥,而把证书放到密钥CF卡或者软盘上也可以,只不过在pam的配置里面指定具体设备就可以了。

  3. reing 于 2005-12-26 09:20:08发表:

    建立pam_usb应用.

    .

    pam_usb 安装使用非常简单,其工作原理是利用存储在USB闪盘中的私钥,结合Linux服务器的系统登录口令认证,来实现Linux下多用户登录同一个系统的身份认证问题。 .


    .

    这种方法可以解决登录口令遗失、被黑客破解的安全隐患。pam_usb官方主页(http://sourceforge.net/projects/pamusb/)提供详细的文档。作者是Andrea Luzzardi,其电子邮件地址为scox@gentoo.org。 .

    最新版本是2005年10月22日的pam_usb 0.3.3,软件大小26KB。pam_usb加密性能很强,USB Key内密钥生成时间加上确认时间不超过90秒(奔腾4 2.0,Linux 2.4内核);USB Key内签名运算时间少于1秒 ;不对称加密算法RSA最大支持4096位; 支持基于2.4-2.6内核Linux发行版本。

    1. 软件下载安装:

    #wget http://optusnet.dl.sourceforge.net/sourceforge/pamusb/pam_usb-0.3.3.tar.gz

    #tar -zxvf pam_usb-0.3.3.tar.gz

    #cd pam_usb-0.3.3

    # make;# make install

    2. pam_usb登录配置

    pam_usb编译安装后会在Linux目录/etc/pam.d/下产生两个配置文件:/etc/pam.d/login和/etc/pam.d/xdm。pam_usb 支持三种登录方法:首先是唯一(Unique)登录方法。即插入正确的带有私匙的USB key就可登录。这种方法不需要输入密码。方法是修改配置文件:/etc/pam.d/login。删除一行:“required pam_unix.so”。添加一行:“auth required pam_usb.so”。

    第二种是二者择一(Alternative)登录方法。即插入正确的带有私匙的USB key或者输入正确登录密码都可以登录。现在登录的流程是,假如你没有给密钥设置密码,那么登录的时候,插入USB闪盘,然后输入用户名就可以直接登录了。如果密钥有密码的话,就要输入密码。方法是修改配置文件:/etc/pam.d/login,在auth required pam_unix.so前面加入一行:“auth sufficient pam_usb.so”。

    第三种是双重登录(Additional)方法。即插入正确的带有私匙的USB key并且输入正确登录密码都可以登录。方法是修改配置文件:/etc/pam.d/login。

    在auth required pam_unix.so前面加入一行:“auth required pam_usb.so”。

    3. 制作存储密码钥匙的USB key

    在服务器安装编译pub_usb以后就可以制作USB key了。方法很简单,如下所示:

    # mkdir /mnt/usb

    # mount /dev/sda1 /mnt/usb

    以上命令建立挂载USB闪盘。下面可以生产一对DSA算法的公私密码钥匙。格式:

    # usbadm keygen < mntpoint> < user> < bits>

    其中,< mntpoint>是挂载点,< user>是用户名称,< bits>是密码钥匙长度。

  4. reing 于 2005-12-26 09:17:55发表:

    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 .

    表1 PAM模块类型
    模块类型 功能描述
    auth 确定有关用户认证的两方面:第一,它确认用户就是他们自己,这通过指示应用程序提示用户输入密码或者其他证实身份的方法。第二,这类模块会赋予成员资格。
    account 处理非认证级的账号管理。典型的用法是基于一天的不同时间段来限制/允许访问某服务,当前可用的系统资源(最大用户数)或者限制特定用户--- root只能从控制台登录。
    session 一系列动作有关,指在用户得到/失去服务时要做的事.这包括记录用户的登录/登出,挂载必须的目录等。
    password 设置密码
    .

    每一行包括以下内容:module-type(模块类型)、control-flag(控制字)、module-path(模块路径)、module-args(模块参数)。对于以上四个选项,这里我们主要介绍module-type(模块类型)和control-flag(控制字),见表1、表2。在Redhat Linux中模块路径存储在lib/security目录下。 .

    表2 PAM模块控制字
    模块控制字 功能描述
    required 该模块控制字返回成功值对于整个module-type的成功是必要的,此模块的返回失败并不会传回给用户直到剩下的模块(同样module-type)都执行过。
    response 类似required,只不过,当这类模块返回失败时,整个控制会立刻回到应用程序.返回值同第一个需要的或必要的模块返回的失败。
    sufficient 该模块控制字返回的成功会被认为已经充分满足Linux-PAM库确认这类模块(module-type)是成功的条件.如果没有先前的requisite模块返回了失败,那么不再会有其它 堆叠 的模块被呼叫.(注意,?这种情况下,随后的requisite模块就不会被呼叫.).这模块返回的失败不会看作是致命的错误而至影响应用程序从这module-type得到成功的结果。
    optional 模块对最终的成功或失败的结果不会产生决定性的影响.一般,Linux-PAM在确定整个模块堆成功活失败时忽略这模块。

    [ Last edited by reing on 2005-12-26 at 09:19 ]

  5. reing 于 2005-12-26 09:17:33发表:

    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社区接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发卸懒⒊隼础?inux-PAM处理四种独立的(管理)工作。它们是:认证管理、账号管理、会话期间管理和密码管理。可插入的认证模块用于实现应用程序的认证机制,使程序员或管理员不需要重新编写或编译程序就可以改变认证机制。


    图1 PAM工作流程
    注:1.调用某个应用程序,以得到该程 序的服务。
    2.PAM应用程序调用后台的PAM库进行认证工作。
    3.PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。
    4.PAM库装载所需的认证模块。
    5.这些模块可以让PAM与应用程序中的会话函数进行通信。
    6.会话函数向用户要求有关信息。
    7.用户对这些要求做出回应,提供所需信息。
    8.PAM认证模块通过PAM库将认证信息提供给应用程序。
    9.认证完成后,应用程序做出两种选择:将所需权限赋予用户,并通知用户;认证失败,并通知用户。

    [ Last edited by reing on 2005-12-26 at 09:19 ]