译者 | 康少京
审校 | 梁策 孙淑娟
介绍
安全无小事。随着入侵事件数量与日俱增,据估计,到2025年,网络犯罪将给企业带来10.5万亿美元的损失。
所以,在技术堆栈之上构筑一个强大的安全层十分必要。在本文中,我们将展示如何使用多因素身份验证的SSH 实现安全。
SSH,即Secure Shell,它是一种网络协议,允许用户连接到远程机器(服务器)并访问资源。
SSH协议实现了两种安全类型,即基于密码的身份验证和基于密钥的身份验证。
与基于密码的身份验证相比,一般认为基于密钥的(公共->私有)身份验证更为安全,因此大多数SSH强化说明更建议禁用基于密码的身份验证,只启用基于密钥的身份验证。
但无论选择哪种身份验证机制,我们都可以通过实现多因素身份验证设置来提高SSH的安全性。
什么是多因素身份验证?
多因素身份验证(MFA)是一种安全的认证过程,它需要从独立的凭证类别中选择多种认证技术。
多因素身份验证也称为“双因子验证 (2FA)”。
在验证你的所述身份时,多因素身份验证涉及两个因素:
第一是创建用户账户时创建的密码。
第二是任何生成动态口令(OTP)的应用程序,或任何向设备发送短信或拨打电话的协议。
根据应用程序的实现方式,身份验证的方式会有所不同。MFA使用的一些常用工具包括:
- 安装在移动设备上生成令牌的应用程序。
- 如Yubikey 之类的外部设备。
- 指纹
- 面部识别
- 基于OTP密码的短信或来电
为了启用SSH多因素身份验证,我们将使用“Google Authenticator”应用程序。 它使用OATH-TOTP,以及Twilio Authy 或者FreeOTP等其他替代工具,你可以安装并试用。
我们将从在服务器和移动设备上安装Google Authenticator 应用开始,并尝试启用 MFA和验证。
安装谷歌身份验证器
首先通过playstore/Itunes在Android或IOS设备上安装Google Authenticator 应用程序。
现在,在Linux系统上安装Google Authenticator应用程序。
根据发行版本,运行以下安装命令。
在Ubuntu及其衍生发行版中,运行以下命令:
$ sudo dnf install google-authenticator -y
在基于RHEL的发行版中,运行以下命令:
$ sudo dnf install google-authenticator -y
对基于Arch 的发行版,运行以下命令;
$ sudo pacman -S libpam-google-authenticator
为用户生成初始令牌
作为设置MFA的第一步,你必须从终端运行以下命令。这将通过生成TOTP密钥来完成初始设置。此密钥适用于运行命令的用户,并不适用于系统中的所有用户。
$ google-authenticator
在某些步骤中,系统会提示你使用 (y/n) 选项。
第1步:它将提示你选择基于时间的身份验证令牌。基于时间的身份验证令牌将每30秒生成一个新代码。 按“y”继续。
运行Google身份验证器命令
第2步:秘密令牌将与二维码一起生成。打开Google Authenticator移动应用程序,扫描二维码或手动键入密钥来注册设备。完成后,现在应用程序将开始每30秒生成一次令牌。
密钥和验证码
第3步:在这一步中,它将提示你更新在主目录下的google_authenticator文件。所有的密钥、验证码、紧急刮擦码都保存在这个文件中。按“y”继续。
更新google_authenticator文件
第 4 步:若在这一步中选择“y”,令牌在进行身份验证后将立即过期。在这种情况下,即使一些黑客得到了你的令牌也会过期。
禁止多次使用相同的身份验证
第 5 步:这一步决定允许使用令牌个数以及时间范围。当选择“n”时,它将允许在90秒的窗口内使用3个令牌。如果我按“y”,它将在240秒的时间窗口内允许17个令牌。
令牌数量
第 6 步:此步骤将要求你启用速率限制。速率限制允许攻击者每30秒仅尝试3次登录尝试。如果令牌错误,那么他们必须等待N次重试。
限速
我们已经完成了第一步。打开文件~/.google_authenticator,你可以找到这些步骤做的所有设置和密码。
$ cat ~/.google_authenticator
查看 google_authenticator 设置
你还可以将参数传递给google-authenticator命令,该命令将创建密钥和其他设置,而无需执行这一系列步骤。
$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3
请参阅 google-authenticator help部分,了解这些参数的作用。
$ google-authenticator --help
显示 google-authenticator help部分
为多因素身份验证配置 SSH
在使用MFA前,我们必须对 openSSH 进行一些配置更改。
注:
最佳实践总是要求在任何更改之前备份配置文件。如果出现任何问题,还有恢复更改的余地。
那么在更改SSH配置文件时,请确保单独打开一个会话,这样你就不会将自己锁在外面了。
运行以下命令来备份SSH配置文件。
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup
首先,通过将 ChallengeResponseAuthentication选项设置为“yes”来启用,使SSH 能够使用MFA。
配置SSH以使用 MFA
接下来,编辑 /etc/pam.d/sshd 文件:
$ sudo vi /etc/pam.d/sshd
同时在文件底部添加以下内容:
auth required pam_google_authenticator.so nullok
auth required pam_permit.so
编辑 sshd Pam 配置文件
如果希望所有用户都必须使用MFA,请删除“nullok”一词。
重新启动 SSH 服务以使更改生效。
$ sudo systemctl restart sshd
测试双因素身份验证
接下来测试所做的更改是否生效:
通过SSH连接到服务器,系统会要求你输入密码作为第一因素,然后输入验证码作为第二因素身份验证,如下图所示。
$ ssh username@hostname/IPaddress
测试双因素身份验证
输入SSH密码和验证码后,就可以登录了。
由于我们没有为所有用户强制启用MFA,现在我们测试一下,看看是否能够连接到另一个没有生成和设置令牌的用户。
我有一个testuser ,能够在不需提示,输入验证码的情况下连接成功。
使用备用用户连接
看来, 也可以不用验证码登录。
基于密钥认证的多因素身份验证
如果你设置了基于密钥的身份验证,那么密码或验证码将不会提供。
因为默认情况下,SSH首先使用公钥身份验证,如果找到了密钥,则使用该密钥进行身份验证。如果找不到密钥,它将使用基于密码的身份验证。
你可以使用详细模式来检查这一点。
$ ssh -v username@hostname/IPaddress ## With verbose
带有详细模式的 SSH
在/etc/ssh/sshd_config文件的底部添加以下内容:
AuthenticationMethods publickey,password publickey,keyboard-interactive
接下来打开/etc/pam.d/sshd 并注释掉以下行。
通用认证
如果你没有注释掉"@include common-auth",那么它将启用两个以上的因素进行身份验证。首先它使用密钥进行身份验证,然后是密码和令牌。由于我只需要一个密钥和令牌来进行身份验证,所以要将它禁用。
三因素身份验证
重新启动sshd服务并测试更改是否正常。
$ sudo systemctl restart sshd
现在,如果我尝试连接,它使用公钥作为第一因素,验证码作为第二因素进行身份验证。
密钥和验证码
恢复步骤
在某些情况下,你可能会丢失或更换移动设备,这时你必须重新安装 google-authenticator应用程序并注册密钥才能开始生成令牌。
如果你被锁定在系统之外,那么就必须要联系系统管理员,为你提供注册和使用的新密钥。但是,你也可以通过另一种方法登录并自行生成密钥。
还记得在初始步骤中生成的代码吗?你可以使用紧急刮擦码作为登录的令牌。每个刮擦码只能使用一次,它可以保存在安全的地方,以便在最需要的时候使用。
代码保存在 ~/.google_authenticator 文件中。
$ cat ~/.google_authenticator
刮码
现在可以运行以下命令重新生成自己的密钥。
$ google-authenticator
结论
本文展示了如何安装谷歌身份验证器,以及使用不同配置为SSH启用多因素身份验证的方式。
作为管理员,你还可以编写bash脚本来自动生成密钥并与用户共享。在设置 MFA 之前,还应加强SSH让系统更安全。
作者介绍
卡尔希克(Karthick)是一位充满热情的软件工程师,喜欢探索新技术。他是一位公众讲师,喜欢撰写Linux和开源等方面的技术文章。
译者介绍
康少京,51CTO社区编辑,目前从事通讯类行业,底层驱动开发岗位,研究过数据结构,Python,现对操作系统和数据库等相关领域感兴趣。
原文标题:How To Setup Multi-Factor Authentication For SSH In Linux,作者:Karthick