亚马逊AWS官方博客

忘记堡垒机,使用 Session Manager 登录和管理 EC2 主机

忘记堡垒机,使用 Session Manager 登录和管理 EC2 主机

企业 IT 管理员经常会面临两难抉择。 一方面,开发人员希望他们部署代码的业务系统的基础架构环境大门敞开,最好自己可以以各种方式能从本地的主机对业务系统进行代码管理和部署。 另一方面,企业的安全架构师又希望业务系统足够的安全,最好是层层把关,才能对系统进行操作。在这样的两难选择下,使得现阶段主流架构都会使用堡垒机作为企业访问内部资源的第一道关卡。例如,他们需要通过登录位于公有子网的堡垒机来对其服务器进行 shell 级访问。 他们可能需要杀死失控进程,查阅服务器日志,微调配置或安装临时补丁,同时保持强大的安全配置文件。然而,使用堡垒机会带来额外的使用上的不便利,以及要承担在实例上打开入站 SSH 端口时出现的风险。

Session Manager 是什么,能做什么

AWS Systems Manager 会话管理器是一个新的交互式 Shell 和 CLI,有助于提供安全、访问权限受到控制且经过审计的 Windows 和 Linux EC2 实例管理。使用会话管理器,您无需打开入站端口、管理 SSH 密钥或使用堡垒主机。并且登录的主机可以处于公有子网或者私有子网。

借助会话管理器,您可以提高安全性,集中进行访问管理并接收详细的审计。除了无需打开入站端口之外,您还可以结合使用会话管理器与 AWS NAT Gateway,以便登录处于私有子网的EC2主机。通过使用 AWS Identity and Access Management (IAM) 策略,您可以在一个中心位置授予和撤销对实例的访问权限。提供访问权限后,您可以使用 AWS CloudTrail 审计哪个用户访问了实例,并将每个命令记录到 Amazon S3 或 Amazon CloudWatch Logs。会话管理器用户只需单击并启动一个会话,然后选择一个实例,即可快速开始使用该工具。

要了解有关 AWS Systems Manager 的更多信息,请访问我们的产品页面文档

您现在可以使用新的基于浏览器的交互式shell和命令行界面(CLI)来管理Windows和Linux实例。 使用Session Manager来管理主机,可以给您的管理带来如下好处:

  • 访问控制 – 您使用IAM策略和用户来控制对实例的访问,而不需要分发SSH密钥。您可以使用IAM的日期条件运算符限制对所需时间/维护窗口的访问。
  • 可审计性 – 可以将命令和响应记录到Amazon CloudWatch和S3存储桶。您可以安排在新会话启动时收到SNS通知。
  • 交互性 – 命令在完全交互式bash(Linux)或PowerShell(Windows)环境中同步执行
  • 编程和脚本 – 您可以从控制台以及命令行( aws ssm … )或通过会话管理器API的方式来启动会话。

在EC2实例上运行的SSM代理必须能够连接到会话管理器的公共端点。您可以设置NAT Gateway,以允许在你的VPC的私有子网中(无Internet访问或公共IP地址)中运行的实例连接到会话管理器。

如何使用 Session Manager 登录 EC2

  1. 创建 IAM Role,使得 System Manager 可以访问 EC2 资源。

创建标准IAM Role,添加System Manager权限

选择创建好的这个Role,点击”Add inline policy”添加关于Session Manager的策略

策略的JSON文件如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": "*"
        }
    ]
}

 

将这个IAM Role附到对应的希望登录的EC2主机上。

 

  1. 给IAM 用户创建对应的Policy,指定该用户能访问的EC2。

参考文档:

基础:https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html

高级:https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/getting-started-restrict-access-examples.html

根据需要,修改红色部分

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/instance-id"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceProperties",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetDocument"
            ],
            "Resource": "arn:aws:ssm:region:account-id:document/SSM-SessionManagerRunShell"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:::session/${aws:username}-*"
            ]
        }
    ]
}

 

  1. 更新EC2上的SSM-agent

注意,如果要通过Session Manager来管理EC2主机的话,那么需要升级EC2上的SSM Agent 版本至2.3.68.0

参考文档:https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/sysman-manual-agent-install.html#agent-install-al

  1. 通过Session Manager进行登录访问


通过浏览器登录

通过Session Manager进行登录,默认用户是ssm-user,可以通过 su 命令进行用户切换

  1. 在主机上安装AWS CLI上的plugin

如果希望通过AWS CLI命令行来进行登录管理EC2,那么需要首先安装好插件

参考文档:https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

以MacOS为例:

(1). 执行命令下载文件
curl “https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip” -o “sessionmanager-bundle.zip”

(2). 解压文件
unzip sessionmanager-bundle.zip

(3). 执行命令进行插件安装
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

(4). 安装插件完毕之后,检验插件的安装情况
session-manager-plugin –version

  1. 在AWS CLI上进行登录

使用命令进行登录,instance-id是主机的实例ID,可以在EC2控制台中找到

执行命令进行登录:  aws ssm start-session –target instance-id

查看通过Session Manager登录EC2的历史

Console上进行查看

AWS CLI上进行查看

记录通过Session Manager登录EC2的日志

可以通过S3和CloudWatch Logs来记录Session Manager的日志。在Session Manager的Preferences参数下可以对日志记录的方式进行配置。

配置完毕之后再Preferences处可以看见配置的S3和CloudWatch存储日志的地方

通过Session History找到需要查看的SSH Session的Session ID,方便后续在S3和CloudWatch里面对应的进行查看

S3文件日志显示

下载到本地打开能看见所有的命令操作

CloudWatch Logs日志显示

也可以在CloudWatch Logs日志中显示登录之后的所有操作

本篇作者

姚远

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。现致力于网络和DevOps相关领域的研究。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。