ssh in depth

前两天写了一篇关于ssh的相对比较入门的文章,重点介绍了ssh在免密登录场景下的应用。

本文试图对ssh更高级的话题做一下探讨,重点探讨一下ssh tunneling

https://www.ssh.com/ssh/tunneling/example

SSH(secure shell)

ssh是一个使得在不安全链路上使能安全连接的软件包和相关的协议.

ssh协议

ssh protocol使用加密机制来使得client和server之间的连接变得安全

所有的用户鉴定,命令,输出或者文件传输都是加密的.如果想了解具体ssh协议是如何工作的,可以参考协议页面. 如果想了解ssh file transfer protocol也可以研究sftp页面。

 

client软件包:

putty, winscp, filezilla, tectia SSH

server软件包:

openssh,tectia SSH

 

 

下面将解释ssh tunneling到底是什么(也被称为ssh port forwarding),如何能够从internet公网进入到intranet私网,如何在firewall那里阻止ssh tunnel. SSH tunneling是一个强大的工具,但也容易被滥用.特别是如果你将你的服务迁移到aws或其他云计算平台时尤其需要注意考虑安全.

什么是ssh隧道tunnel?

ssh tunneling是一种在加密的ssh连接上传输任意网络数据的方法.也可以用于为传统的应用添加加密机制.也可以用用

以及穿过防火墙访问intranet。

SSH是一个用于基于不可信的网络上实现安全远程登录以及文件传输的标准。

也可以用于提供一种对任何应用使用port fowarding实现数据传输安全化的方法,也就是tunneling任何tcp/ip port over SSH.

这意味着应用的数据流量被重定向到在一个加密的ssh connection中流动,这样数据流量将无法被侦听.ssh tunneling使得原生并不支持加密的老应用具有了安全传输的能力.

上图简化描述了ssh tunneling的工作机制。在不可信的公网之上,在ssh client和ssh server之间建立了一个安全的连接connection.这个ssh连接是加密的,因此保证了保密性和完整性,并能对通信双方验明正身保证我是我

ssh连接被应用程序用于连接到应用程序服务器application server.当使能tunneling后,application将和本地的一个port端口进行contacts,而这个本地端口ssh client一直监听。ssh client然后经过通往server的加密隧道转发应用application的请求数据。server则和实际的application server建立连接,通常app server和ssh server就在一台机器上或者相同的数据中心.这样application communication就是安全的了,并且无需对应用或者用户的工作流做任何的改动.

这种机制的坏处是:任何能够登录到server上去的用户都能够使能port fowarding。内部IT人员广泛利用这一点登录到他们位于云中的家庭计算机或服务器,将一个端口从服务器转发回企业内部网到他们的工作计算机或合适的服务器

黑客或恶意软件就能够很轻易地使用他到内部网络中留一个后门。也可以被轻易地用于隐藏攻击者的线路,只要通过多个允许不受限的tunneling设备多跳几次就能实现.

要了解如何配置一个ssh tunnel,可以看例子。tunneling通常和ssh keys公钥鉴定配合使用实现自动化的流程.

ssh tunneling的好处

ssh tunnels在很多公司环境下使用了大型机作为他们application backend的场景下广泛使用.在这些环境中,应用本身可能并没有很多安全机制。通过使用tunneling, 遵循  SOXHIPAAPCI-DSS等其他标准的安全规范就比较容易实现.

很多时候,修改app和app server来满足安全几乎不可能,比如没有代码,或者app提供者已经破产等。这时通过一个安全的wrapper,比如ssh tunneling就是一个非常实用的可行方案。比如,我们使得一个国家范围内的atm机网络就使用tunneling机制来保证安全.

风险

ssh连接由强加密来保护,这对于流量监控和过滤系统是有效的,因为traffic是不可解读的.但是这种不可见也存在着很大的风险,比如数据泄露。恶意软件可以利用ssh来隐藏未授权通信,或者从目标网络中漏出偷窃的数据.

在一个ssh back-tunneling攻击中,攻击者在目标网络(比如AWS)以外建立一个server,一旦攻击者进到目标系统中,他就能够从里面连接到外部的ssh server.大多数的组织都允许outgoing的ssh连接(至少如果他们在公有云上有server的话).这个ssh连接在建立的时候使能了tcp port forwarding:从外部server上的一个port到内部网络中server的一个ssh端口。建立这么一个ssh back-tunnel仅需要在inside中一条命令,并且容易自动化.大多数防火墙对这种情况基本无能为力.

有好几种被广泛所知并被记录的案例:使用ssh协议实现的流氓软件 并且隐藏数据的泄漏

 其中几例流氓软件还会搜集ssh密钥.甚至这些captured或者collected ssh keys在黑客论坛上售卖.

结合基于无管理的ssh keys的攻击,ssh tunneling允许攻击者从互联网公网使用偷窃来的内网ssh keys。

ssh tunneling攻击也常常被用于隐藏攻击源.It is common for hackers to bounce attacks off systems and devices that allow ssh port forwarding to hide their tracks.

解决这些威胁需要监控和审查加密的ssh connection.

需要说明的是tunneling attack并不是ssh所特有的.一个熟练的程序员可以花两个小时就能写一个工具用于tunnel ports并且能在internal network的任何机器上运行起来.任何笔记本或者其他的设备都能干这事儿,只要该设备能够和互联网上的其他设备进行通信即可.工具可以基于ssl/tls可以模拟http或者可以运行于UDP之上并且可以使用类似DNS request的报文. SSH仅仅是使得那些非程序员群体更容易使用而已. 您只能通过只允许通过防火墙检查协议来保护那些能够在内部运行软件或将任何设备连接到内部网络的人免受隧道攻击

阻止未授权的ssh tunnel

CryptoAuditor是一个基于network的解决方案,它可以在防火墙处阻止未授权的ssh tunnel.它可以在防火墙处基于policy来解密ssh session,当然需要能够访问到host keys. 它也可以控制文件传输

ssh tunneling配置

ssh port forwarding(ssh tunneling)到底是什么

我们再来过一遍,到底什么是ssh tunneling或者说ssh port forwarding.它是ssh提供的一种机制用于在client和server之间隧道化application ports。

Local forwarding本地转发

本地转发用于转发一个从客户端到服务器的端口.在这种场景下,ssh client在配置的一个端口上侦听连接请求, 当接收到一个连接时,它会tunnel该连接到ssh server. 而server则连接到一个配置好的目的端口,很有可能与ssh serve是在不同的机器上面。

本地转发的典型应用场景:

1. tunneling sessions and file transfers through jump servers

2. 从外网连接到内网的一个服务

3. 通过internet连接到一个远端的file share

很少有组织对于所有进向(incoming)ssh访问只通过一个Jump server. server可能是一个标准的linux box,通常有一些额外功能或性能加固,入侵检测,日志等功能,也有可能是一个商业jump server解决方案.比如CryptoAuditor就能作为jump server,记录所有的sessins,并且将session内容传递给内容分析服务器.

许多jump server允许进向(incoming)端口转发,只要连接被成功鉴权.这种端口转发非常方便,因为它允许精通技术的用户更加透明地使用内部资源.比如,他们转发他们本地机器上的一个端口到内网web server上,或者到内网的mail服务器的IMAP端口,或者到内网文件服务器的445/139端口,再或者到一个内网的打印机服务端口,再或者到一个内网的版本控制repo,或者任何其他的内网系统服务.

通常地,端口被tunnel到内网机器的ssh端口.

openssh中,local port forwarding的配置使用-L选项

ssh -L 80:intra.example.com:80 gw.example.com

上面这条命令打开一条到gw.example.com(jump server)的connection,并且转发任何到本地机器80端口的connection到intra.example.com的80端口

opens a connection to the gw.example.com jump server, and forwards any connection to port 80 on the local machine to port 80 on intra.example.com.

默认情况下,任何人(甚至来自不同的机器)都能够连接到ssh client上的指定端口。我们也可以通过提供一个bind addres来限制只有ssh client同一台机器上的programs可以建立连接:

ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com

一个小技巧:可以使用openSSH client配置文件的LocalForward配置选项而不在命令行中显示地配置

Remote Forwarding远程转发

在OpenSSH中,使用-R选项就能够使能远程转发,例子如下:

ssh -R 8080:localhost:80 public.example.com

上面的命令允许任何在remote server上的用户(就是该机器上的合法帐号)连接到remote server上的8080端口.这个连接随后被tunneled back到client host,然后client就可以创建一个到localhost 80端口的连接。除了localhost我们也可以指定任何其他的hostname或者ip地址作为连接的目标主机(specify the host to connect to)

这个配置对于允许外部的用户访问内部的web server非常有用.或者说将内部的web server暴露给外部互联网.这可能是被一个在家工作的emplyee或者一个攻击者使用的场景.

默认情况下,openssh仅仅允许从server host连接到remote forwarded ports.然而,server 配置文件sshd_config中的GatewayPorts选项可以用于控制这个限制.比如:

GatewayPorts no/yes

给了这个选项以后就禁止从server computer以外的机器连接到forwarded ports上.

如果选择yes的话则允许任何人都能够连接到forwarded ports.如果server是在internet上,那么任何互联网用户都能够连接到那个端口.

GatewayPorts clientspecified

这意味着客户端可以指定一个允许从该ip连接到转发端口的ip地址.以下是对应的语法:

ssh -R 52.194.1.73:8080:localhost:80 host147.aws.example.com

这个例子中,只有从52.194.1.73到端口8080的连接是允许的。

openSSH也允许fowarded remote port指定为0.这时,server会动态分配一个端口并且将该端口报告给client.当使用-0 foward配置参数时,client会将分配的port number打印到标准输出。

在企业IT系统中开一后门(opening backdoors into the enterprise)

remote ssh port forwarding通常被employee用于开个后门到企业的IT网络。例如公司员工可能开一个AWS机器,并且从办公室登录到那个AWS机器,specifying remote forwarding from a port on the server to some server or application on the interal enterprise network. 可以指定多个远程转发来开放对多个应用程序的访问.员工可能也会在server上设置GatewayPorts yes选项(原因是大多数员工在家里是没有静态固定的IP地址的,因此他们不能限制ip地址)

例如,下面的命令将打开对内部Postgress数据库访问(5432端口)和一个内部的ssh port(2222)

ssh -R 2222:d76767.nyc.example.com:22 -R 5432:postgres3.nyc.example.com:5432 aws4.mydomain.net

 

server-side配置

在server机器上,openssh server configuration文件中,AllowTcpForwarding选项必须打开.

可选的值有:

yes/all:允许所有的Tcp forwarding

no:禁止所有的Tcp forwarding

local:允许local forwarding

remote:允许remote forwarding

另外一个配置项是: AllowStreamLocalForwarding,这个配置项允许转发unix domain sockets.其允许的值和AllowTcpForwarding是相同的。默认值为yes.比如:

AllowTcpForwarding remote AllowStreamLocalForwarding no

上面提到的GatewayPorts配置项也会影响到remote port forwarding.可能的值为no(only local connections from server host allowed), yes(anyone on the internet can connect to remote fowarded orts), clientspecified(client can specify an IP address that can connect, anyone can if not specified).

如何禁止 FROM CIRCUMVENTING FIREWALLS SSH Port forwarding

如果不需要的话,port转发应该显式地关闭.因为如果打开port fowrading的话就将组织置于安全风险之中.比如,如果一个仅用于提供SFTP文件传输服务的server允许做了port forwardings,那么这些端口转发可能会给外网用户很容易获得额外的内网权限.

问题是在实践上我们只能在企业的server或者防火墙上来禁止端口转发,因为企业不可能控制互联网上的机器.
https://www.slashroot.in/secure-shell-how-does-ssh-work

https://www.cnblogs.com/p/8042001.html

https://www.cnblogs.com/popsuper1982/p/3875420.html

 

posted @ 2019-06-19 16:37  世有因果知因求果  阅读(744)  评论(0编辑  收藏  举报