一、ssh服务
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
简单来说ssh服务是
ssh的客户端通过网络与ssh服务端进行远程访问的控制的一种协议
1.SSH服务的优点
- 安全性: 数据传输是加密的,可以防止信息泄漏。
- 身份验证:防止未经授权的用户访问远程系统。
- 远程管理:可通过SSH协议登录远程服务器并执行命令,无需直接物理访问设备。
- 端口转发:SSH支持 端口转发功能,可以安全地传输其他协议和应用程序。
- 传输速度: 数据传输是压缩的,可以提高传输速度。
- SSH具有强大的安全性、身份验证和远程管理功能,使得它成为远程访问和管理计算机系统的首选协议。
远程管理linux系统基本上都要使用到ssh,
原因很简单:
telnet、FTP等传输方式都是以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。
所以SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,透过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
所以ssh服务的主要优点有两个
- 数据传输是加密的,可以防止信息泄漏
- 数据传输是压缩的,可以提高传输速度
这也是ssh服务和telnet的区别所在
2.常见的ssh服务软件(工具)
客户端软件:
- Linux 客户端: ssh, scp, sftp,slogin
- Windows 客户端:xshell, MobaXterm,putty, securecrt, ssh secure shell client
服务端软件:
- 软件名sshd,闭源。
- 软件名openssh,服务名sshd(CENTOS 7默认安装的是这个软件包)
OpenSSH软件包
服务名称:sshd
- 服务端主程序:
/usr/sbin/sshd
- 服务端配置文件:
/etc/ssh/sshd_config
- 客户端配置文件:
/etc/ssh/ssh.config
OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux 操作系统。
Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。
systemctl start sshd
命令即可启动sshd 服务
sshd 服务默认使用的是TCP的22端口,安全协议版本sshv2,除了2之外还有1(有漏洞)
3.SSH的组成结构
1.传输层协议(ssh-trans)
- 服务器认证,保密性以及完整性,压缩功能
- 一般运行在tcp/ip连接上,也可以用在其他可靠流
- ssh-trans提供加密技术,密码主机认证,数据完整性保护,数据压缩
- 密码主机认证,基于主机,不能进行用户认证
2.用户认证协议(ssh_userauth)
- 向服务器提供客户端用户鉴别功能
- 运行在ssh_trans之上
- 开始执行用户认证,从底层协议接受会话标识,认证私钥所有权
整体过程:boot –认证用户是否存在–输入密码–认证密码是否相符–登录成功)
3.连接协议(ssh_connect)
- 多个加密隧道分为逻辑通道
- 运行在用户认证上,提供交互式登录会话,远程命令执行,转发tcp/ip连接
4.SSH服务的原理(公钥传输的原理)
- 客户端发起链接请求。
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)。
- 客户端生成密钥对。
- 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密。
- 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res。
- 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)。
- 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密。
5.SSH的三种登录方式和免密登录
三种方法,第一次登录的时候都会提示
5.1 方法一
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
命令 端口号 //端口号不指定的情况下默认22
[root@localhost ~]#ssh root@192.168.1.100
#未使用-p指定端口号默认使用22端口 root(登录对方的用户)加IP 地址,首次登录会询问,并要求输入密码
方法一图片示例:
5.2 方法二
ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port
-l :-l 选项,指定登录名称。
-p: -p 选项,指定登录端口(当服务端的端口非默认时,需要使用-p 指定端口进行登录)
[root@localhost ~]# ssh -l root 192.168.1.100
#未使用-p指定端口号默认使用22端口 root(登录对方的用户)加IP 地址,首次登录会询问,并要求输入密码
5.3 方法三:跳板连接
# 服务端模拟防火墙
[root@192 ~]# iptables -A INPUT -s 192.168.1.10 -j REJECT //服务端拒绝所有来自192.168.72.10的访问
# 客户端借助 192.168.1.110跳板连接
[root@localhost ~]]# ssh -t 192.168.1.110 ssh 192.168.72.100 //方便跳板连接
免密登录
正常远程访问主机都是需要输入密码的,ss服务直接使用使用秘钥对及免交互验证的方式登录,也就是就是免密登录
简略步骤如下:
- 首先在客户端生成一对密钥(ssh-keygen)
- 并将客户端的公钥ssh-copy-id 拷贝到服务端
- 当客户端再次发送一个连接请求,包括ip、用户名
- 服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
示例图:
6.服务器配置和客户端配置
6.1 服务器配置
服务器配置文件:/etc/ssh/sshd_config
配置文件中各部分释义及对应修改会产生什么效果
[root@yyds ~]#vim /etc/ssh/sshd_config //服务端配置
#Port 22 //注释默认配置端口为22
//修改Port后面可以修改端口,列如改成Port 9527,默认使用的端口就会变成9527
#ListenAddress 0.0.0.0
//表示监听所有地址的安全建议,如果不需要公网ssh访问,可以更改为内网网段
#LoginGraceTime 2m
//如果用户登录失败,在切断前服务器等待时间,默认单位秒
#PermitRootLogin no
//默认,ubuntu不允许root远程登录,虽然禁止root登录,但是仍然可以su root切换
//这里将no改成yes,允许直接切换到root用户,不过还需要去PAM配置文件中进行修改
打开PAM模块的配置文件:在终端中以管理员身份打开 /etc/pam.d/su 文件。
sudo nano /etc/pam.d/su
查找 “auth required pam_wheel.so use_uid” 行(第6行),并去掉前面的注释符号 '# ',使其生效。
#StrictModes yes
//检查.ssh/文件的属主,权限等
#MaxAuthTries 6
//最大登录失败次数,这里是6次,可以修改,但该行一般是被注释的,要使其生效需要去掉前面的注释符号 '# '
#MaxSessions 10
//同一个连接最大会话
#PubkeyAuthentication yes
//基于key验证
#PermitEmptyPasswords no
//密码验证,根据不同的安全级别需求,可以设置为no,使用认证的密钥登录
#PasswordAuthentication yes
//基于用户密码登录
#GatewayPorts no
#ClientAliveInterval 0
//秒
#ClientAliveCountMax 3
//默认3
#UseDNS no
//内网环境不使用DNS
GSSAPIAuthentication yes
//提高速度可改为no
#MaxStartups 10:30:100
//未认证连接最大值
//以下可以限制可登录用户的办法:白名单 黑名单
AllowUsers user1 user2 user3@ip(限制主机)
DenyUsers user1 user2 user3
AllowGroups g1 g2
DenyGroups g1 g2
//直接下面添加相应的规则就可以
列如:AllowUsers zhangsan@192.168.1.10
DenyUsers lisi
//只允许192.168.1.10的zhangsan用户登录,拒绝所有lisi用户登录
`注意,白名单和黑名单不要同时使用`
6.2 客户端配置
客户端配置文件:/etc/ssh/ssh_config
一般来说客户端的配置文件不怎么需要我们修改
在客户端配置文件/etc/ssh/ssh_config中第35行,将ask改成no,首次连接的时候系统就不会再进行公钥交换的询问了