SSH 設定 Google Authenticator 做2FA驗證

為避免SSH 暴力攻擊或密碼遭到外洩,開啟雙因子身份驗證 (2FA) 似乎正在成為一種常態,
越來越多的資安人員正在推動組織,針對每個敏感系統和應用程序開始使用 2FA。
可以理解因為密碼已不足以保護當今時代的資訊安全。

以下摘自維基百科:

基於時間的一次性密碼演算法(英語:Time-based One-Time Password,簡稱:TOTP)是一種根據預共享的金鑰與當前時間計算一次性密碼的演算法。它已被網際網路工程任務組接納為RFC 6238標準[1],成為主動開放認證(OATH)的基石,並被用於眾多多重要素驗證系統當中。

TOTP是雜湊訊息鑑別碼(HMAC)當中的一個例子。它結合一個私鑰與當前時間戳,使用一個密碼雜湊函式來生成一次性密碼。由於網路延遲與時鐘不同步可能導緻密碼接收者不得不嘗試多次遇到正確的時間來進行身分驗證,時間戳通常以30秒為間隔,從而避免反覆嘗試。

也就是說只要能產生基於TOTP演算法的 secret key,用戶端就能透過手機APP來安裝各種驗證器來進行一次性密碼驗證,目前比較知名的是 Microsoft Authenticator、Google Authenticator、FreeOTP(更新停在2016年,較不建議)....

作業系統:Rocky Linux 8.6

# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

# dnf install google-authenticator qrencode qrencode-libs

# google-authenticator

按下yes
Do you want authentication tokens to be time-based (y/n) y
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
  https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/root@localhost.localdomain%3Fsecret%3DBATEXDGQ4RYDI3DTJGC5U3TU4M%26issuer%3Dlocalhost.localdomain

QR Code 圖示,請用手機開啟 Google Authenticator APP 新增 QR Code 做掃描

Your new secret key is: BATEXDGQ4RYDI3DTJGC5U3TU4M
Enter code from app (-1 to skip): 578634      (輸入手機掃描後的Code碼)
Code confirmed
Your emergency scratch codes are:
  95942226
  63201121
  71136575
  70745143
  68793498

Do you want me to update your "/root/.google_authenticator" file? (y/n) y

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) y

By default, a new token is generated every 30 seconds by the mobile app.
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. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) y

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) y

-----------------------------------------------------------------------------------------------------------------

# vi /etc/pam.d/sshd

如果不要輸入密碼驗證的話,就註解掉第一行
#auth       substack     password-auth

新增 Google Authenticator 身份驗證器:
auth       required     pam_google_authenticator.so secret=${HOME}/.google_authenticator nullok

附註1:如果在pam.d 這目錄內的 login 檔案加入上行,就可以在本機console上進行2FA
附註2:nullok 代表允許使用者在未設定一次性密碼機制的情況下,可以不必使用一次性密碼驗證
-----------------------------------------------------------------------------------------------------------------
SSH 設定開啟挑戰-回應 (challenge- Response)型密碼

# vi /etc/ssh/sshd_config

ChallengeResponseAuthentication yes

存檔後,將服務重啟
# systemctl restart sshd.service
-----------------------------------------------------------------------------------------------------------------

另外,由於google-authenticator預設採用TOTP演算法來產生一次性密碼,因此Linux系統上的時間最好與手機的時間不要差距過大,以避免可能產生無法匹配的一次性密碼。

如下圖,進行2次驗證成功!


留言

這個網誌中的熱門文章

VMware ESXi OVF Tool 指令模式 匯出、匯入 OVA

軛瓣蘭 (Zygopetalum) 種植日記

ETF 月月配息組合