写点什么

借助 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:081338
用户头像

发布了 1960 篇内容, 共 168.1 次阅读, 收获喜欢 82 次。

关注

评论

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

软件测试/测试开发 | web 控件的交互进阶

测试人

软件测试 自动化测试 测试开发 Web自动化测试

新年伊始,谈谈开源软件供应链安全的新趋势

安势信息

开源软件 清源CleanSource SCA 安势信息 ChatGPT 开源软件供应链安全

实战分享,电路板设计后这样干,一个人也能轻松搞定项目!

华秋PCB

PCB PCB打样 PCB设计

TDengine 3.0.2.5 查询再优化!揭秘索引文件的工作原理

TDengine

数据库 tdengine 时序数据库

特定领域知识图谱融合方案:学以致用-问题匹配鲁棒性评测比赛验证【四】

汀丶人工智能

自然语言处理 知识图谱 2月月更 2月日更 实体对齐

由浅入深,聊聊OkHttp的那些事(很长,很细节)

Petterp

android okhttp

宋红康2023版Java视频发布

小谷哥

IoTLink 版本更新 v1.5.2

山东云则信息科技

物联网

详解Redisson分布式限流的实现原理

华为云开发者联盟

后端 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

大咖说·图书分享|狼书(卷3):Node.js高级技术

大咖说

node.js 阿里云 开发者

Java培训有哪些不同的学习方法

小谷哥

模块6如何设计微服务架构

程序员小张

Sentinel 是如何实现分布式限流的?

sentinel 分布式限流

如何快速实现多指标计算

jiangxl

安势信息入选 SegmentFault思否「2022 中国新锐技术先锋企业」

安势信息

软件成分分析 清源CleanSource SCA 安势信息 技术先锋 SegmentFault

fabric.js开发图片编辑器的细节实现

秦少卫

架构 编辑器 Fabric.js 前端编辑器

Cloud Kernel SIG月度动态:发布ANCK 5.10-013版本、完整支持Intel SPR处理器

OpenAnolis小助手

开源 版本 内核 龙蜥社区 sig

MRS+LakeFormation:打造一站式湖仓,释放数据价值

华为云开发者联盟

大数据 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

秒云加入金兰组织,携手共建信创新生态

MIAOYUN

信创 信创云 信创产业 金兰组织

软件测试/测试开发 | Web 控件定位与常见操作

测试人

软件测试 自动化测试 测试开发 Web自动化测试

关于使用消息队列今天被面试官问倒了

前端培训学习方法有哪些

小谷哥

再获权威认证!秒云顺利通过ISO20000、27001双系统认证

MIAOYUN

ISO9001 ISO20000 ISO27001

面试官:谈谈你对JVM内存结构的理解

Java JVM

嵌入式ARM设计编程(一) 简单数据搬移

timerring

arm

特定领域知识图谱融合方案:文本匹配算法之预训练Simbert、ERNIE-Gram单塔模型等诸多模型【三】

汀丶人工智能

人工智能 自然语言处理 知识图谱 2月月更 2月日更

云小课|使用SpringBoot快速构建FunctionGraph HTTP函数

华为云开发者联盟

开发 HTTP 华为云 企业号 2 月 PK 榜 华为云开发者联盟

大数据培训学习选择哪个机构好

小谷哥

大数据培训零基础的方法有哪些

小谷哥

只用了半个Redisson的Semaphore实现并发控制

Java 并发控制 Semaphore redisson

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