新聞中心
背景
近來(lái)很多知名企業(yè)都出現(xiàn)了密碼泄露,通過(guò)單一的密碼對(duì)敏感和重要信息進(jìn)行保護(hù)已經(jīng)面臨越來(lái)越多的挑戰(zhàn),因此業(yè)內(nèi)對(duì)多重認(rèn)證的呼聲也越來(lái)越高,而其中的雙因子認(rèn)證得到了業(yè)界的普遍認(rèn)可。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括寶山網(wǎng)站建設(shè)、寶山網(wǎng)站制作、寶山網(wǎng)頁(yè)制作以及寶山網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,寶山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到寶山省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
什么是雙因子認(rèn)證
雙因子認(rèn)證(Two-factor authentication)(即 2FA),是一種通過(guò)組合兩種不同的驗(yàn)證方式進(jìn)行用戶身份驗(yàn)證的機(jī)制。
在這種多重認(rèn)證的系統(tǒng)中,用戶需要通過(guò)兩種不同的認(rèn)證程序:
- 提供他們知道的信息(如用戶名/密碼)
- 再借助其他工具提供用戶所不知道的信息(如用手機(jī)生成的一次性密碼)
SSH 雙因子認(rèn)證實(shí)現(xiàn)思路
在 SSH 服務(wù)器端安裝 Google 身份驗(yàn)證器服務(wù)器端組件,這樣,在使用密碼或密鑰登錄 SSH 服務(wù)器時(shí),同時(shí)通過(guò)與 Google 身份驗(yàn)證器相匹配的客戶端所提供的驗(yàn)證信息來(lái)確認(rèn)登錄者的身份和權(quán)限。這里的客戶端可以使用Google 身份驗(yàn)證器(Google Authenticator)應(yīng)用,也可以使用我們開(kāi)發(fā)的、采用同一個(gè) RFC 規(guī)范的“運(yùn)維密碼”微信小程序。
Google 身份驗(yàn)證器所采用的算法規(guī)范基于 TOTP RFC 草案。
(題外話,RSA 硬件令牌,也是采用了類(lèi)似的機(jī)制,只不過(guò)客戶端是硬件的;而最近 Apple 公司的一些服務(wù)所需要的雙因子認(rèn)證也是一樣的,但是其用于呈現(xiàn)驗(yàn)證信息的是手機(jī)或平板上的 iOS 內(nèi)部組件,非獨(dú)立應(yīng)用。)
關(guān)于Google 身份驗(yàn)證器
為了鼓勵(lì)廣泛采用雙因子認(rèn)證的方式,Google 公司發(fā)布了 Google 身份驗(yàn)證器(Google Authenticator),這是一款開(kāi)源的、可基于開(kāi)放規(guī)則(如 HMAP/ 基于時(shí)間)生成一次性密碼的軟件。它是一款跨平臺(tái)軟件,可運(yùn)行在 Linux、Android、iOS 上。Google 公司同時(shí)也支持插件式鑒別模塊(pluggable authentication module) PAM ,使其能和其它適用于 PAM 進(jìn)行驗(yàn)證的工具(如 OpenSSH)協(xié)同工作。
Google 身份驗(yàn)證器分為兩個(gè)部分,分別是服務(wù)器端組件和客戶端應(yīng)用,都稱(chēng)之為“Google 身份驗(yàn)證器”,這里,我們?yōu)榱顺吻迤鹨?jiàn),會(huì)在說(shuō)明時(shí)指明。
關(guān)于運(yùn)維密碼
Google 公司所開(kāi)發(fā)的身份驗(yàn)證器以簡(jiǎn)潔著稱(chēng),但也因此缺乏一些必要的特性,比如備份功能——這使得使用該身份驗(yàn)證器的人時(shí)時(shí)處于手機(jī)丟失的恐慌之中。(雖然 Google 提供的服務(wù)器端和自身的服務(wù)也提供了緊急驗(yàn)證碼,以用于這種情況下的自救,但是很多采用 Google 身份驗(yàn)證器的服務(wù)并不支持和提供緊急驗(yàn)證碼)
作為一家緊密關(guān)注于運(yùn)維安全、積極倡導(dǎo)信息安全的技術(shù)社區(qū),Linux 中國(guó) 久已有開(kāi)發(fā)一個(gè)新的替代品的想法。恰逢微信推出小程序平臺(tái),我們感覺(jué)到這正是一個(gè)良機(jī),可以充分利用到微信和小程序的便利之處,又適合小程序的使用情境。因此,由 Linux 中國(guó)旗下的 LCTT 技術(shù)組的白宦成同學(xué)獨(dú)立開(kāi)發(fā)了一款旨在移動(dòng)互聯(lián)網(wǎng)場(chǎng)景中提供更好的多因子認(rèn)證體驗(yàn)的小程序:運(yùn)維密碼。
順便說(shuō)一句,在產(chǎn)品初步成熟之后,我們已經(jīng)將該小程序開(kāi)源給社區(qū),代碼托管于 GitHub:https://github.com/LCTT/WeApp-Password ,希望更多的人能夠受益和共同完善它,有什么功能需求、錯(cuò)誤反饋請(qǐng)到 GitHub 上提出 issue,也歡迎發(fā)送拉取請(qǐng)求給我們。
此外,大家在使用過(guò)程中,發(fā)現(xiàn)什么問(wèn)題或需要幫助,也可以加入微信體驗(yàn)群:
掃描識(shí)別添加上面的好友,驗(yàn)證信息:“運(yùn)維密碼”,可獲得入群邀請(qǐng)。
言歸正傳,我們來(lái)看看如何使用“運(yùn)維密碼”來(lái)為你的 SSH 服務(wù)提供雙因子認(rèn)證支持。
如何開(kāi)始
首先我們需要一些準(zhǔn)備工作:
- 一臺(tái)運(yùn)行著 OpenSSH 服務(wù)(版本大于 6.2)的 Linux 主機(jī)
- 一臺(tái)能運(yùn)行微信的智能手機(jī)
- 一臺(tái)支持 SSH 登錄的終端
在 Linux 系統(tǒng)中安裝 Google 身份驗(yàn)證器服務(wù)器端組件
第一步需要在運(yùn)行著 OpenSSH 服務(wù)的 Linux 主機(jī)上安裝 Google 身份驗(yàn)證器服務(wù)器端組件。按照如下步驟安裝 Google 身份驗(yàn)證器及其 PAM 模塊。
用安裝包安裝 Google 身份驗(yàn)證器服務(wù)器端組件
如果你不想自己構(gòu)建 Google 身份驗(yàn)證器服務(wù)器端組件,在幾個(gè)主流 Linux 發(fā)行版上有已經(jīng)編譯好的安裝包。安裝包里面包含 Google 身份驗(yàn)證器服務(wù)器端組件的二進(jìn)制程序和 PAM 模塊。
在 Ubuntu 上安裝 Google 身份驗(yàn)證器服務(wù)器端組件:
sudo apt-get install libpam-google-authenticator
在 Fedora 上安裝 Google 身份驗(yàn)證器服務(wù)器端組件:
sudo dnf install google-authenticator
在 CentOS 上安裝 Google 身份驗(yàn)證器服務(wù)器端組件,需要首先啟用 EPEL 軟件庫(kù),然后運(yùn)行如下命令:
sudo yum install google-authenticator
編譯安裝 Google 身份驗(yàn)證器服務(wù)器端組件
提示:編譯安裝建議對(duì) Linux、pam 等熟悉的同學(xué)采用。
首先,安裝構(gòu)建 Google 身份驗(yàn)證器所需的軟件包。
在 Debian、 Ubuntu 或 Linux Mint 上:
sudo apt-get install wget make gcc libpam0g-dev
在 CentOS、 Fedora 或 RHEL 上:
sudo yum install wget make gcc pam-devel
然后下載 Google 身份驗(yàn)證器服務(wù)器端組件的源代碼:
git clone https://github.com/google/google-authenticator-libpam.git
編譯安裝 Google 身份驗(yàn)證器服務(wù)器端組件:
cd google-authenticator-libpam
./bootstrap.sh
./configure
make
如果構(gòu)建成功,你會(huì)在目錄中看到 pam_google_authenticator.so 和 google-authenticator 兩個(gè)二進(jìn)制文件。
最后,將 Google 身份驗(yàn)證器的服務(wù)器端組件安裝到合適位置。其默認(rèn)會(huì)安裝到 /usr/local/lib/security 下,根據(jù)你的系統(tǒng)不同,你可能需要將其符號(hào)鏈接到 pam 庫(kù)的位置(比如 CentOS 7 會(huì)在 /usr/lib64/security)。如下圖所示:
sudo make install
至此,Google 身份驗(yàn)證器服務(wù)器端組件安裝完成。
配置 Google 身份驗(yàn)證器服務(wù)器端組件及“運(yùn)維密碼”小程序
完成 Google 身份驗(yàn)證器服務(wù)器端組件的安裝我們僅僅完成了第一步,接著需要對(duì) Google 身份驗(yàn)證器服務(wù)器端組件、“運(yùn)維密碼”、OpenSSH 進(jìn)行配置才能達(dá)到我們預(yù)期的效果。
配置 google-authenticator 及生成驗(yàn)證密鑰
使用以下命令生成驗(yàn)證密鑰:
./google-authenticator
生成驗(yàn)證密鑰的時(shí)候,會(huì)再次確認(rèn)信息。
Do you want authentication tokens to be time-based (y/n)
意思是:你想要生成基于時(shí)間生成驗(yàn)證碼嗎?這里需要需要輸入 y。
輸入 y之后你將看到一個(gè)代表著該“場(chǎng)景”密鑰的二維碼和密鑰字符串,它使用如下二維碼圖形格式表示我們數(shù)字形態(tài)的密鑰(這里也提供了一個(gè)用于在瀏覽器中再次顯示該二維碼的 URL,但是需要翻墻)。接著我們要用到它在“運(yùn)維密碼”上完成配置。(安裝 google-authenticator 過(guò)程中若出現(xiàn)二維碼無(wú)法顯示的問(wèn)題,請(qǐng)檢查系統(tǒng)中是否安裝了二維碼生成器:rpm - q qrencode,若未安裝,請(qǐng)運(yùn)行命令 yum install qrencode -y 安裝后重試。)
在二維碼和密鑰字符串后面,接著顯示了一個(gè)當(dāng)前的校驗(yàn)碼和幾個(gè)緊急密鑰。緊急密鑰你可以另行保存的一個(gè)安全的地方,以防你在無(wú)法使用 Google 身份驗(yàn)證器應(yīng)用或“運(yùn)維密碼”時(shí)使用(緊急密鑰是 8 位的,不同于普通的 6 位密鑰,也是一次性使用的)。
保存 Google 服務(wù)器端組件的配置文件,Google 身份驗(yàn)證器雖然運(yùn)行了,但是相關(guān)設(shè)置還沒(méi)有保存,接下來(lái)會(huì)提示保存:
Do you want me to update your "/root/.google_authenticator" file? (y/n)
意思是:你想將配置文件更新到 /root/.google_authenticator 保存嗎?
輸入 y 回車(chē)。
禁止同一令牌多次登錄
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n)
意思是:你是否要禁用同一密鑰多次登錄,這將限制你每 30 秒只能使用該密鑰登錄一次,但這能夠讓你可以更多地被提醒受到了中間人攻擊,甚至能夠防止這種攻擊。
輸入 y 回車(chē)。
時(shí)間容錯(cuò)設(shè)置
By default, tokens are good for 30 seconds. In order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with
poor time synchronization, you can increase the window from its default
size of +-1min (window size of 3) to about +-4min (window size of
17 acceptable tokens).
Do you want to do so? (y/n)
意思是:默認(rèn)情況下,密鑰在 30 秒內(nèi)有效,為了防止由于客戶端與服務(wù)器時(shí)間偏移(時(shí)間相差太大)導(dǎo)致認(rèn)證失敗,google 身份驗(yàn)證器設(shè)計(jì)了時(shí)間容錯(cuò)措施。可以讓你使用與當(dāng)前時(shí)間偏移 1 到 4 分鐘的密鑰。
這個(gè)可根據(jù)實(shí)際情況進(jìn)行配置,一般一分鐘就足夠了。
輸入 y回車(chē)。
暴力破解防護(hù)
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n)
意思是:為了避免暴力破解,可以啟用速率限制,默認(rèn)情況下,每 30 秒只能?chē)L試 3 次。
輸入 y回車(chē)。
配置完成
配置完成后會(huì)在home目錄下生成一個(gè)權(quán)限為 400 的隱藏文件,如下圖所示:
配置運(yùn)維密碼
打開(kāi)微信小程序
打開(kāi)微信,依次點(diǎn)擊“發(fā)現(xiàn)”,“小程序”,輸入“運(yùn)維密碼”并搜索。或長(zhǎng)按識(shí)別下列二維碼:
點(diǎn)擊“運(yùn)維密碼”進(jìn)入應(yīng)用,然后點(diǎn)擊列表下方的“添加場(chǎng)景”:
這會(huì)調(diào)起“掃一掃”功能,請(qǐng)掃描配置 google-authenticator 時(shí)所生成的二維碼,然后會(huì)識(shí)別出該場(chǎng)景信息,你可以根據(jù)需要修改場(chǎng)景信息,點(diǎn)擊確定添加場(chǎng)景。
這樣 Google 身份驗(yàn)證器就和“運(yùn)維密碼”匹配上了。下面我們要使 SSH 服務(wù)可以支持該驗(yàn)證。
配置 SSH 服務(wù)
添加認(rèn)證模塊
使用如下命令在 /etc/pam.d/sshd 文件添加認(rèn)證模塊:
echo "auth required pam_google_authenticator.so" >>/etc/pam.d/sshd
在 Centos 6.6 或更低的版本中如果遇到無(wú)法進(jìn)行 google-authenticator 驗(yàn)證的情況,請(qǐng)將 auth required pam_google_authenticator.so放在 /etc/pam.d/sshd 文件的最頂端進(jìn)行測(cè)試一下。
配置挑戰(zhàn)式密碼認(rèn)證:
sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
重啟 sshd 服務(wù):
systemctl restart sshd.service
切記,如果你是遠(yuǎn)程登錄到服務(wù)器上配置,切勿退出當(dāng)前的 SSH 會(huì)話,而應(yīng)該另外開(kāi)一個(gè)會(huì)話去測(cè)試 SSH 登錄。重啟不會(huì)中斷當(dāng)前的 SSH 會(huì)話。
測(cè)試登錄
以上配置完成基本上就搞定了,下面我們進(jìn)行測(cè)試。
密碼登錄測(cè)試
另外開(kāi)一個(gè)終端窗口進(jìn)行連接,不要關(guān)閉當(dāng)前的 SSH 連接。
輸入命令登錄主機(jī):
ssh root@10.112.2.3
首先輸入服務(wù)器的密碼,接著會(huì)讓輸入“運(yùn)維密碼”生成的 6 位數(shù)字密鑰。
如下圖:
我們可以看到,在登錄的時(shí)候,需要配合“運(yùn)維密碼”才能登錄服務(wù)器。
公鑰登錄測(cè)試
如果使用公鑰登錄呢?以上配置是不是也是需要配合“運(yùn)維密碼”才能登錄的,我們進(jìn)行驗(yàn)證一下:
首先,我們將本機(jī)的公鑰復(fù)制到遠(yuǎn)程機(jī)器的 authorized_keys 文件中。
ssh-copy-id root@10.112.2.3
登錄測(cè)試:
我們可以看到,不需要輸入任何密碼和一次性密鑰,直接登錄到了系統(tǒng)。
結(jié)合運(yùn)維密碼配置增強(qiáng)型SSH安全選項(xiàng)
針對(duì)上面公鑰登錄的測(cè)試,如果認(rèn)為還不是很安全,我們可以設(shè)定如下登錄場(chǎng)景:公鑰 + 密碼 + 運(yùn)維密碼,我們需要如何做呢?
配置 SSH 公鑰雙因子
修改 /etc/ssh/sshd_config 配置文件:
echo "AuthenticationMethods publickey,keyboard-interactive:pam" >>/etc/ssh/sshd_config
重啟 SSH 服務(wù):
systemctl restart sshd.service
登錄測(cè)試(同樣,請(qǐng)新開(kāi)窗口):
ssh root@10.112.2.3
可以看到,登錄的時(shí)候是需要驗(yàn)證公鑰、密碼,及輸入“運(yùn)維密碼”生成的密鑰才能登錄到系統(tǒng)。
沒(méi)有密鑰的情況下嘗試登錄測(cè)試,如下圖:
總結(jié)
至此,本文結(jié)束,更多的使用細(xì)節(jié)可以參照小程序內(nèi)的幫助,或此文。
如有錯(cuò)誤及不足歡迎指正。也歡迎大家加入到這個(gè)小程序的開(kāi)發(fā)當(dāng)中,將這個(gè)小程序應(yīng)用到你的應(yīng)用場(chǎng)景中。
文章名稱(chēng):SSH安全加固篇:通過(guò)“運(yùn)維密碼”小程序?qū)崿F(xiàn)SSH雙因子認(rèn)證
本文路徑:http://www.dlmjj.cn/article/cdihpgs.html


咨詢
建站咨詢
