在PAM中使用google authentication
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,则没有校验。
参考和鸣谢
- Why enable SSH Two-Factor Authentication on your server?
- Use Google Authenticator For Two-Factor SSH Authentication in Linux
- Google Authenticator For SSH
感谢Scott Miller在引用2中的回答,AuthenticationMethods这个细节在其他文献中没有提及。