由于網(wǎng)上安全風(fēng)險(xiǎn)越來越大,簡(jiǎn)單的一個(gè)步驟式安全不再足以應(yīng)對(duì),于是人們求助于多層安全,以挫敗針對(duì)其數(shù)字資產(chǎn)和網(wǎng)上隱私的越來越狡猾的攻擊。金融行業(yè)及其他企業(yè)環(huán)境經(jīng)常采用的一種高級(jí)的安全防御機(jī)制就是基于硬件的保護(hù):一種防止有人做手腳的物理安全密鑰(又叫“安全令牌”或“硬件令牌”)為秘密的軟件密鑰或登錄信息充當(dāng)保護(hù)層。基于硬件的安全方法在諸多環(huán)境下很有用,比如說實(shí)施雙因子驗(yàn)證、VPN訪問、安全密碼庫之類的機(jī)制。
如果你是自己動(dòng)手一族(DY),可能忍不住想使用現(xiàn)成的USB拇指驅(qū)動(dòng)器,制作一把自己的基于USB的安全密鑰。然而,大眾化的USB驅(qū)動(dòng)器天生就很容易受到專門針對(duì)原裝USB固件可編程特性的病毒或惡意軟件的攻擊。我個(gè)人不會(huì)將自己的私有密鑰托付交給區(qū)區(qū)5美元的USB拇指驅(qū)動(dòng)器。
最近,我無意中發(fā)現(xiàn)了一款基于USB的安全密鑰硬件,名為Nitrokey(之前叫“Crypto Stick”),確實(shí)很喜歡它。Nitrokey可不是一種便宜的USB存儲(chǔ)棒,但20美元至50美元的價(jià)格還算合理;考慮到其廣泛的一體化安全功能,我認(rèn)為并非價(jià)格過高。我在本文中將專門探討Nitrokey Pro這款硬件,并介紹了實(shí)際的使用場(chǎng)合。
Nitrokey Pro是啥東東?
簡(jiǎn)而言之,Nitrokey Pro是一種防止有人做手腳的、用PIN保護(hù)的安全密鑰存儲(chǔ)硬件,采用USB接口。它使用嵌入式智能卡,實(shí)現(xiàn)了諸多開放的安全標(biāo)準(zhǔn),比如OpenPGP協(xié)議、S/MIME、HOTP(基于HMAC的一次性密碼)和TOTP(基于時(shí)間的一次性密碼)。因而,一旦你將秘密密鑰存儲(chǔ)到Nitrokey Pro上,它就能夠在硬件本身上面簽名、加密、解密和驗(yàn)證,因而你的秘密密鑰永遠(yuǎn)不會(huì)泄露給與智能卡相連接的計(jì)算機(jī)。這樣你需要在靠不住(可能有大量惡意軟件)的第三方計(jì)算機(jī)上運(yùn)行各種安全任務(wù)時(shí),就可以高枕無憂了。Nitrokey Pro生成的OATH一次性密碼與Gmail、Dropbox、AWS及其他許多網(wǎng)站兼容。Nitrokey Pro還內(nèi)置了安全密碼庫,萬一你信不過任何軟件密碼管理工具,就可以將很難記住的登錄信息存儲(chǔ)到防止有人做手腳的硬件上。
拋開所有這些優(yōu)點(diǎn)不說,我最喜歡Nitrokey的地方在于其開放性。正如它所說“專有安全”并不安全,這激勵(lì)著Nitrokey的人員向開源社區(qū)同時(shí)開放其產(chǎn)品的硬件和軟件,所以它們可以接受審計(jì)和審查,以查找任何安全漏洞。你可以在其官方Github軟件庫(https://github.com/Nitrokey/)所有Nitrokey智能卡產(chǎn)品系列的完全開放的PCB硬件設(shè)計(jì)、固件和軟件源代碼。
我在下面將介紹如何在Linux計(jì)算機(jī)上安裝Nitrokey Pro,并演示如何在幾種實(shí)際場(chǎng)景下使用它。
在Linux上安裝Nitrokey Pro
想在Linux上安裝Nitrokey Pro,先要卡插入到計(jì)算機(jī)的USB端口上。如果你在運(yùn)行最新的Linux發(fā)行版,它應(yīng)該可以輕松地為該卡找到必要的USB設(shè)備驅(qū)動(dòng)程序。使用lsusb命令,證實(shí)Nitrokey Pro在你的系統(tǒng)上可見,這種情況下該卡會(huì)顯示為“Clay Logic”。
$ lsusb
一旦你證實(shí)了該USB設(shè)備已成功,就要為Nitrokey Pro USB設(shè)備創(chuàng)建udev規(guī)則,重啟udev服務(wù),如下所示。
$ 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來生成一次性密碼,或者將它用作密碼管理工具,就需要這個(gè)專用的GUI應(yīng)用程序。不過,在另外大多數(shù)情況下,不需要Nitrokey App就可以使用Nitrokey USB密鑰。
想把Nitrokey應(yīng)用程序安裝到Linux桌面上:
在基于Debian的系統(tǒng)上:
$ sudo apt-get install gdebi-core
$ sudo gdebi nitrokey-XXXXXX.deb
在基于紅帽的系統(tǒng)上:
$ sudo rpm -ivh nitrokey-XXXXXX.rpm
安裝好Nitrokey App后,啟動(dòng)該應(yīng)用程序,如下所示。
$ nitrokey-app
如果該應(yīng)用程序與Nitrokey USB硬件成功對(duì)上號(hào),它就會(huì)顯示“Nitrokey已連接”桌面通知。
Nitrokey Pro智能卡使用兩個(gè)PIN來加以保護(hù):用戶PIN(默認(rèn)值:123456)和管理員PIN(默認(rèn)值:12345678)。輸入那些PIN要小心,因?yàn)橛脩鬚IN輸錯(cuò)三次以上會(huì)導(dǎo)致卡被鎖住,你無法使用卡(除非管理員PIN覆蓋用戶PIN),而管理員PIN輸錯(cuò)三次以上會(huì)徹底破壞USB密鑰硬件,不可修復(fù)。萬一智能卡落到壞人手里,這種嚴(yán)格的基于PIN的硬件保護(hù)必不可少。
一旦Nitrokey Pro在你的系統(tǒng)上可以訪問,要做的頭一件事就是更改用戶PIN/管理員PIN。為此,鼠標(biāo)右擊桌面頂部的Nitrokey圖標(biāo),進(jìn)入到“配置”菜單。在那里,你就能夠同時(shí)更改用戶PIN和管理員PIN。
請(qǐng)注意:還可以借助gpg命令來進(jìn)行PIN管理,我在下面會(huì)有介紹。
使用GnuPG管理Nitrokey Pro
作為一款與標(biāo)準(zhǔn)兼容的OpenPGP卡,Nitrokey Pro實(shí)際上可以使用GnuPG來管理。硬件上執(zhí)行的大部分安全功能(比如生成/存儲(chǔ)GPG密鑰、加密/解密文件和簽名消息等)可以由gpg命令來加以控制。所以,即便它連接無桌面的服務(wù)器,也應(yīng)該可以輕松管理Nitrokey Pro,沒有任何問題。
比如說,輸入下面這個(gè)gpg命令,查看關(guān)于已連接USB安全密鑰的信息。
$ gpg --card-status
與你在Nitrokey應(yīng)用程序上更改用戶PIN/管理員PIN的方法相似,你也可以使用gpg命令來更改PIN:
$ gpg --change-pin
現(xiàn)在為了測(cè)試安全功能,不妨先將你的GPG密鑰存儲(chǔ)到Nitrokey USB硬件上。請(qǐng)注意:你可以將現(xiàn)有的GPG密鑰移到Nitrokey卡上。這里不妨從頭開始創(chuàng)建一個(gè)新的GPG密鑰。
為此,輸入命令:
$ gpg --card-edit
在“gpg/card>”提示符處,輸入“admin”后按回車鍵。然后,你要輸入管理員模式;在這種模式下,你可以執(zhí)行各種管理任務(wù),包括生成密鑰。輸入“help”會(huì)顯示所有可用的管理員命令。
想生成新的GPG密鑰,輸入“generate”命令。這會(huì)讓你完成一系列標(biāo)準(zhǔn)步驟,生成主密鑰和子密鑰,用于簽名、加密和驗(yàn)證。
密鑰生成完畢后,輸入“list”命令即可查看已生成的密鑰。你還可以運(yùn)行g(shù)pg命令,查看同樣的信息:
$ gpg --card-status
你會(huì)看到上面生成的三個(gè)不同的子密鑰。簽名密鑰是只簽名的子密鑰,用作主密鑰。加密密鑰是用于加密的子密鑰。最后,驗(yàn)證密鑰并不由GnuPG直接使用,而是用于其他驗(yàn)證用途,比如PAM驗(yàn)證和SSH登錄。
一旦你生成了GPG密鑰,建議你在現(xiàn)有的PGP密鑰服務(wù)器上發(fā)布公共密鑰,那樣萬一別人想要安全地與你進(jìn)行聯(lián)系,就可以使用你的電子郵件地址或密鑰ID,下載密鑰。下列命令將把你的公共密鑰上傳到密鑰服務(wù)器。“D7F6C175”是你公共密鑰的密鑰ID,上述密鑰信息里面就有它。把密鑰ID換成你自己的密鑰ID。
$ gpg --keyserver keys.gnupg.net --send-keys D7F6C175
現(xiàn)在,我們準(zhǔn)備使用存儲(chǔ)在Nitrokey Pro上的GPG密鑰。在下文中,我將給出幾個(gè)例子,表明如何使用Nitrokey Pro智能卡。
Nitrokey Pro的第一種使用場(chǎng)合:文件加密和解密
最簡(jiǎn)單的使用場(chǎng)合就是使用存儲(chǔ)在該USB硬件上的加密密鑰,加密和解密文件。
有人在使用你的GPG用戶ID(比如my@email.com)加密文件后,給你發(fā)來了一個(gè)已加密文件,如下所示。
$ gpg -r my@email.com -e secure.txt
一旦你收到該文件,就可以使用“-d”選項(xiàng)來解密文件,只要存儲(chǔ)有秘密密鑰的Nitrokey卡插入到你的計(jì)算機(jī)上。
$ gpg -d secure.txt.gpg
請(qǐng)注意:會(huì)要求你輸入Nitrokey用戶PIN(不是GPG密鑰密碼),以便解密。要是沒有Nitrokey卡,你會(huì)遇到下列錯(cuò)誤:
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的第二種使用場(chǎng)合:SSH驗(yàn)證
你可以使用Nitrokey Pro智能卡用于SSH驗(yàn)證。在這種情況下,你使用存儲(chǔ)在Nitrokey卡上的OpenPGP密鑰作為SSH密鑰,并依賴gpg-agent從Nitrokey卡獲取OpenPGP密鑰用于SSH登錄。不過默認(rèn)情況下,OpenSSH客戶端會(huì)試著使用無法直接訪問智能卡硬件的ssh-agent獲取私密密鑰。因而,我們需要在基于密鑰的SSH驗(yàn)證過程中將gpg-agent配置成臨時(shí)取代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密鑰環(huán)(如果你使用它的話),因?yàn)镚NOME密鑰環(huán)會(huì)干擾gpg-agent。
現(xiàn)在打開一個(gè)新的終端(或重新加載~/.bashrc),試著輸入下面這個(gè)命令,測(cè)試一下。
$ gpg-agent
如果gpg-agent正確設(shè)置,你應(yīng)該會(huì)看到輸出信息,顯示為“gpg-agent: gpg-agent running and available”。
下一步,使用下面這個(gè)命令查明加密子密鑰ID。ECD8F07F是你自己的GPG密鑰ID,可以在“gpg --card-status”命令的輸出中找到它。把它換成你自己的密鑰ID。
$ gpg --edit-key ECD8F07F
輸出信息列出了與你的密鑰ID有關(guān)的所有可用子密鑰。標(biāo)為“usage”的最后一列表明了每個(gè)子密鑰的角色:“S”代表簽名,“C”代表證書,“A”代表驗(yàn)證,“E”代表加密。
在這個(gè)例子中,用于驗(yàn)證的子密鑰ID是81398BBF。
使用gpgkey2ssh命令,借助驗(yàn)證子密鑰ID,生成兼容的authorized_key字符串。
$ gpgkey2ssh 81398BBF >authorized_keys
證實(shí)authorized_keys的內(nèi)容與下列命令的輸出內(nèi)容一樣。
$ ssh-add -L
一旦這得到證實(shí),將authorized_keys移到你想實(shí)現(xiàn)SSH訪問的遠(yuǎn)程主機(jī)處的~/.ssh/authorized_keys。確保~/.ssh/authorized_keys的許可權(quán)限被設(shè)成0600。
為了測(cè)試基于密鑰的SSH驗(yàn)證,你應(yīng)該禁用遠(yuǎn)程主機(jī)的SSH服務(wù)器處的密碼驗(yàn)證。
最后,檢查Nitrokey智能卡插入到本地計(jì)算機(jī)的期間,你可以通過SSH訪問遠(yuǎn)程主機(jī)。如果gpg-agent還沒有緩存你的秘密密鑰,會(huì)要求你輸入Nitrokey用戶PIN。如果你試圖在沒有Nitrokey卡的情況下實(shí)現(xiàn)SSH訪問,就會(huì)看到下列錯(cuò)誤。
Permission denied (publickey).
Nitrokey Pro的第三種使用場(chǎng)合:為Dropbox網(wǎng)站登錄實(shí)現(xiàn)的雙因子驗(yàn)證
Nitrokey Pro智能卡的另一種使用場(chǎng)合就是生成一次性密碼(OTP)。尤其是,Nitrokey Pro能夠生成基于時(shí)間的OTP或基于HMAC的OTP,它們與如今許多商業(yè)網(wǎng)站支持的雙因子驗(yàn)證兼容。一次性安全代碼將由你之前安裝的那個(gè)Nitrokey應(yīng)用程序來生成。
舉例說,讓我來介紹如何在Dropbox網(wǎng)站上使用Nitrokey Pro來設(shè)置雙因子驗(yàn)證機(jī)制。
首先,登錄到你的Dropbox帳戶,啟用兩步驟驗(yàn)證。選擇“mobile app”選項(xiàng)(而不是SMS選項(xiàng))來接收安全代碼。最終,你將使用Nitrokey應(yīng)用程序,而不是移動(dòng)應(yīng)用程序。
Dropbox網(wǎng)站隨后會(huì)啟用基于時(shí)間的驗(yàn)證,并生成采用base32格式的秘密密鑰。
打開Nitrokey應(yīng)用程序的“配置”設(shè)置,進(jìn)入到“OTP和密碼保險(xiǎn)柜”菜單。在“OTP Slot配置”選項(xiàng)卡下方,啟用“TOTP”模式,選擇一個(gè)可用的TOTP slot(比如slot 1),將上述秘密密鑰拷貝到“秘密密鑰”空白處。
最后一步是,Dropbox會(huì)讓你輸入由驗(yàn)證應(yīng)用程序生成的代碼。只要鼠標(biāo)右擊Nitrokey應(yīng)用程序圖標(biāo),然后選擇“密碼”菜單下方的“Dropbox”。
然后,就會(huì)生成一次性密碼,并自動(dòng)拷貝到剪貼板。
現(xiàn)在把存儲(chǔ)在剪貼板里面的OTP粘貼到Dropbox頁面的安全代碼空白處,這將完成兩步驟的驗(yàn)證設(shè)置過程?,F(xiàn)在,只要你需要用于Dropbox登錄的一次性安全代碼,就可以使用Nitrokey應(yīng)用程序來生成一個(gè)。
結(jié)束語
我在本教程中介紹了一種名為Nitrokey Pro的基于USB的智能卡,及其幾種使用場(chǎng)合。除了我給出的三個(gè)例子外,Nitrokey Pro還有另外許許多多的使用場(chǎng)合(比如PAM驗(yàn)證、電子郵件加密、硬盤加密、VPN訪問、PKI證書和密碼管理器)。Nitrokey網(wǎng)站維護(hù)有相當(dāng)完備的說明文檔(https://www.nitrokey.com/documentation/applications),介紹了適用于Linux、Windows和MacOS X等平臺(tái)的這些使用場(chǎng)合,所以如果你有興趣的話,鼓勵(lì)你仔細(xì)閱讀一下。
正如我在開頭提到,USB Nitrokey的一大賣點(diǎn)就是其透明的開發(fā)過程。完全開放的硬件和完全開源的軟件讓其產(chǎn)品可以接受社區(qū)驅(qū)動(dòng)的代碼審核和滲透測(cè)試的檢驗(yàn),這讓它們更加值得信賴,可以迅速發(fā)現(xiàn)任何安全漏洞,并迅速發(fā)布安全更新版,并促進(jìn)與其他應(yīng)用程序的集成。Nitrokey的人員恪守這種開放精神,計(jì)劃推出另一款名為Nitrokey Storage的產(chǎn)品(基本上為Nitrokey Pro增添了安全的海量存儲(chǔ)),一直在開展Indiegogo籌資活動(dòng),尋求資金上的支持。如果你想幫它一把,何不捐點(diǎn)錢支持它?
原文標(biāo)題:How to secure your Linux environment with Nitrokey USB smart card