在Amazon EC2 Linux主机上保障SSH安全

曾经在初创企业当中工作过的朋友一定很清楚,建立客户信任是业务发展当中的关键性一步。时至今日,用户对于技术及安全性的理解越来越深入,他们希望供应商能够为数据提供严格保护,同时确保服务坚实可靠。除此之外,客户的心态往往反复无常,而且通常会在发现现有方案存在安全隐患时毫不犹豫地投向竞争对手的怀抱。为了避免这种情况的发生,大家采取的第一项举措应当是从基于AWS的业务流程下手,锁定指向Amazon EC2——也就是负责运行业务应用程序的AWS服务——的访问活动。

AWS共享安全模式与Amazon EC2

AWS共享安全模式的一大关键性组成部分在于其以安全方式访问Amazon EC2实例的能力。在Linux服务器当中,远程访问通常意味着通过SSH协议建立一条通往目标服务器的连接。其验证机制主要分为两种,要么要求使用者提供用户名与密码组合,要么提供一套指向服务器中公共密钥以实现验证的私人密钥。在默认情况下,大部分Amazon EC2实例都会使用后种方式实现用户验证:当大家第一次启动自己的EC2实例时,系统会要求各位以可选项目方式为其分配一条密钥对。除了用户名之外,AWS还会为该密钥对分配一个PEM文件,旨在同服务器进行验证并开启一个SSH会话。

在今天的文章中,我们将共同探讨与通过SSH访问运行在AmazonEC2之上的Linux服务器相关的安全议题。此外,我们还将深入了解多项示例,看看如何利用以下两套解决方案将双因素验证引入SSH会话当中:即TOTP配合谷歌Authenticator与AWS Virtual MFA,以及来自Duo Security公司的Duo UNIX。

利用双因素验证机制降低安全风险

在启用交互式登录机制的情况下,我们所操作的服务器始终面临着一定程度的风险——当然,具体程度有高有低。只要我们能够充分保护好自己的PEM文件,而EC2实例当中的SSH又得到了正确设置,那么基于密钥的验证机制在安全性方面往往优于简单的用户名/密码机制——这主要是由于前者更难受到暴力破解型攻击的影响。遗憾的是,PEM文件——比如密码——能够进行共享,而且有时会不慎泄露。考虑到这一点,加入一套以双因素验证为典型代表的额外安全层就显得尤为重要。无论是使用用户名/密钥组合还是公共密钥作为首选验证因素,额外安全层的存在都能让业务体系的保护水平更上一层楼。

双因素验证,或者说多因素验证(简称MFA),要求用户提供多种身份证明以实现对资源的访问。举例来说,大家可以对指向AWS管理控制台的访问进行配置,要求用户在输入用户名及密码之外,同时提供来自硬件或者软件MFA设备的正确验证码。这类方案目前亦被越来越多地应用于为服务器及工作站添加额外安全层。在此类方案中,除了提供私人密钥或者用户名/密码之外,用户还必须输入来自MFA设备的验证码,而后会话才会在操作系统之上得到开启。

我们在现场亲眼见证的用例之一就是将双因素验证引入到“跳转”或者“堡垒”主机之上以提升EC2实例的安全水平,从而保证那些直接指向或者被重新定位至面向内部服务的SSH端口受到理想保护。另一类常见用例则是利用双因素验证对EC2实例进行配置,同时通过锁定策略将其分配至AWS身份与访问管理(简称AWS IAM)角色。在此基础之上,技术支持与运维团队能够安全地接入这些EC2实例并使用AWS CLI及SDK,而不必再提供其它认证凭证。

基于时间的一次性密码(简称TOTP)

谷歌Authenticator能够利用RFC 6238实现TOTP算法。当大家将谷歌Authenticator应用程序安装在自己的Amazon EC2实例当中时,AWS会自动生成一条密钥。这一密钥随后会根据大家的具体选择并共享至第二台设备当中,例如通过运行在智能手机之上的某款应用程序。当我们利用该移动应用程序扫描由谷歌Authenticator所生成的二维码时,密钥的交换过程也就借此完成了。

一旦密钥被保存在移动应用当中,它会利用加密散列功能将自身与当前时间戳加以结合,从而生成一次性密码(即OTP)。这条OTP正是第二项验证因素,大家会在成功输入用户名/密码或者提供PEM文件之后被要求将其输入。OTP内容很难被破解,这是因为它会随着时间推移而自动变更——这一时间周期通常为30秒——而且由大家大多数情况下随身携带着的移动设备(例如智能手机)负责生成。

大家可以从一系列TOTP兼容移动应用当中作出自己的选择,利用它来保存TOTP密钥并生成OTP。在今天的文章中,我们将展示如何利用谷歌Authenticator与AWS Virtual MFA来实现这一目标:前者运行在服务器端,后者则作为TOTP兼容移动应用负责生成验证所需的OTP。当然,其它高人气TOTP兼容移动应用还包括谷歌Authenticator的官方移动应用、Duo Security的移动应用Duo Mobile以及Authy等等。

如何利用谷歌Authenticator与AWS VirtualMFA为Amazon Linux环境实现双因素验证

1.  在我们的手机上安装AWS Virtual MFA或者其它任何TOTP兼容性移动应用程序

2.  启用一项Amazon Linux EC2实例

3. 安装谷歌Authenticator:

sudo yuminstall google-authenticator –y

4. 启用谷歌Authenticator

[ec2-user@ip-10–0–1–205~]$ google-authenticator
Do you want authentication tokens to be time-based (y/n) y

5. 在提示“Do you want authentication tokens tobe time-based (y/n)”时,按下y键配置系统以使用基于时间的验证标记。

6. 打开由谷歌Authenticator所生成的URL,以显示我们可以利用移动应用程序扫描并下载对应密钥内容的二维码。例如:

https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/ec2-user@ip-10-0-1-205%3Fsecret%12345ABCDE

这时我们的新密钥为: 12345ABCDE

在Amazon EC2 Linux主机上保障SSH安全_第1张图片

7.下面说说其它选项。由于Amazon EC2实例在默认情况下会利用可靠的NTP服务器进行时间同步,因此我们不需要另行调整时间差。多次使用与频率限制则属于可选方案;当然,我建议大家保持其启用,因为这样能够进一步提升安全效果。

8. 在默认情况下,Amazon Linux实例上的SSH会利用可插拔验证模块(简称PAM)实现验证,因此我们需要配置该sshd PAM模块才能正常使用谷歌Authenticator。大家须在谷歌Authenticator的实例当中编辑/etc/pam.d/sshd,找到“auth substack password-auth”行并添加以下命令以指定要使用的谷歌Authenticator PAM模块:

auth        required     pam_sepermit.so
auth        required     pam_google_authenticator.so
# auth      substack     password-auth

9. 我们还需要确保其它验证类型同样调用谷歌Authenticator,例如“su”与“login”。按照以下命令编辑/etc/pam.d/system-auth:

authrequired pam_env.so
# auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_unix.so nullok try_first_pass
auth sufficient pam_google_authenticator.so
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so

10. 现在要做的是编辑SSH配置文件,这样谷歌Authenticator就会作为第二种验证因素被正确调用。首先,将以下选项变更为“yes”:

ChallengeResponseAuthenticationyes

11. 接下来,在文件最末处将以下内容添加为新的一行:

AuthenticationMethodspublickey,keyboard-interactive

12. 最后,在服务器上重新启动该SSH进程。为了安全起见,我们可以开始一个新的终端窗口以保证当前连接不被关闭,从而测试一切是否按照预期进行:

sudo/etc/init.d/sshd restart

现在大家的Amazon Linux EC2实例已经得到了严格保护,谷歌Authenticator开始成为SSH登录机制中的双因素验证方案。

Duo Security

随着初创企业的不断发展,在众多Amazon EC2实例之上对TOTP进行逐个配置也会逐渐成为一种负担。微软Active Directory与Windows Server用户可能已经对RADIUS服务器非常熟悉,亦了解如何利用它们实现并管理双因素验证机制。虽然这种方式同样也能被扩展到Linux服务器之上,但其实现难度极高而且很难被普遍推广到其它需要使用双因素验证方案的系统之上。

有鉴于此,以Duo Mobile为代表的解决方案自然应运而生。DuoMobile是一款由Duo Security公司开发的移动验证应用。顺带一提,Duo Security本身也是AWS服务支撑之下的初创企业,主要负责为多种系统平台提供双因素验证方案,其中包括VPN、UNIX设备以及定制化软件应用等等。这套产品允许企业用户将自己的MFA管理体系统一起来,并针对多种系统提供报告,具体包括VPN、OWA、SSH、RDP、SSO、AWS API以及AWS管理控制台等等。Duo Mobile还支持多种不同验证方法,例如短信验证、通过Duo移动应用进行通知推送、电话呼叫或者令牌信息等。值得一提的是,令牌信息适用于不具备蜂窝网络或者互联网连接条件的偏僻环境。

作为面向Linux实例的双因素验证应用程序,Duo UNIX拥有两套部署选项:“login_duo”与“pam_duo”。尽管login_duo在设置方面更为简单,但却无法为大家提供可与基于PAM的部署方式相媲美的出色灵活性。举例来说:

·      如果大家希望利用SSH进行端口隧道或者转发,那么将无法使用“login_duo”,这是因为OpenSSH会在Duo的双因素机制介入前将其设置完成。换句话来说,如果大家使用了“login_duo”而且并没有在自己的SSH配置当中禁用隧道与端口转发功能,那么攻击者将能够借此绕过双因素验证机制。

·      除了初始登录之外,PAM还允许大家将双因素验证应用到其它环节当中,特别是“sudo”与“su”。

·      上述能力在某些特定情况下极具实用价值,例如大家希望MFA能够允许某些未授权访问接入面向内部的主机,但又不想利用任何权限提升命令来强制执行。

·      同样的,大家可以利用Duo的集成PAM为MFA提供服务器,从而使用诸如FTP这样的其它常见协议。

Amazon Linux与Duo UNIX配合条件下的双因素验证方式

1. 在https://signup.duosecurity.com网址处登录Duo账户。

2. 创建新的UNIX集成以获取集成密钥、机密密钥以及API主机名称。

3. 在https://dl.duosecurity.com/duo_unix-latest.tar.gz网址处将Duo最新版本下载至Amazon EC2实例当中。

4. 利用“— with-pam”选项对下载到的Duo最新版本进行配置与安装:

./configure--with-pam --prefix=/usr && make && sudo make install

5. 如果大家的EC2实例使用了基于密钥的验证机制,那么请将/etc/ssh/sshd_config文件修改为如下所示:

PubkeyAuthenticationyes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive

6. 编辑/etc/duo/pam_duo.conf并将我们的ikey(即集成密钥)、skey(即机密密钥)以及host(即API主机名称)添加进去。另外,大家可能还希望添加“autopush=yes”选项,以确保双因素验证请求会被自动发送至登录会话当中,同时“prompts=1”用于在验证成功后给出提示。具体内容如下所示:

[duo]
ikey = ABCDEFGHIJKLMNO1P234
skey = mYSeCreTkEy
host = api-ab12c3d4.duosecurity.com
autopush = yes
prompts = 1

7. 利用以下内容替换掉/etc/pam.d/system-auth PAM系统配置文件当中以“auth”开头的部分:

auth     required     pam_env.so
auth     requisite    pam_unix.so nullok try_first_pass
auth     sufficient   pam_duo.so
auth     requisite    pam_succeed_if.so uid >= 500 quiet
auth     required     pam_deny.so

8. 如果大家的EC2实例使用基于密钥的验证机制进行SSH访问,那么利用以下内容替换掉/etc/pam.d/sshd PAM sshd配置文件当中以“auth”开头的部分:

auth     required     pam_sepermit.so
auth     required     pam_duo.so

9. 大家可以根据需要以同样的方式利用其它命令对/etc/pam.d/下的PAM配置文件进行调整,例如“su”或者“sudo”。

现在您Amazon Linux EC2实例当中的SSH登录机制已经在Duo的帮助下具备了双因素验证能力。如果大家需要更为具体的分步详解与最新更新内容,请点击此处查看Duo UNIX说明文档。


总结

通过对自己的Amazon EC2 Linux主机进行正确的双因素验证机制部署,大家能够降低风险并显示提升安全水平。目前可供选择的双因素验证实现手段很多,但谷歌Authenticator与Duo UNIX加PAM这两类组合拥有易于部署外加安全性高两大优势,因此非常适合那些希望对指向自身AmazonEC2实例的访问请求加以控制的初创企业。

原文链接:

https://medium.com/aws-activate-startup-blog/securing-ssh-to-amazon-ec2-linux-hosts-18e9b72319d4

核子可乐译

你可能感兴趣的:(亚马逊云科技入门,AWS,linux,ssh,安全)