【51CTO.com快译】由于网上安全风险越来越大,简单的一个步骤式安全不再足以应对,于是人们求助于多层安全,以挫败针对其数字资产和网上隐私的越来越狡猾的攻击。金融行业及其他企业环境经常采用的一种高级的安全防御机制就是基于硬件的保护:一种防止有人做手脚的物理安全密钥(又叫“安全令牌”或“硬件令牌”)为秘密的软件密钥或登录信息充当保护层。基于硬件的安全方法在诸多环境下很有用,比如说实施双因子验证、VPN访问、安全密码库之类的机制。
如果你是自己动手一族(DY),可能忍不住想使用现成的USB拇指驱动器,制作一把自己的基于USB的安全密钥。然而,大众化的USB驱动器天生就很容易受到专门针对原装USB固件可编程特性的病毒或恶意软件的攻击。我个人不会将自己的私有密钥托付交给区区5美元的USB拇指驱动器。
最近,我无意中发现了一款基于USB的安全密钥硬件,名为Nitrokey(之前叫“Crypto Stick”),确实很喜欢它。Nitrokey可不是一种便宜的USB存储棒,但20美元至50美元的价格还算合理;考虑到其广泛的一体化安全功能,我认为并非价格过高。我在本文中将专门探讨Nitrokey Pro这款硬件,并介绍了实际的使用场合。
Nitrokey Pro是啥东东?
简而言之,Nitrokey Pro是一种防止有人做手脚的、用PIN保护的安全密钥存储硬件,采用USB接口。它使用嵌入式智能卡,实现了诸多开放的安全标准,比如OpenPGP协议、S/MIME、HOTP(基于HMAC的一次性密码)和TOTP(基于时间的一次性密码)。因而,一旦你将秘密密钥存储到Nitrokey Pro上,它就能够在硬件本身上面签名、加密、解密和验证,因而你的秘密密钥永远不会泄露给与智能卡相连接的计算机。这样你需要在靠不住(可能有大量恶意软件)的第三方计算机上运行各种安全任务时,就可以高枕无忧了。Nitrokey Pro生成的OATH一次性密码与Gmail、Dropbox、AWS及其他许多网站兼容。Nitrokey Pro还内置了安全密码库,万一你信不过任何软件密码管理工具,就可以将很难记住的登录信息存储到防止有人做手脚的硬件上。
抛开所有这些优点不说,我最喜欢Nitrokey的地方在于其开放性。正如它所说“专有安全”并不安全,这激励着Nitrokey的人员向开源社区同时开放其产品的硬件和软件,所以它们可以接受审计和审查,以查找任何安全漏洞。你可以在其官方Github软件库(https://github.com/Nitrokey/)所有Nitrokey智能卡产品系列的完全开放的PCB硬件设计、固件和软件源代码。
我在下面将介绍如何在Linux计算机上安装Nitrokey Pro,并演示如何在几种实际场景下使用它。
在Linux上安装Nitrokey Pro
想在Linux上安装Nitrokey Pro,先要卡插入到计算机的USB端口上。如果你在运行最新的Linux发行版,它应该可以轻松地为该卡找到必要的USB设备驱动程序。使用lsusb命令,证实Nitrokey Pro在你的系统上可见,这种情况下该卡会显示为“Clay Logic”。
$ lsusb
一旦你证实了该USB设备已成功,就要为Nitrokey Pro USB设备创建udev规则,重启udev服务,如下所示。
$ wget https://www.nitrokey.com/sites/default/files/40-nitrokey.rules $ sudo cp 40-nitrokey.rules /etc/udev/rules.d/ $ sudo service udev restart
下一步,下载和安装Nitrokey App(https://www.nitrokey.com/download)果你使用Nitrokey Pro来生成一次性密码,或者将它用作密码管理工具,就需要这个专用的GUI应用程序。不过,在另外大多数情况下,不需要Nitrokey App就可以使用Nitrokey USB密钥。
想把Nitrokey应用程序安装到Linux桌面上:
在基于Debian的系统上:
$ sudo apt-get install gdebi-core
$ sudo gdebi nitrokey-XXXXXX.deb
在基于红帽的系统上:
$ sudo rpm -ivh nitrokey-XXXXXX.rpm
安装好Nitrokey App后,启动该应用程序,如下所示。
$ nitrokey-app
如果该应用程序与Nitrokey USB硬件成功对上号,它就会显示“Nitrokey已连接”桌面通知。
Nitrokey Pro智能卡使用两个PIN来加以保护:用户PIN(默认值:123456)和管理员PIN(默认值:12345678)。输入那些PIN要小心,因为用户PIN输错三次以上会导致卡被锁住,你无法使用卡(除非管理员PIN覆盖用户PIN),而管理员PIN输错三次以上会彻底破坏USB密钥硬件,不可修复。万一智能卡落到坏人手里,这种严格的基于PIN的硬件保护必不可少。
一旦Nitrokey Pro在你的系统上可以访问,要做的头一件事就是更改用户PIN/管理员PIN。为此,鼠标右击桌面顶部的Nitrokey图标,进入到“配置”菜单。在那里,你就能够同时更改用户PIN和管理员PIN。
请注意:还可以借助gpg命令来进行PIN管理,我在下面会有介绍。
使用GnuPG管理Nitrokey Pro
作为一款与标准兼容的OpenPGP卡,Nitrokey Pro实际上可以使用GnuPG来管理。硬件上执行的大部分安全功能(比如生成/存储GPG密钥、加密/解密文件和签名消息等)可以由gpg命令来加以控制。所以,即便它连接无桌面的服务器,也应该可以轻松管理Nitrokey Pro,没有任何问题。
比如说,输入下面这个gpg命令,查看关于已连接USB安全密钥的信息。
$ gpg --card-status
与你在Nitrokey应用程序上更改用户PIN/管理员PIN的方法相似,你也可以使用gpg命令来更改PIN:
$ gpg --change-pin
现在为了测试安全功能,不妨先将你的GPG密钥存储到Nitrokey USB硬件上。请注意:你可以将现有的GPG密钥移到Nitrokey卡上。这里不妨从头开始创建一个新的GPG密钥。
为此,输入命令:
$ gpg --card-edit
在“gpg/card>”提示符处,输入“admin”后按回车键。然后,你要输入管理员模式;在这种模式下,你可以执行各种管理任务,包括生成密钥。输入“help”会显示所有可用的管理员命令。
想生成新的GPG密钥,输入“generate”命令。这会让你完成一系列标准步骤,生成主密钥和子密钥,用于签名、加密和验证。
密钥生成完毕后,输入“list”命令即可查看已生成的密钥。你还可以运行gpg命令,查看同样的信息:
$ gpg --card-status
你会看到上面生成的三个不同的子密钥。签名密钥是只签名的子密钥,用作主密钥。加密密钥是用于加密的子密钥。最后,验证密钥并不由GnuPG直接使用,而是用于其他验证用途,比如PAM验证和SSH登录。
一旦你生成了GPG密钥,建议你在现有的PGP密钥服务器上发布公共密钥,那样万一别人想要安全地与你进行联系,就可以使用你的电子邮件地址或密钥ID,下载密钥。下列命令将把你的公共密钥上传到密钥服务器。“D7F6C175”是你公共密钥的密钥ID,上述密钥信息里面就有它。把密钥ID换成你自己的密钥ID。
$ gpg --keyserver keys.gnupg.net --send-keys D7F6C175
现在,我们准备使用存储在Nitrokey Pro上的GPG密钥。在下文中,我将给出几个例子,表明如何使用Nitrokey Pro智能卡。
Nitrokey Pro的第一种使用场合:文件加密和解密
最简单的使用场合就是使用存储在该USB硬件上的加密密钥,加密和解密文件。
有人在使用你的GPG用户ID(比如my@email.com)加密文件后,给你发来了一个已加密文件,如下所示。
$ gpg -r my@email.com -e secure.txt
一旦你收到该文件,就可以使用“-d”选项来解密文件,只要存储有秘密密钥的Nitrokey卡插入到你的计算机上。
$ gpg -d secure.txt.gpg
请注意:会要求你输入Nitrokey用户PIN(不是GPG密钥密码),以便解密。要是没有Nitrokey卡,你会遇到下列错误:
gpg: sending command `SCD PKDECRYPT' to agent failed: ec=5.99
gpg: encrypted with 2048-bit RSA key, ID E04A33F0, created 2015-12-21
"Dan Nanni "
gpg: public key decryption failed: general error
gpg: decryption failed: secret key not available
Nitrokey Pro的第二种使用场合:SSH验证
你可以使用Nitrokey Pro智能卡用于SSH验证。在这种情况下,你使用存储在Nitrokey卡上的OpenPGP密钥作为SSH密钥,并依赖gpg-agent从Nitrokey卡获取OpenPGP密钥用于SSH登录。不过默认情况下,OpenSSH客户端会试着使用无法直接访问智能卡硬件的ssh-agent获取私密密钥。因而,我们需要在基于密钥的SSH验证过程中将gpg-agent配置成临时取代ssh-agent。
为此,我们需要先启用gpg-agent中的SSH支持功能。在~/.gnupg/gpg-agent.conf中添加下面这一行。
1. enable-ssh-support
然后将下面几行添加到~/.bashrc:
1. envfile="$HOME/.gnupg/gpg-agent.env"
2. if [[ -e "$envfile" ]] && kill -0 $(grep SSH_AGENT_PID "$envfile" | cut -d= -f 2) 2>/dev/null; then
3. eval "$(cat "$envfile")"
4. else
5. eval "$(gpg-agent --daemon --write-env-file "$envfile")"
6. fi
7. export SSH_AUTH_SOCK
还建议禁用GNOME密钥环(如果你使用它的话),因为GNOME密钥环会干扰gpg-agent。
现在打开一个新的终端(或重新加载~/.bashrc),试着输入下面这个命令,测试一下。
$ gpg-agent
如果gpg-agent正确设置,你应该会看到输出信息,显示为“gpg-agent: gpg-agent running and available”。
下一步,使用下面这个命令查明加密子密钥ID。ECD8F07F是你自己的GPG密钥ID,可以在“gpg --card-status”命令的输出中找到它。把它换成你自己的密钥ID。
$ gpg --edit-key ECD8F07F
输出信息列出了与你的密钥ID有关的所有可用子密钥。标为“usage”的最后一列表明了每个子密钥的角色:“S”代表签名,“C”代表证书,“A”代表验证,“E”代表加密。
在这个例子中,用于验证的子密钥ID是81398BBF。
使用gpgkey2ssh命令,借助验证子密钥ID,生成兼容的authorized_key字符串。
$ gpgkey2ssh 81398BBF > authorized_keys
证实authorized_keys的内容与下列命令的输出内容一样。
$ ssh-add -L
一旦这得到证实,将authorized_keys移到你想实现SSH访问的远程主机处的~/.ssh/authorized_keys。确保~/.ssh/authorized_keys的许可权限被设成0600。
为了测试基于密钥的SSH验证,你应该禁用远程主机的SSH服务器处的密码验证。
最后,检查Nitrokey智能卡插入到本地计算机的期间,你可以通过SSH访问远程主机。如果gpg-agent还没有缓存你的秘密密钥,会要求你输入Nitrokey用户PIN。如果你试图在没有Nitrokey卡的情况下实现SSH访问,就会看到下列错误。
Permission denied (publickey).
Nitrokey Pro的第三种使用场合:为Dropbox网站登录实现的双因子验证
Nitrokey Pro智能卡的另一种使用场合就是生成一次性密码(OTP)。尤其是,Nitrokey Pro能够生成基于时间的OTP或基于HMAC的OTP,它们与如今许多商业网站支持的双因子验证兼容。一次性安全代码将由你之前安装的那个Nitrokey应用程序来生成。
举例说,让我来介绍如何在Dropbox网站上使用Nitrokey Pro来设置双因子验证机制。
首先,登录到你的Dropbox帐户,启用两步骤验证。选择“mobile app”选项(而不是SMS选项)来接收安全代码。最终,你将使用Nitrokey应用程序,而不是移动应用程序。
Dropbox网站随后会启用基于时间的验证,并生成采用base32格式的秘密密钥。
打开Nitrokey应用程序的“配置”设置,进入到“OTP和密码保险柜”菜单。在“OTP Slot配置”选项卡下方,启用“TOTP”模式,选择一个可用的TOTP slot(比如slot 1),将上述秘密密钥拷贝到“秘密密钥”空白处。
最后一步是,Dropbox会让你输入由验证应用程序生成的代码。只要鼠标右击Nitrokey应用程序图标,然后选择“密码”菜单下方的“Dropbox”。
然后,就会生成一次性密码,并自动拷贝到剪贴板。
现在把存储在剪贴板里面的OTP粘贴到Dropbox页面的安全代码空白处,这将完成两步骤的验证设置过程。现在,只要你需要用于Dropbox登录的一次性安全代码,就可以使用Nitrokey应用程序来生成一个。
结束语
我在本教程中介绍了一种名为Nitrokey Pro的基于USB的智能卡,及其几种使用场合。除了我给出的三个例子外,Nitrokey Pro还有另外许许多多的使用场合(比如PAM验证、电子邮件加密、硬盘加密、VPN访问、PKI证书和密码管理器)。Nitrokey网站维护有相当完备的说明文档(https://www.nitrokey.com/documentation/applications),介绍了适用于Linux、Windows和MacOS X等平台的这些使用场合,所以如果你有兴趣的话,鼓励你仔细阅读一下。
正如我在开头提到,USB Nitrokey的一大卖点就是其透明的开发过程。完全开放的硬件和完全开源的软件让其产品可以接受社区驱动的代码审核和渗透测试的检验,这让它们更加值得信赖,可以迅速发现任何安全漏洞,并迅速发布安全更新版,并促进与其他应用程序的集成。Nitrokey的人员恪守这种开放精神,计划推出另一款名为Nitrokey Storage的产品(基本上为Nitrokey Pro增添了安全的海量存储),一直在开展Indiegogo筹资活动,寻求资金上的支持。如果你想帮它一把,何不捐点钱支持它?
原文标题:How to secure your Linux environment with Nitrokey USB smart card
【51CTO.com独家译稿,合作站点转载请注明来源】