使用Session Manager登录EC2
一、Session Manager简介
Session Manager是System Manager(以下简称SSM)里边的管理套件其中的一个组件。它是一项Region级别的区域性服务。使用Session Manager在特定系统上可以快速免密钥登录EC2。
1、使用Session Manager的前提
几个前提:
- EC2系统上安装了System Manager Agent,简称SSM Agent;
- EC2上附带了Session Manager所需要的IAM Role角色;
- EC2具有外网访问权限,可以连接到本区域的Session Manager服务;
- EC2没有外网访问权限,但是本VPC内配置了Session Manager的VPC Endpoint,可以从私有子网Private Subnet连接到本区域的Session Manager服务;
- 如果希望从开发者本机(云下笔记本)使用Session Manager登录到EC2,那么使用者环境需要安装AWSCLI、配置正确的密钥,并安装Session Manager插件;
- 在以上全过程中,EC2无须打开外网TCP 22端口的访问权限,所有操作将通过EC2上安装的SSM Agent传递到EC2上。
2、默认支持Session Manager的系统
在创建EC2时候选择以下的AWS官方AMI,已经内置System Manager Agent的,支持使用Session Manager包括:
- Amazon Linux 1,2,以及未来版本;
- Ubuntu 18.04,以及更高;
- Windows Server 2016,以及更高版本。
3、需要额外安装System Manager Agent才能支持Session Manager的操作系统
以下操作系统默认不包含System Manager Agent,需要额外手工安装Agent:
- 社区的CentOS镜像
- 社区其他非官方制作者发布的镜像
- 从IDC导入的镜像
SSM Agent是开源的,如果您对在EC2内安装管理控制端有疑虑,请从如下Github地址获取SSM的代码:
https://github.com/aws/amazon-ssm-agent
安装Agent的步骤如下:
https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/sysman-manual-agent-install.html
本文按照使用Amazon Linux 2系统编写,已经内置System Manager Agent,无需再手动安装。
二、为EC2创建Session Manager需要的IAM角色并绑定到EC2
1、创建IAM角色
进入IAM节点,点击左侧的角色Role
按钮,点击右侧的创建角色按钮。如下截图。
![01](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/01.png)
点击服务类型是EC2,然后向下滚动屏幕。如下截图。
![](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/03.png)
选择EC2 Role for System Manager,然后点击右下角的下一步权限。如下截图。
![](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/04.png)
在策略界面上,自动加载出来了一条策略。测试无须做配置,直接点击标签按钮跳到下一步。如下截图。
![](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/02.png)
在配置标签界面上,无须配置,点击下一步跳过。
在创建IAM角色的最后一步,输入角色的名称,例如ec2-ssm-login
,稍后配置中将使用这个名字。最后点击右下角的创建角色完成创建过程。如下截图。
![05](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/05.png)
2、新创建EC2时候选择Session manager需要的IAM角色
创建使用System Manager – Session Manager登录的EC2的过程,与创建普通EC2没有明显的差别。其中一个关键步骤是,在创建的时候就赋予EC2响应IAM角色。如下截图。
![06](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/06.png)
在选择EC2安全规则组一步,无需开放任何端口,即便将所有入栈端口都关闭,也可以使用SSM。如下截图。
![07](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/07.png)
在创建的最后一步,选择EC2登录密钥,这里为了演示效果,不选择任何SSH Key,然后直接创建EC2。如下截图。
![08](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/08.png)
创建EC2完成。
三、在AWS控制台上使用Session Manager连接到EC2
在EC2创建时候,需要等待1-2分钟,待其健康状态变为2/2 checks Passed
也就是检查通过后,才可开始连接。选中EC2,点击右上方的连接按钮。如下截图。
![09](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/09.png)
在新弹出的窗口中,选择连接方式是Session Manager
,并点击连接。如下截图。
![10](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/10.png)
如果之前的配置不正确,这一步将提示无法检测SSM Agent,也就无法连接。
连接成功。如下截图。
![11](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/11.png)
Session Manager也可以用于Windows操作系统。登录到Windows以后提供的不是GUI图形界面,而是提供Windows Powershell。您可以通过Powershell安装软件、调整配置。如下截图。
![](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/12.png)
四、在云下客户机(如开发者笔记本)使用AWS CLI的Session Manager插件登录到EC2
在云下的开发环境,例如开发者本机,如果安装了AWSCLI工具,那么也可以通过Session Mangaer连接到EC2。为此,需要安装AWS CLI的插件,下载地址和文档说明在这里:
在以上文档中,可以分别找到Windows、Linux和MacOS的版本。
环境安装好之后,连接到EC2之前还需要获取本EC2的Instance ID。查看Instance ID可以通过EC2控制台网页获得,也可以在CLI上执行aws ec2 describe-instances
也可以看到Instance ID。获取Instance ID后,执行如下命令:
aws ssm start-session --target i-0b35c6823Ieeafc7O
即可登录到EC2。如下截图是在MacOS下的AWSCLI使用Session Manager登录到Windows EC2后的Powershell界面。
![18](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/18.png)
此方法可在运行AWSCLI的客户机上,跨平台远程登录到Linux、Windows的EC2系统上,其中Linux会打开默认shell,而Windows系统就会打开Powershell。
五、配置SSM登录后的操作日志
进入SSM控制台,找到左侧的节点管理,在其中找到Session Manager。如下截图。
![13](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/13.png)
进入SSM模块后,查看属性选项。如下截图。
![14](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/14.png)
在设置界面下,向下滚动页面,即可看到S3存储桶和自动加载脚本的设置。如下截图。
![15](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/15.png)
Shell Profile的作用是在登录后自动执行脚本,可根据实际需要进行配置。
查看S3存储桶内,即可看到Session Manager登录的日志。如下截图。
![16](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/16.png)
将日志下载到本地后,打开可以看到其中的内容就是SSH日志。
![17](https://blogimg.bitipcman.com/wp-content/uploads/2021/06/ssm/17.png)
六、使用AWSCLI+Session Manager插件转发内网端口到开发者本地
上文使用Session Manager可以让外部用户远程连接到EC2,当搭配AWSCLI时候,还可以从开发者本地的直接连接到EC2。接下来进一步拓展使用场景,有时候还需要从开发者本机访问云上VPC内的数据库。这时候能访问到EC2是不够的,最好从开发者本机能直接访问VPC内的数据库。这种场景可以使用Session Manager的端口转发来实现。
首先在开发者的环境上安装好AWSCLI,并安装好Session Manager插件。接下来确认下VPC内要转发的RDS的Endpoint名称,然后构建如下命令:
aws ssm start-session \
--target i-123456xxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["mydb.example.ap-east-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["56789"]}'
启动完毕后,即可将RDS的Endpoint映射到本地的56789端口。另外,此窗口不能关闭,否则SSH转发会断开链接。
接下来使用如下命令即可连接到RDS。注意命令中需要使用127.0.0.1的IP地址表示本机,不能使用localhost,否则mysql客户端可能会查找本机的socket文件而不是通过网络接口连接。
mysql -h 127.0.0.1 -P 56789 -u admin -p
输入RDS的admin账户的密码即可完成登录。
七、参考文档
安装Session Manager插件:
使用Session Manager端口转发:
https://github.com/peteragility/ssm-port-forward
完。