为你的CVM设置SSH密钥吧!

简介

认证是用于证明您有权执行某项操作的信息,例如登录到系统。认证通道是身份验证系统向用户传递因素或要求用户回复的方式。通俗的来讲,密码和安全令牌就是身份验证证明,计算机和电话是就是身份验证的通道。

默认情况下,SSH使用密码进行身份验证,大多数服务商都建议使用SSH密钥。然而,这仍然只是一个单一的因素。如果一个黑客已入侵了你电脑个人计算机,那么他们也可以使用您的密钥来破坏您的服务器。·

在本教程中,我们将设置多因素身份验证来解决这一问题。多因素认证(MFA)需要多个因素才能进行身份验证或登录。这就如如同着一个糟糕的演员要想进入市场,就必须做出多方面的妥协。不同类型的因素通常概括为:

  1. 一些是你道的,就像密码或安全问题一样。
  2. 一些是你的,类似于身份验证应用程序或安全令牌。
  3. 一些是你本身就有的,就像你的指纹或声音

本文将简介OATH-TOTP(基于开放身份验证的一次性密码)是一种开放协议,它生成一个一次性使用密码,通常是一个6位数,每30秒回收一次。

本文将介绍如何启用SSH身份验证,除了使用SSH密钥外,还将使用OATH-TOTP应用程序。然后,通过SSH登录到服务器需要跨两个通道的两个因素,从而使其比单独的密码或SSH密钥更安全。此外,我们还将介绍一些MFA的其他用例以及一些有用的技巧和技巧。

准备

要参考本教程,您需要:

第一步、安装Google的PAM

在这个步骤中,我们将安装和配置Google的PAM。

PAM,可插拔认证模块,用于对用户进行身份验证的Linux系统上的身份验证基础结构。因为Google做了一个OATH-TOTP应用程序,还制作了一个PAM,它可以生成TOTP,并且与任何OATH-TOTP应用程序完全兼容,比如Google身份验证程序或Authy.

首先,我们需要添加Epel。

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

接下来,安装PAM。如果这是第一次使用,您可能会被提示接受Epel密钥。

sudo yum install google-authenticator

安装PAM后,我们将使用PAM附带的应用程序为您想要添加第二个因素的用户生成一个TOTP密钥。此密钥是按用户生成的,而不是在系统范围内生成的。这意味着每个想要使用TOTP auth应用程序的用户都需要登录并运行助手应用程序才能获得自己的密钥;您不能只运行一次(但是在本教程的末尾有一些提示可以为许多用户设置或要求MFA)。

运行初始化应用程序。

google-authenticator

运行命令之后,您将被问到几个问题。第一个问题是,身份验证令牌是否应该是基于时间的。

Do you want authentication tokens to be time-based (y/n) y

PAM允许基于时间或顺序的令牌,使用基于时间的令牌意味着验证码在经过一定时间后会随机变化。我们将坚持以时间为基础,因为这是像google身份验证这样的应用所预期的,所以请回答。y表示是的。

在回答了这个问题后,许多输出将滚动过去,包括一个大的QR代码。此时,使用您手机上的身份验证程序扫描QR代码或手动输入密钥。如果QR代码太大,无法扫描,您可以使用QR代码上面的URL来获得更小的版本。一旦添加,你将看到一个六位数的验证码,每30秒在你的应用程序中改变一次。

注意:确保密钥、验证代码和恢复代码记录在安全的地方,如密码管理器。如果您失去了对TOTP应用程序的访问权限,恢复代码是恢复访问权限的唯一方法。

剩下的问题告诉PAM如何发挥作用。我们一个一个地检查他们。

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

这会将输入和选项.google_authenticator档案。如果您说不,程序退出,什么也不写,这意味着认证者将无法工作。

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

回答“是”允许在一个移动的四分钟窗口中最多有8个有效代码。回答“否”,将其限制为3个有效代码。除非您发现1:30分钟窗口存在问题,否则回答“否”是更安全的选择。

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

速率限制意味着远程攻击者在被阻止之前只能尝试一定数量的猜测。如果您以前没有将速率直接限制在SSH中,那么现在这样做是一种很好的强化技术。

:一旦您完成此设置,如果您想备份您的秘密密钥,您可以复制~/.google-authenticator文件到受信任的位置。您可以在其他系统上部署它,或者在备份之后重新部署它。

现在已经安装并配置了Google的PAM,下一步是配置SSH以使用TOTP密钥。我们需要告诉SSH有关PAM的信息,然后配置SSH来使用它。

第二步、配置OpenSSH

我们将在SSH上进行更改,所以不要关闭初始SSH连接的。相反,打开第二个SSH会话来进行测试。这是为了避免在SSH配置中出现错误时将自己锁在服务器之外。一旦一切正常,您就可以安全地关闭任何会话。

首先,我们在这里编辑sshd配置文件,默认情况下没有安装在CentOS上。你可以用sudo yum install nano,或者使用您最喜欢的替代文本编辑器。

sudo nano /etc/pam.d/sshd

将以下行添加到文件的底部。

# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare
auth required pam_google_authenticator.so nullok

nullok最后一行末尾的文档告诉PAM,此身份验证方法是可选的。这允许未经OATH-TOTP令牌的用户仍然可以使用他们的SSH密钥登录。一旦所有用户都有了OATH-TOTP令牌,您就可以删除nullok使MFA成为强制性的。

保存并关闭文件。

接下来,我们配置SSH以支持这种身份验证。打开SSH配置文件进行编辑。

sudo nano /etc/ssh/sshd_config

寻找ChallengeResponseAuthentication行。并取消注释no行。

. . .
# Change to no to disable s/key passwords
ChallengeResponseAuthentication yes
#ChallengeResponseAuthentication no
. . .

保存并关闭文件,然后重新启动SSH以重新加载配置文件。重新启动sshd服务不会关闭打开的连接,因此您不会使用此命令锁定自己的风险。

sudo systemctl restart sshd.service

要测试到目前为止一切是否正常,请打开另一个终端并尝试通过SSH登录。如果您以前创建了一个SSH密钥并正在使用它,您将发现您不必输入用户的密码或MFA验证代码。这是因为默认情况下,SSH密钥覆盖所有其他身份验证选项。否则,您应该得到一个密码和验证代码提示。

如果您想确保到目前为止所做的工作,请在打开的SSH会话中导航到~/.ssh/并临时重命名authorized_keys文件,并打开一个新会话,并使用我们的密码和验证代码登录。

cd ~/.ssh
mv authorized_keys authorized_keys.bak

一旦您验证了您的TOTP令牌是否工作,就可以将‘Authorizedkeys.bak’文件重命名为原来的文件。

mv authorized_keys.bak authorized_keys

接下来,我们需要启用SSH密钥,验证代码作为第二个,并告诉SSH使用哪些因素需要阻止SSH密钥覆盖所有其他类型。

第三步、使SSH了解MFA

重新打开sshd配置文件

sudo nano /etc/ssh/sshd_config

在文件底部添加以下行。这一行告诉SSH,我们需要一个SSH密钥,或者一个密码或一个验证代码。

. . .
# Added by DigitalOcean build process
ClientAliveInterval 120
ClientAliveCountMax 2
AuthenticationMethods publickey,password publickey,keyboard-interactive

保存并关闭文件。

接下来,打开PAM的sshd再次配置。

sudo nano /etc/pam.d/sshd

找到auth substack password-auth文件。添加一个#字符作为行中的第一个字符。这告诉PAM不要提示输入密码。

. . .
#auth       substack     password-auth
. . .

保存并关闭文件,然后重新启动SSH。

sudo systemctl restart sshd.service

现在,尝试使用不同的会话再次登录到服务器。与上次不同,SSH应该要求您的验证代码。尽管您没有看到使用SSH密钥的任何指示,但您的登录尝试使用了两个因素。如果要验证,可以在SSH命令之后添加-v(用于详细说明):

. . .
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug1: Next authentication method: keyboard-interactive
Verification code:

在输出的末尾,您将看到SSH使用SSH密钥,然后询问验证代码。现在您可以使用SSH密钥和一次性密码登录SSH。如果要强制执行所有三种身份验证类型,可以执行下一步。

第四步、添加第三个验证(可选)

在步骤3中,我们在sshd_config添加了三个内容:

  1. publickey(SSH密钥)
  2. password publickey(密码)
  3. keyboard-interactive(核查代码)

尽管我们列出了三个不同的因素,但是到目前为止我们选择的选项只允许SSH密钥和验证代码。如果您希望拥有所有三个因素(SSH密钥、密码和验证代码),一个快速更改将启用这三个因素。

打开PAM的sshd配置文件

sudo nano /etc/pam.d/sshd

找到您之前注释掉的行#auth substack password-auth,并通过移除#符合。保存并关闭文件。现在,再次重新启动SSH。

sudo systemctl restart sshd.service

通过启用选项auth substack password-auth,PAM现在将提示输入一个密码,另外还将检查SSH密钥并请求一个验证代码。现在,我们可以在两个不同的通道上使用我们知道的东西(密码)和两种不同类型的东西(SSH密钥和验证代码)。

到目前为止,本文已经概述了如何使用SSH密钥和基于时间的一次性密码启用MFA。如果这是你所需要的,你可以在这里结束。然而,这并不是进行多因素身份验证的唯一方法。下面是使用这个PAM模块进行多因素身份验证的几种额外方法,以及一些恢复、自动使用等技巧和技巧。

技巧

提示1-恢复访问

丢失SSH密钥或TOTP密钥

如果您丢失了SSH密钥或TOTP密钥,则可以将恢复分成几个步骤。第一个是在不知道验证代码的情况下返回,第二个是查找秘密密钥或为正常的MFA登录重新生成密钥。

您可以登录腾讯云服务器的控制台,在这个页面下重新设置密钥。

否则,您将需要一个具有sudo访问权限的管理用户;确保不为该用户启用MFA,而只使用一个SSH密钥。

一旦登录,有两种方法可以帮助获取TOTP秘密:

  1. 恢复现有密钥
  2. 生成新密钥

在每个用户的主目录中,秘钥和Google身份验证设置保存在~/.google-authenticator这个文件。第一行是一个密钥。获取密钥的一种快速方法是执行以下命令,该命令显示google-authenticator文件(即秘密密钥)。然后,获取这个秘密密钥并手动将其输入到一个TOTP应用程序中。

head -n 1 /home/sammy/.google_authenticator

如果有理由不使用现有密钥(例如,无法安全地与受影响用户共享密钥或现有密钥已被破坏),则可以删除~/.google-authenticator直接归档。这将允许用户仅使用一个因素再次登录,前提是您没有通过删除‘/etc/pam.d/sshd’文件中的nulllok来强制MFA。这样就可以使用google-authenticator生成新密钥。

无法访问TOTP应用程序

如果您需要登录到您的服务器,但无法访问您的TOTP应用程序来获取您的验证代码,您仍然可以使用第一次创建秘密密钥时显示的恢复代码登录。请注意,这些恢复代码是一次性使用的。一旦用于登录,就不能再次用作验证代码。

提示2-更改身份验证设置

如果希望在初始配置之后更改mfa设置,而不是使用更新的设置生成新配置,则只需编辑~/.google-authenticator文件。该文件以下列方式排列:

<secret key>
<options>
<recovery codes>

在件设置的选项在Options部分中有一行,如果在初始设置期间对特定选项回答“no”,则相应的行将被排除在文件中。

下面是您可以对该文件进行的更改:

  • 若要启用顺序代码而不是基于时间的代码,请更改行TOTP_AUTHHOTP_COUNTER 1.
  • 若要允许多个使用单个代码,请删除行DISALLOW_REUSE.
  • 若要将代码过期窗口扩展到4分钟,请添加行WINDOW_SIZE 17.
  • 若要禁用多个失败登录(速率限制),请删除行RATE_LIMIT 3 30.
  • 若要更改速率限制的阈值,请查找该行。RATE_LIMIT 3 30调整数字。3表示在一段时间内尝试的次数,而30指示以秒为单位的时间段。
  • 若要禁用恢复代码的使用,请删除文件底部的5位8位代码。

提示3-避免某些帐户的MFA

在这种情况下,一个用户或几个服务帐户需要SSH访问,而不启用MFA。一些使用SSH的应用程序,比如一些FTP客户端,可能不支持MFA。如果应用程序没有方法请求验证代码,则请求可能会被阻塞,直到SSH连接超时。

/etc/pam.d/sshd如果设置正确,则可以控制按用户使用的因素.

若要允许某些帐户的MFA和仅用于其他帐户的SSH键,请确保在/etc/pam.d/sshd

#%PAM-1.0
auth       required     pam_sepermit.so
#auth       substack     password-auth

. . .

# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare
auth       required      pam_google_authenticator.so nullok

这里auth substack password-auth被注释,因为密码需要禁用。如果某些帐户打算禁用mfa,请保留nullok最后一行的选项。

设置此配置后,只需运行google-authenticator作为任何需要MFA的用户,并且不为只使用SSH键的用户运行MFA。

技巧4-使用配置管理自动设置

google-authenticator支持命令行开关,以设置单个非交互式命令中的所有选项。要查看所有选项,可以输入google-authenticator --help。下面是第1步中列出的设置所有内容的命令:

google-authenticator -t -d -f -r 3 -R 30 -W

提示5-强制所有用户使用MFA

如果您希望强制所有用户使用MFA,或者您不希望依赖您的用户来生成他们自己的密钥,那么有一个简单的方法来处理这个问题。您可以简单地使用相同的.google-authenticator文件,因为文件中没有存储特定于用户的数据。

为此,在最初创建配置文件之后,特权用户需要将该文件复制到每个主目录的根目录,并将其权限更改为相应的用户。您也可以将文件复制到/etc/skel/因此,它会在创建时自动复制到新用户的主目录中。

另一种强制创建用户密钥的方法是使用bash脚本:

  1. 创建TOTP令牌,
  2. 提示他们下载Google身份验证应用程序并扫描将显示的QR代码,以及
  3. 在检查.google-authenticator文件已经存在之后运行google-authenticator

要确保脚本在用户登录时运行,可以将其命名为.bash_login并将其放在主目录的根目录下。

结语

也就是说,有两个因素(SSH密钥+MFA令牌)及两个通道(您的计算机+您的电话),使外部代理很难通过SSH强行进入您的计算机,并极大地提高了您的机器的安全性。快去腾讯云免费的开发者专属在线实验平台进行试验吧!


参考文献:《How To Set Up Multi-Factor Authentication for SSH on CentOS 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04上为用户目录设置vsftpd

FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。许多休闲网民希望直接用ht...

2450
来自专栏网络

如何使用Burp和Magisk在Android 7.0监测HTTPS流量

HTTPS拦截的基本方法 在Android平台上拦截HTTPS流量其实并不复杂,它只需要几步便可以实现: 1.将Burp设置为我们的代理; 2.访问http:/...

5617
来自专栏云知识学习

如何让服务端同时支持WebSocket和SSL加密的WebSocket

要服务端同时支持ws与wss并不容易,其难点主要在于:wss通道必须在TCP连接刚建立时(收发消息前)就要先进行SSL加密,否则,后续的通信将无法正常进行。如此...

50418
来自专栏Linyb极客之路

HTTPS安全最佳实践

HTTPS对于保护你的网站至关重要。但是你还需要避免许多陷阱 1. 没有混合内容

1763
来自专栏Kirito的技术分享

八幅漫画理解使用JSON Web Token设计单点登录系统

博主前言 这篇转载的文章和上一篇《JSON Web Token - 在Web应用间安全地传递信息》文章均为转载,是我个人在研究 jwt 时浏览下来发现的两篇质...

3585
来自专栏Java技术栈

WEB攻击手段及防御第3篇-CSRF

概念 CSRF全称即Cross Site Request forgery,跨站点请求伪造,攻击者通过跨站点进行伪造用户的请求进行合法的非法操作,其攻击手法是通过...

3358
来自专栏惨绿少年

SSH服务详解

第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Wo...

3760
来自专栏杨建荣的学习笔记

MySQL密码加密认证的简单脚本

mysql: [Warning] Using a password on the command line interface can be insecure.

1375
来自专栏IT可乐

邮件实现详解(一)------邮件发送的基本过程与概念

  相信大家在日常工作生活中少不了和邮件打交道,比如我们会用邮件进行信息交流,向上级汇报日常工作;再比如大家熟悉的某个WEB系统注册阶段,通常会有一个功能,点击...

4199
来自专栏编程

App与后台通信:从文本协议到二进制协议

本文主要总结了心悦俱乐部 App 的接入层从文本协议到二进制 jce 协议迭代过程中的技术方案。

1.6K10

扫码关注云+社区

领取腾讯云代金券