【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

借助 Multi-Factor Authentication 保护实例安全

  • 2019-10-08
  • 本文字数:3968 字

    阅读完需:约 13 分钟

在 AWS,确保安全是我们的首要任务,因此我们建议客户在其应用程序的各层中实施安全控制。在本博文中,我将通过要求管理员进行双重身份认证才能使用 SSH 连接,来为 EC2 实例增添一层身份验证安全保护。


创建 EC2 实例时,系统会提示为实例创建或选择以前创建的密钥对,以便可以通过 SSH 连接进入盒子。该密钥对已下载并保留在本地计算机上。此操作的风险是本地计算机可能会遭到入侵。现在,拥有此密钥对和用户名的任何用户都拥有您的实例的完整访问权限。为了提高实例访问安全性,以帮助防止漏洞攻击,您应该加强控制。在 AWS 控制台访问方面,一种最佳实践是为根账户和所有用户账户启用 Multi-Factor Authentication (MFA)。我们可以采用这一做法,为 EC2 实例启用 MFA。启用 MFA 后,用户将使用已知的信息(即密码)和已有的信息(OATH-TOTP 应用程序或物理令牌生成的一次性密码)登录。


最常见的是,我们看到人们使用公共 IP 地址直接通过 SSH 访问实例,这便为各种复杂和重复的实例施加了安全控制。我们推荐的一种方法是在实例前安装堡垒主机或跳转盒,并通过堡垒主机访问您的实例。我们建议将对实例的访问限制在堡垒主机上,以便人们不会因直接登录实例而违反安全策略。这可以通过在这些实例的安全组中创建 SSH 类型的入站规则来实现,其中源是堡垒主机的 IP 或安全组。完成后,您可以专注于加强堡垒主机的安全性,不必再专门强化控制了。另一项好处是您无需在每个实例上启用 MFA。您只能在堡垒主机上启用 MFA,如果需要,可在运行 SSH 命令从堡垒主机登录其他实例时,使用其他提示符来获取另一个一次性密码 (OTP)。


常见的架构反面模式



推荐架构



在上面的示例中,只有与安全组 sg-bdabdb2d(堡垒主机)关联的实例可以通过端口 22 与安全组 sg-hb3abcdc(所有其他实例)关联的实例通信。用户必须首先使用公共 IP 地址借助 SSH 通过端口 22 进入堡垒主机,然后通过 SSH 进入其他实例。

在 EC2 实例上启用 MFA – Amazon Linux

在下面的示例中,在 Linux 实例上启用了 MFA。为此,我们将使用 Google 的插入式验证模块 (PAM) 来启用 MFA。在您的设备上安装 Google 身份验证器应用程序,稍后将用于生成 OTP。


1. 在 EC2 实例上安装 Google 身份验证器


以正常方式通过 SSH 进入 EC2 实例,然后切换到根账户或使用 sudo 并运行:


sudo yum install google-authenticator -y
复制代码


安装软件包后,运行初始化应用程序,为您以其身份登录的用户(例如 ec2-user)生成密钥,以向该用户账户添加第二重身份验证。


2. 配置 Google 身份验证器


运行初始化应用程序:


google-authenticator
复制代码


系统将询问您使用的身份验证令牌是否应基于时间。在本例中,我们将使用基于时间的令牌。


是否希望身份验证令牌基于时间 (y/n) y


这将生成一个 URL,其中包含您应使用 Google 身份验证器应用程序扫描的二维码,或在您的应用程序中手动输入密钥以注册设备。在应用程序中添加账户名称,并确保启用了基于时间的选项。妥善保管在实例上生成的密钥、验证码和暂存代码,以备在您无法访问注册设备上的应用程序时使用。每个暂存代码只能使用一次。



接下来,系统会询问您是否应为用户“ec2-user”更新 google_authenticator 文件。 输入“y”将保存密钥、暂存代码以及您选择稍后在文件中使用的其他配置选项。您将运行初始化应用程序并对每个用户账户执行相同的程序,以在每个账户上启用 MFA。


是否希望更新“/home/ec2-user/.google_authenticator”文件 (y/n) y是否希望禁止多次使用同一身份验证令牌? 这会将您每次登录的时间限制为大约 30 秒,但有助于发现或防止中间人攻击 (y/n) y是否希望禁止多次使用同一身份验证令牌? 这会将您每次登录的时间限制为大约 30 秒,但有助于发现或防止中间人攻击 (y/n) y
复制代码


选择“n”作为下列问题的答案,除非遇到问题,否则在一个 1 分 30 秒的时段内会出现三个有效代码。


默认情况下,令牌的有效期为 30 秒,为了补偿客户端与服务器之间可能存在的时滞,我们允许在当前时间前后存在一个额外的令牌。如果您在时间同步方面遇到了问题,可以将 1 分 30 秒的默认时段值增加到大约 4 分钟。是否希望这样做 (y/n) n如果您要登录的计算机没有经过防止暴力登录尝试的强化处理,则可对身份验证模块启用尝试次数限制。默认情况下,这会限制攻击者每 30 秒最多只能登录 3 次。是否希望启用尝试次数限制 (y/n) y
复制代码


3. 配置 SSH 来使用 Google 插入式验证模块


运行以下命令更改 PAM 配置。


sudo vi /etc/pam.d/sshd
复制代码


将以下内容添加到文件底部以使用 Google 身份验证器。如果存在应能在未进行 MFA 的情况下登录的服务账户或用户,请在以下语句的末尾添加 nullok。这意味着,不会要求未运行 Google 身份验证器初始化的用户进行第二次身份验证。


auth required pam_google_authenticator.so 或 auth required pam_google_authenticator.so nullok
复制代码


添加密码要求注释。我们只想使用 Google 身份验证器应用程序上生成的密钥对和验证码。


#auth       substack     password-auth
复制代码


保存文件。接下来,我们需要更改 SSH 配置以使其提示进行第二次身份验证。


运行:


sudo vi /etc/ssh/sshd_config
复制代码


为内容为 ChallengeResponseAuthentication“no”的一行添加注释,并删除显示“yes”的一行的注释。


ChallengeResponseAuthentication yes#ChallengeResponseAuthentication no
复制代码


最后,我们要让 SSH 知道其应请求可让我们登录的 SSH 密钥和验证码。在文件的底部添加:


AuthenticationMethods publickey,keyboard-interactive
复制代码


保存文件。重启 SSH 使更改生效。


sudo /etc/init.d/sshd restart 或 sudo service sshd restart
复制代码


要测试它是否正常工作,请打开一个新的终端窗口并通过 SSH 连接到实例,系统将要求您提供验证码。我无需输入密钥对,因为 SSH 代理中有该密钥对。在新窗口中使用 SSH 时,使会话在原始终端窗口中保持打开状态。



输入 Google 身份验证器应用上生成的代码。


配置 Google 身份验证器


4. 管理用户及其身份验证


您可以通过多种方式对用户进行多重身份验证。以下各项具有不同的安全级别。


  • 为所有用户使用相同的 .google_authenticator。如果您是根用户,请将此文件复制到 /etc/skel/ 并与其他用户共享我们之前获得的密钥,要求他们注册设备。但是,如果用户离开组织,您可能需要运行 Google 身份验证器应用程序来生成新的密钥并向所有用户提供该密钥,这可能会变得很麻烦。

  • 另一种方法是在创建新用户账户后登录该账户,运行初始化应用程序,然后共享与具体用户相关的生成密钥和暂存代码。这样您就不必与其他人共享相同的密钥了。当用户离开时,您只需删除相关用户账户即可。

  • 最安全的方法是强制用户在首次登录时运行初始化应用程序,并保存生成的密钥和暂存代码。这可以通过在登录时运行脚本来完成。

  • 5. 自动将 SSH 密钥复制到新用户账户并强制用户在首次登录时启用 MFA

  • 创建新用户时,我们要做的第一件事就是将 authorized_key 文件复制到新用户账户中并相应地更改其权限,以便用户可以使用相同的密钥对成功通过 SSH 进入实例。最佳实践是为每个用户创建一个单独的密钥对,但在本博文中,我将在新用户账户中复制相同的密钥对。执行此操作的步骤如下:


打开 authorized_keys 文件 cat ~/.ssh/authorized_keys 并复制公钥。稍后,我们将使用该公钥在新用户账户中创建类似的文件。公钥如下所示:


ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6Vhz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXrlsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZqaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3RbBQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
复制代码


创建新用户:


sudo adduser newusersudo su - newusermkdir .sshchmod 700 .sshtouch .ssh/authorized_keyschmod 600 .ssh/authorized_keys
复制代码


粘贴之前复制的公钥:


vi ~/.ssh/authorized_keys
复制代码


如果在 /etc/skel/ 目录中创建文件和目录结构 .ssh/authorized_keys,则可为所有用户自动执行上述复制过程。完成此操作后,创建的新用户将自动在其主目录中以适当的权限提供这些文件。


您还可以在创建用户之前运行以下命令,以执行上述操作,并且用户将能够使用自己的密钥对登录。


sudo sumkdir -p -- "/etc/skel/.ssh" && sed -e 's/.*\(ssh-rsa.*\) .*/\1/' ~/.ssh/authorized_keys > "/etc/skel/.ssh/authorized_keys"
复制代码


要强制用户在首次登录时配置 MFA,请切换到根用户,在 /etc/profile.d/ 目录中创建文件 mfa.sh 并将以下脚本粘贴到其中。


if [ ! -e ~/.google_authenticator ]  &&  [ $USER != "root" ]; thengoogle-authenticator --time-based --disallow-reuse --force --rate-limit=3 --rate-time=30 --window-size=3echoecho“保存生成的应急暂存代码,并使用密钥或扫描二维码注册您的设备,以进行多重身份验证。”echoecho“使用 SSH 密钥对再次登录,并在注册的设备上生成一次性密码。”echologoutfi
复制代码


如果要在切换到根用户时提示进行第二次身份验证,则可以删除 $USER != “root” 的条件。


/etc/pam.d/sshd 文件的底部应包含以下语句,以便用户登录时运行以上脚本。


auth       required     pam_google_authenticator.so nullok
复制代码


如果用户离开组织,只需从堡垒主机中删除相应的用户账户即可。


sudo userdel -r olduser
复制代码

小结

本博文演示了如何在 EC2 实例上设置多重身份验证,并为首次登录的用户自动运行 Google 身份验证器应用程序。这可确保用户将在其设备上生成的密钥对和基于时间的一次性密码一起用于通过 SSH 进入实例。


作者介绍:


Ronan Guilfoyle


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/multi-factor-authentication-aws-security-startup/


2019-10-08 14:08971
用户头像

发布了 1835 篇内容, 共 91.8 次阅读, 收获喜欢 73 次。

关注

评论

发布
暂无评论
发现更多内容

国内低代码平台“定制化开发”能力较强的有哪些?

优秀

低代码

leetcode 437. Path Sum III 路径总和 III(中等)

okokabcd

LeetCode 数据结构与算法

Linux系统安装Nginx

nginx Linux tree 9月月更

港股交易系统开发之APP原生or封装?

软件开发大鱼V15988750073

证券 港股交易系统开发 港股打新系统 港股多账户系统 证券app

45张图带你从入门到精通学习WireShark!

wljslmz

Wireshark 网络技术 抓包分析 9月月更

从成都核酸系统崩溃,谈谈IT系统如何应对10倍以上流量冲击

星汉未来

全面构建数据安全“护城河”,助力企业数智化升级| 极客星球

MobTech袤博科技

大数据 数据安全

C#/VB.NET: 为Excel表格添加超链接

Geek_249eec

C# Excel VB.NET 超链接

内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档

葡萄城技术团队

前端 PDF JavaScrip

极致体验!基于阿里云 Serverless 快速部署 Function

阿里巴巴云原生

阿里云 Serverless 云原生

数据可视化分析工具如何在国内弯道超车,迅速崛起?

葡萄城技术团队

多云时代如何实现自动化运维?博云给你最优解!

BoCloud博云

云计算 云原生 多云管理平台

Zilliz 论文入选数据库顶会 VLDB'22

Geek_2d6073

计算机网络——分层结构

StackOverflow

编程 计算机网络 9月月更

融云 x KUPU:印尼蓝领用工的「直聘」样板

融云 RongCloud

互联网

小六六学Netty系列之编解码器和handler的调用机制

自然

Netty 网络 9月月更

云桌面解决方案 企业最佳合作伙伴

力软低代码开发平台

有效预警6要素:亿级调用量的阿里云弹性计算SRE实践

阿里云弹性计算

监控 预警 SRE实践

转转商业化OCPC产品的护航之旅

转转技术团队

人工智能 计算广告 PID OCPC

Axios的引入与使用-提供可响应api案例

Sam9029

前端 网络 axios 9月月更

从普通网站到 PWA 你还在重新写代码吗?

鼎道智联

前端 OS PWA

每日一R「23」回顾基本概念

Samson

学习笔记 ​Rust 9月月更

国内唯一|阿里云入选 Gartner 应用性能监控与可观测魔力象限

阿里巴巴云原生

阿里云 云原生 Gartner 可观测

【InfoQ】博睿数据CTO孟曦东访谈实录:可观测性技术是未来发展方向

博睿数据

可观测性 博睿数据 智能运维AIOps 极客有约

SD-WAN应用选路方案

阿泽🧸

SD-WAN 9月月更

Online Schema Change(在线更新元数据)

KaiwuDB

分布式数据库 schema

Elasticsearch6.1.2源码下载和编译构建

程序员欣宸

elasticsearch 9月月更

小六六学Netty系列之再遇Netty

自然

Netty 网络 9月日更

Java线程池创建方式和应用场景

Java快了!

线程池 java;

线上直播预告:数据库人才培养创新与变革

阿里云数据库开源

数据库

网络IO是如何一步一步走向零拷贝的

C++后台开发

cpu 零拷贝 C++后台开发 网络io C++开发

借助 Multi-Factor Authentication 保护实例安全_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章