带有 aws SSM 的 SSH 隧道
Posted
技术标签:
【中文标题】带有 aws SSM 的 SSH 隧道【英文标题】:SSH tunel with aws SSM 【发布时间】:2021-10-29 17:09:16 【问题描述】:希望这对其他人有所帮助,因为我花了几个小时试图弄清楚如何通过 SSH 从我的本地计算机 (macosx) 连接到私有子网中的 ec2 实例,该实例充当通往 redis、rds 等其他资源的隧道。
为什么我需要访问我的私有子网资源?我希望能够为我正在构建的应用程序测试 RDS 数据库、redis 和私有 API 网关。 为什么我要通过 Open***、公共子网中的堡垒主机或其他方式使用 SSM 方法? 1) 我没有时间完成我的 MVP 的构建,并且 2) 我从各种来源了解到,从安全角度来看,将堡垒主机放入公共子网可能会导致一些漏洞。
SSM 方法似乎适用于我的沙盒环境,该环境目前是 1 个 VPC,仅在 1 个可用区中具有 1 个公共子网和 1 个私有子网。我可以下载临时 AWS CLI 凭证,发出 aws ssm 控制台命令,并为私有子网后面的各种服务设置隧道。
我将列出我所采取的步骤,但每次我想在私有子网中设置通往服务的隧道时运行这些步骤似乎有点麻烦,因为某些 *** 服务似乎很容易集成没有额外的麻烦。如果您有更好的解决方案或改进我的方法的方法,请告诉我。
设置:首先,我将回顾一下我在这种方法中采取的各个步骤。
我使用 VPC 启动向导将具有 1 个公共子网和 1 个私有子网的 VPC 启动到 (us-east-1c)
我在私有子网中启动了 1 个 redis 实例
我使用 Amazon Linux 2 AMI 在私有子网中启动了 1 个 EC2 实例。我没有在实例上启用公共访问。
我创建了一个分配给 EC2 实例的 IAM 角色。该角色包含一个名为:AmazonSSMManagedInstanceCore 的策略,尽管我正在阅读的指南解释了制定您自己的 IAM 策略 (https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html),但对我来说有点模糊,因为我对 IAM 没有那么丰富的经验,我也不完全确定如何设置它,尽管我相信我正确创建了策略并将其附加到我附加到 EC2 实例的角色。即使遵循上述提供 kms 加密和日志记录的指南,我也没有看到任何日志记录被提交到 cloudwatch 或 s3。不确定这些组件是否超级关键,但如果有人有意见请分享。
我创建了一个仅具有编程访问权限的 IAM 用户。尽管我为这个“沙盒”帐户使用了 root 帐户,但我认为无法为 root 用户获取 API 密钥,所以这就是我创建辅助帐户的原因。 如果没有向我创建的 IAM 用户附加策略 AmazonSSMFullAccess 和 EC2InstanceConnect(有人可以确认这些是否真的需要吗?),我无法让 AWS ssm 控制台命令在我的本地计算机上运行。
我在本地机器上使用 pip3 for Python 安装了 awscli 包
我为 macosx 安装了 SSM 插件(又是我的本地机器)(https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos)
我为我在第 4 步中创建的 IAM 用户配置了 aws 凭证(只需在控制台中运行 aws configure),系统将提示您输入各种值。
我能够通过运行以下命令启动与私有子网中 EC2 实例的会话:
aws ssm start-session --target i-xxxxxxxxxxxxxxxxx
输出: sh-4.2$
这个https://prismatic.io/blog/connect-to-aws-resources-with-ssh/ 指南帮助我完成了剩余的步骤,包括使用以下命令向 ec2 实例添加公钥:
aws ec2-instance-connect \ 发送 ssh 公钥 --availability-zone us-east-1c \ --instance-id i-xxxxxxxxxxxxxxxxx --instance-os-user ec2-user --ssh-public-key file://$HOME/.ssh/id_rsa.pub
我不完全确定为什么需要此步骤,但如果有人有任何澄清,请添加。
将此添加到我的$HOME/.ssh/config
主机 i-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
然后我可以设置我的第一个隧道到 redis。此命令创建一个从我笔记本电脑上的 localhost:5000 到 redis 实例的 SSH 隧道。
ssh ec2-user@i-xxxxxxxxxxxxxxxxx -NL 5000:some_rds_aws_url.cache.amazon.com:6379 -i test.pem -v
我也不确定为什么仍然需要 .pem 文件,但如果有人知道这是否实际上不需要,或者有其他方式来掩盖这一点。如果没有 pem 文件,我将面临: Permission denied (publickey,gssapi-keyex,gssapi-with-mic)。
请分享任何关于此方法的正面或负面反馈。
【问题讨论】:
【参考方案1】:您遇到了这个问题,因为当您使用此代理助手host i-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
运行 SSH 时,您所做的只是在您和 AWS EC2 实例之间的端口 22(默认情况下)创建一个 oport 隧道。
这就是您在没有密钥的情况下连接到实例时遇到问题的原因,因为您需要先通过 SSH 连接到实例,然后才能使用该实例跳转到 redis 服务器。
您的连接将以与此类似的方式遍历互联网:
ssh command -> aws ssm start-session -> internet -> ec2 server -> redis
如果您不想使用 SSH 密钥,我建议您查看 *** 选项来连接到内部资源:
https://aws.amazon.com/blogs/awsmarketplace/setting-up-open***-access-server-in-amazon-vpc/
【讨论】:
以上是关于带有 aws SSM 的 SSH 隧道的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 SSH 隧道以连接到位于 AWS EC2 服务器上的 ElasticSearch 和 MongoDB?
通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb