码迷,mamicode.com
首页 > 其他好文 > 详细

ssh服务详解

时间:2017-09-16 11:57:36      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:linux

什么是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的配置文件,很多默认的配置都在此文件定义,以下举出几条:

#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上配置一条命令

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上配置一条命令

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上配置一条命令:

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

在A上测试

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

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

本文出自 “高攀” 博客,谢绝转载!

ssh服务详解

标签:linux

原文地址:http://panpangao.blog.51cto.com/10624093/1965736

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!