安全外壳(SSH)是可靠的远程访问工具。 IMO是分布式系统的关键启用技术。但是,它的有效安全性并不理想。具有RSA密钥对和线级加密的身份验证方案非常好。但是密钥管理非常棘手,打开双向SSH(端口22)的防火墙会增加攻击面。
本文介绍了2019年推出的称为会话管理器的AWS创新。是的,您确实可以改善鼠标陷阱。会话管理器基于IAM向ssh添加了一层身份验证和授权,并且只需要服务器端的HTTPS出站。 SSH通过SSH的代理功能在会话管理器之上。
现在,远程主机访问可能正在消失。 Cloud native正在使我们趋向于托管平台(云功能,无服务器,容器协调器),在这种平台上,即使不是不可能,也不鼓励启动Shell。但是目前,我们仍然需要它。
让我们先设置SSH级别,然后再通过会话管理器进入SSH代理。
普通的纯正SSH具有客户端和服务器组件,它们通过SSH协议进行通信。 Shell会话将启动到服务器端用户帐户,并通过其公用密钥已在服务器上预先授权的密码或私钥进行身份验证:
请注意,ssh客户端通常是一组工具:安全外壳,文件传输和复制(ssh,sftp和scp)。这三个都使用上述架构。
AWS提供会话管理器客户端作为AWS CLI(带有附加功能)和控制台(浏览器界面)的一部分。客户端和服务器通过AWS Systems Manager(SSM)网关通过HTTPS和安全Web套接字进行通信:
实际上没有入站攻击的风险。防火墙(安全组和/或网络acl)仅需要443出站规则。 EC2实例上的ssm代理会轮询网关以获取会话请求。
您可以完全删除跳转主机,或者至少将它们移到专用子网。这些实例不需要公共IP,并且可以通过NAT网关启用出站访问。
强化身份验证和大规模管理凭据更加容易。控制台密码规则(复杂性,有效期限),CLI访问密钥规则(有效期限)和MFA的使用可以集中在一起。使用AWS SSO或跨账户角色假设,每个用户都有一组使用和轮换的凭证。当然,登机和登机也被简化了。
您可以更轻松地授权访问。为了方便起见,SSH密钥通常在主机之间共享。可以将IAM策略配置为基于实例ID,标签,子网等基于每个用户,每个角色或每个组来限制访问。
您可以更轻松地审核取证服务的访问权限或集成DevSecOps流程。会话生命周期记录在CloudTrail中,您可以将完整的Shell历史记录(键入的命令和显示的响应)记录到S3。
{" Version&#34 ;:" 2012-10-17&#34 ;," Statement&#34 ;: [{" Action&#34 ;: [" ssm: GetConnectionStatus"," ssm:DescribeInstanceInformation"," ssm:DescribeSessions"," ssm:StartSession"," ssm:DescribeInstanceProperties" ],"资源":" *","效果":"允许"," Sid":&# 34; SessionManagerStartDescribe" },{" Action&#34 ;: [" ssm:TerminateSession" ]," Resource&#34 ;:" arn:aws:ssm:*:*:session / $ {aws:username}-*&#34 ;," Effect&#34 ;:& #34; Allow"," Sid&#34 ;:" SessionManagerTerminate" }]}
请注意,以上内容允许用户列出所有当前会话和历史会话。上次我检查(2019年11月)时,您无法将DescribeInstances限制为由用户启动的实例,但是幸运的是,它确实将条目终止限制为用户已启动的实例。
您必须在能够查看所有当前会话(但不能输入或终止它们)和根本不查看的用户之间选择。历史会议也一样。
SSM代理。它已预装了适用于Windows Server,Ubuntu Server 16和18,Amazon Linux 1和2的Amazon Machine Images(AMI),以及用于Batch,ECS,ElasticBeanstalk等的所有AL变体。但是,它具有AWS花了几个月的时间来推出支持SSH代理的最新代理。我上次检查(2020年11月)时,Ubuntu 16支持直接但不代理ssh。 (在用户数据或其他引导机制中运行快照刷新amazon-ssm-agent进行更新。)
通过ec2实例配置文件(角色)的IAM策略。与此有关的AWS文档有些零散。我喜欢使用这个设置:
{" Version&#34 ;:" 2012-10-17&#34 ;," Statement&#34 ;: [{" Sid&#34 ;:" SessionManagerCore&#34 ; " Effect&#34 ;:" Allow&#34 ;、 [" ec2messages:AcknowledgeMessage&#34 ;、" ec2messages:DeleteMessage&#34 ;、 " ec2messages:FailMessage&#34 ;、" ec2messages:GetEndpoint&#34 ;、" ec2messages:GetMessages&#34 ;、" ec2messages:SendReply&#34 ;、" ssm: UpdateInstanceInformation"," ssm:ListInstanceAssociations"," ssmmessages:OpenDataChannel"," ssmmessages:CreateDataChannel"," ssmmessages:OpenControlChannel",& #34; ssmmessages:CreateControlChannel" ]," Resource&#34 ;:" *&#34 ;,}}
如果您想记录会话数据(shell历史记录),则需要另一组权限,例如记录在这里。
将配置文件(角色)分配给ec2实例。如果您在实例启动后分配角色,请启动ssm代理以使其连接到后端。
#通过会话管理器进行SSH hosthost i- * mi- * ProxyCommand sh -c" aws ssm start-session --target%h --document-name AWS-StartSSHSession --parameters' portNumber =%p&#39 ;"
#通过会话管理器进行SSH主机i- * mi- * ProxyCommand C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" aws ssm start-session --target%h --document-name AWS-StartSSHSession -参数portNumber =%p"
如果您配置了多个aws配置文件,请在启动会话之前导出(在Windows Powershell中设置)AWS_PROFILE变量。
因此,现在我们可以使用实例ID,而不是公共ip或fqdn:
它的外观和感觉就像是一个简单的ssh会话。偶尔启动会话需要花费几秒钟,但是根据我的经验,此后的性能与ssh一样好。
其他所有其他功能(例如scp和sftp)以及命令的远程执行也都可用。您也可以使用捆绑的ssh-add实用程序将密钥存储在缓存中,并删除-i选项。
如何访问数据存储,例如私有RDS或Elasticsearch / Kibana实例?您可以使用客户端工具,例如对于RDS MySQL使用MySQL Workbench,或者在Kibana使用浏览器。您将它们连接到本地端口,例如3306或8443,即会话管理器上的开放式ssh隧道。
... {" Sid&#34 ;:" SessionManagerDenyRestricted&#34 ;、" Effect&#34 ;:" Deny&#34 ;、" Action&#34 ;:& #34; ssm:StartSession"," Resource":[" arn:aws:ec2:*:*:instance / i-0cdbc0106ed03bba5"," arn:aws :ec2:*:*:instance / i-07e8b9fc88ee02bf8" ]" Condition&#34 ;: {" StringNotEquals&#34 ;: {" aws:username&#34 ;:" first.last1&#34 ;、" aws:username& #34 ;:" first.last2" }}}
... {" Sid&#34 ;:" StartSessionResourceTag&#34 ;、" Effect&#34 ;:" Allow&#34 ;、" Action&#34 ;:& #34; ssm:StartSession&#34 ;、" Resource&#34 ;:" arn:aws:ec2:*:*:instance / *&#34 ;、" Condition&#34 ;: {" StringEquals&#34 ;: {" ssm:resourceTag / Purpose&#34 ;:" jumpbox" }}} 默认情况下,所有会话的开始和结束都将记录到CloudTrail,就像所有AWS服务活动一样。 您可以使用CloudWatch事件规则启用某些DevSecOps流程,例如寻找。 您可以启用将会话数据记录到S3存储桶中,但请注意! 内容高度敏感。 例如,用户可以在shell命令参数和带有PHI数据的cat文件中键入密码。 因此,必须将日志发送到保护良好的存储桶,例如 在一个审核帐户中,该帐户仅由法医调查人员临时访问。