ssh服务详解

  1. 云栖社区>
  2. 博客>
  3. 正文

ssh服务详解

技术小牛人 2017-11-12 20:08:00 浏览1098
展开阅读全文

什么是openssh

openssl是使用ssh协议远程登录系统的连接工具。它能加密流量、防窃听和其他攻击。此外还能够提供隧道功能、多种认证方法和复杂的配置选项;

openssh是一组工具的集合,其套件包括三部分:

  • 远程操作类    ssh、scp、sftp

  • 密钥管理类    ssh-add、ssh-keysign、ssh-keyscan和ssh-keygen

  • 服务提供者类    sshd、sftp-server、ssh-agent


openssh官方网站:

https://www.openssh.com/


为什么是ssh

远程连接的工具有很多,为什么偏偏选择ssh?

ssh英文全称是secure shell protocol,安全的壳程序协议。有v1和v2两个版本,目前v2是主流;

以telnet为代表的远程连接工具已经被ssh替代,其关键原因就是ssh提供数据加密的功能,telnet还是明文传输存在被窃听的隐患;

ssh的加密使用非对称密钥加密体系完成,所谓的非对称加密,就是公钥、私钥组成密钥对。可以加密对称密钥也可以验证身份;

连接加密技术简介:

通信的任一端都有一对密钥--公钥和私钥

公钥:由私钥推导生成,但不能反推;公之于众;安全性高但加密效率低,一般用于加密对称密钥;还可以解密私钥加密的数据,进行身份认证;CA证书;

私钥:必须保存在本机;可以对随机字符串加密,对方用自己的公钥解密,实现签名;

ssh在远程连接的用途上已经是主流,大家对此也都已形成共识,但是telent在一些场景中依然使用较广即使它是明文传输;

ssh服务详解

ssh基于C/S结构,C表示Client客户端,S表示Server服务器端,sshd表示服务;

服务端:默认使用tcp 22端口,ss -ntl可以查看,而且既然是默认说明可以修改;

客户端:ssh的登陆有两种认证方式,一是基于口令,一是基于key;

ssh的命令格式一般为:ssh  用户@ip 命令(具体man或help查看);


ssh基于口令的登陆过程:

  • 服务器开启sshd服务,会在/etc/ssh/目录下查找ssh_host_*文件,即公钥私钥文件(在安装系统时生成);

  • 客户端请求连接,服务端将自己的公钥文件发给客户端;

  • 客户端检查~/.ssh/known_hosts中是否有服务器公钥,没有的话就会在ssh连接时提示“(yes/no)”,yes就是将公钥加入文件中;

  • 客户端输入口令,并用服务器公钥加密传给服务器端;

  • 服务器用自己的私钥解密,得到口令,正确的话认证通过;


ssh基于key的登陆过程:

  • 客户端生成一对密钥(ssh-keygen);

  • 客户端将公钥传递给服务器(key-copy-id);

  • 服务器端在~/.ssh/下生成文件authorized_keys,其内容是客户端公钥信息;

  • 客户端连接服务器时,会附带本身用户名信息等;

  • 服务器根据用户信息对比authorized_keys文件,若一致的话则使用这个公钥加密一串随机字符,并发给客户端;

  • 客户端收到加密数据,用自己私钥解密,并将解密的字符串发给服务器;

  • 服务器对比收到的字符串与之前生成的字符串,一致的话认证通过


/etc/ssh/sshd_config 是sshd的配置文件,很多默认的配置都在此文件定义,以下举出几条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#Port 22
#这就是ssh监听22端口的原因,可以修改
 
#ListenAddress 0.0.0.0
#默认监听所有ip,安全起见可以将监听地址指定为管理员地址
 
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
#版本2的私钥文件,rsa、dsa是非对称密钥体系的两种实现方式
 
#LoginGraceTime 2m
#默认的2分钟不输入口令则退出登陆
#PermitRootLogin yes
#默认是允许root登陆
 
UsePAM yes
#使用pam,pam定义一个安全框架,通过特定的模块实现对服务的安全保护

端口转发的三种方式

ssh端口转发的前提都是通过ssh建立“隧道”

1、本地端口转发

网络结构:出差员工A------[防火墙]-----ssh服务器B------telnet服务器C

场景一:员工A想要登陆公司telnet服务器,但公司出于安全考虑不允许外网直接访问C但是允许访问B。因此以B机器为跳板机,登陆B再以B的身份登陆C机器

在A上配置一条命令

1
2
3
4
5
ssh -L 12345:telnet-server:23  ssh-server -Nf
# -L本地端口转发
# 12345是本机监听的端口
# -N 表示不打开远程终端
# -f 表示后台执行

然后在A上输入“telnet 127.0.0.1 12345”即可登陆telnet服务器,很神奇吧,其工作原理如下:

  • 本机127.0.0.1正在监听12345端口,当收到telnet命令,触发此端口,与127.0.0.1的另一个端口建立连接;

  • 同时触发本机与ssh服务器建立ssh连接;

  • ssh服务器再以自己作为telnet客户端与telnet服务器建立连接;

  • telnet服务器23端口与B建立连接,看到的都是B的信息,但是实际连接的确实A

关键点就是,本机监听本机端口12345

2、远程端口转发

网络结构:出差员工A------[防火墙]-----ssh客户端B------telnet服务器C

场景二:与“场景一”类似,只是此时防火墙不允许外网主动与内网主机建立ssh连接

此场景下,出差员工当作ssh服务器,B作为ssh客户端,其他不变

在B上配置一条命令

1
2
3
ssh -R 12345:telnet-server:23 ssh-server -Nf
# -R表示远程端口转发
# 12345 表示B监听的远程机器A上的端口

在A上输入“telnet 127.0.0.1 12345”即可登陆telnet服务器,其工作原理如下:

  • A上telnet命令触发12345端口,同时一直监听此端口的B机器开始与A建立ssh连接;

余下的过程与“本地端口转发一样”

但是二者的区别是“本地端口转发”是ssh客户端监听本机的12345端口,然后主动与内网的ssh服务器建立连接;

“远程端口转发”则是外网的ssh服务器被动接受内网的ssh连接,因为主动方式被防火墙阻止了。

3、动态端口转发

网络结构:A-----[防火墙]-----ssh服务器B-----http服务器C

场景三:不允许外网用户直接访问http服务,但是ssh服务是允许的

在A上配置一条命令:

1
2
ssh -D 1080 用户@ssh-server
# -D 动态指定连接ssh服务的端口

在A上测试

1
2
curl --socks5 127.0.0.1 
# 默认1080端口,所以可以不写

A设置为本机代理,当访问1080端口,会与ssh服务器建立连接,然后再与http服务器建立连接

本文转自  a_pan  51CTO博客,原文链接:http://blog.51cto.com/panpangao/1965736



网友评论

登录后评论
0/500
评论
技术小牛人
+ 关注