Linux添加Google验证

PAM(Pluggable Authentication Modules)是Linux系统上用户对用户进行身份验证对身份验证基础结构。

Google Autherticator或其他Authy程序兼容Google设计的TOTP的PAM。

本文基于Debian 11本地会话进行配置,
如果您通过远程会话进行配置,请确保时刻有一个ssh连接,避免在配置后无法登录ssh服务器的情况

安装Google-PAM

Arch

Debian

1
2
3
apt update
apt install libpam-google-authenticator
apt install qrencode

Centos

为用户生成身份验证令牌

运行身份验证程序。

1
google-authenticator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Do you want authentication tokens to be time-based (y/n) y
让身份验证令牌基于时间

/*确定之后这里会显示二维码,,以及五组应急恢复密钥*/
12345678
87654321
12345678
87654321
12345678

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, 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) n
/*调整时间同步*/

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
/*30秒尝试3次登录*/

配置OpenSSH

1
vim /etc/pam.d/sshd

在最后添加以下内容

1
2
3
4
# Standard Un*x password updating.
@include common-password
#auth required pam_google_authenticator.so
auth required pam_google_authenticator.so nullok

nullok的内容表明是OATH-TOTP令牌登录是可选的、没有该令牌用密码/密钥也能登录。我这边是强制使用。

1
vim /etc/ssh/sshd_config

找到 ChallengeResponseAuthentication 并设置为 yes

保存并关闭文件,重新启动 SSH 来重新加载配置文件。

1
systemctl restart sshd.service

配置两步验证

1
vim /etc/ssh/sshd_config

需要确保UsePAM开启
添加以下内容
表明连接服务器需要有publickey+用户密码 或者是有publickey+OAUTH令牌

1
AuthenticationMethods publickey,password publickey,keyboard-interactive

这里当然也可以改成其他的。比如修改成只允许OAUTH令牌、要求publickey+OAUTH令牌等。

1
vim /etc/pam.d/sshd

注释掉@include common-auth告诉服务器SSH不需要提示输入密码。如果需要用三种方式来验证就不需要注释该行

1
#@include common-auth

other

通过观察/etc/pam.d/其他文件,也可以发现有其他的配置文件。比如sudo,,

我们也可以为sudo添加OAUTH认证,只需要在/etc/pam.d/sudo下添加

1
auth required pam_google_authenticator.so

同时 /etc/sudoers 文件的用户不能有NOPASSWD选项否则该认证就不会生效。

相应的,如果在su配置文件下添加

1
auth required pam_google_authenticator

那么在a用户切换b用户时,同样需要使用b用户的OAUTH一次性密码才能登录。

试了下passwd好像不能直接这样改,,有空得研究一下。。