PAM是linux系统身份验证的核心,在用户登录/ssh身份校验中均有很大用途。但是很少有人想到,其实这个东西还可以用google authentication来进行身份校验。

安装

sudo apt-get install libpam-google-authenticator

设定

使用前,需要对用户做一个用户级配置,生成配置文件。这个文件就是这个用户的身份验证凭证。配置请使用用户执行google-authenticator

上来先会问你是否使用基于时间的验证,肯定选是。但是注意,基于时间的验证要求服务器时间必须精确。更准确的说,是服务器时间和手机时间校准在30秒以内。由于手机一般都采用GSM校时,因此只需要在意服务器时间。建议是使用ntpdate来校准时间。特别注意,linux的时钟是会漂移的,必须按天级校准。

然后程序会给出一个url,还可能有QR码(真够不容易的,Console级别的QR码。。。)。记住,一定要用url去获得QR码给程序扫描。因为url获得的QR码算法是最新的,而直接生成的有可能不能跑。

下面是secret key和verification code,一般来说这两个不用关心。但是你需要记住emergency scratch codes。libpam-google-authenticator默认给你生成了5个,一般都够用了。通常用到3个就更新一遍吧。

  • 是否生成配置,选是。
  • 是否拒绝使用同一个token的人登录。如果选是,30秒内只能登录一个人。建议选是。
  • 是否放送时间验证,从1分30秒到4分钟。如果选是,允许更大的服务器时间偏差。看你服务器时间是不是够准。
  • 是否防止暴力破解,30秒内尝试不超过3次。建议选是。

OK,你的配置就完成了。如果有多个用户,请多次配置。

手机app

按照系统安装以下app,下面以android版为例介绍。

选择setup account,然后scan a barcode。程序会要求你使用barcode扫描软件扫描(推荐barcode scanner)。这时去扫描设定一节中访问url显示的那个qr码。

pam配置

对于ssh而言,请在/etc/pam.d/sshd的最后一行增加这句。

auth required pam_google_authenticator.so

注意,这样其实是密码/校验码双重验证。如果你不需要密码请注释掉下面这句。

@include common-auth

或者其他包含以下这句的地方。

auth    required            pam_permit.so

如果你希望增强sudo安全性,也可以把这句加入/etc/pam.d/sudo后面。如果同样不需要密码,请注释上面那句。

sshd配置

保证/etc/ssh/sshd_config里面,以下参数都处于正确的配置。

ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes

如果你使用openssh6.2以上版本,请额外加入这句以开启publickey和验证同时启用。

AuthenticationMethods publickey,keyboard-interactive

sudo

注意,如果是NOPASSWORD,则没有校验。

参考和鸣谢

  1. Why enable SSH Two-Factor Authentication on your server?
  2. Use Google Authenticator For Two-Factor SSH Authentication in Linux
  3. Google Authenticator For SSH

感谢Scott Miller在引用2中的回答,AuthenticationMethods这个细节在其他文献中没有提及。