[ Content contribution] 服务搭建系列(2):ssh服务配置
Tofloor
poster avatar
废物头子
deepin
2023-12-27 18:46
Author

服务搭建系列(2):ssh服务配置

一、SSH作用

传统的互联网通信使用明文传输数据,内容一旦被截获就会完全暴露,存在很多安全隐患。SSH协议通过对网络数据进行加密和验证,建立SSH客户端和SSH服务器之间的安全隧道,在不安全的网络环境中为网络服务提供了安全的传输通道。

SSH最常用的场景是远程登录和文件传输。在SSH协议出现之前,Telnet广泛应用于远程登录场景,为远程管理网络设备提供了极大便利,而FTP作为常用的文件传输协议,兼具操作简单和传输效率高的优点,但它们都存在相同的问题,即明文传输数据带来的安全隐患。SSH采用加密传输数据、提升认证强度等手段,克服了Telnet和FTP应用中的安全性问题,实现了安全的远程登录和文件传输业务。

二、SSH工作原理

SSH由服务器和客户端组成,为建立安全的通道,双方采用TCP建立连接,通过22端口来进行数据交互。SSH的工作流程分为以下几个阶段:建立TCP连接—>协商使用的版本号和算法—>生成相同的会话密钥用于加密—>数据交互。

连接建立

SSH服务器在没有手动连接申请时,会侦听SSH的端口号(默认为22),当SSH客户端向服务器该端口发起连接请求时,双方建立TCP连接,后续通过该端口进行统信。

版本协商

SSH协议目前存在两个版本 SSH1.XSSH2.0。当通信双方建立好TCP连接后,服务器会向客户端发送支持的SSH版本信息;SSH客户端收到版本信息后,根据自身支持SSH版本决定使用的版本,并将其发送给服务器;服务器判断自己是否支持客户端决定的版本,从而确定版本协商成功。

算法协商

SSH工作过程中需要使用多种算法,包括用于产生会话密钥的密钥交换算法、用于数据信息加密的对称加密算法、用于进行数字签名和认证的公钥算法和用于数据完整性保护的HMAC算法。SSH服务器和客户端对所需算法支持情况不同,因此双方会进行算法协商。过程如下:

  • SSH服务器和客户端分别向对方发送支持的算法。
  • SSH服务器和客户端依次协商每种类型中具体使用的算法。在每类算法的协商过程中,SSH服务器和客户端都会匹配出双方均支持的算法作为最终使用的算法。每类算法均匹配成功后,算法协商完成。如果某类算法全部匹配失败,则该类型的算法协商失败,这会导致SSH服务器和客户端之间算法协商失败并断开连接。

密钥交换

SSH服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识SSH连接。

用户认证

SSH客户端向SSH服务器发起认证请求,SSH服务器对SSH客户端进程认证。SSH支持以下几种认证方式:

  • 密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
  • 密钥(publickey)认证:客户端通过用户名,公钥以及公钥算法等信息来与服务器进行认证。
  • password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
  • all认证:只要满足密码认证和密钥认证其中一种即可。

SSH用户认证最基本的两种方式是密码认证和密钥认证。密码认证方式比较简单,且每次登录都需要输入用户名和密码。而密钥认证可以实现安全性更高的免密登录,是一种广泛使用且推荐的登录方式。

密码认证

密码认证的基本原理是SSH客户端使用服务器公钥对密码进行加密,SSH服务器使用服务器私钥解密后验证密码的合法性。密码认证登录流程如下:

  1. SSH客户端向SSH服务器发送登录请求。
  2. SSH服务器将服务器公钥发送给SSH客户端。
  3. SSH客户端输入密码,使用服务器公钥加密密码后发送给SSH服务器。
  4. SSH服务器收到密文,使用服务器私钥解密得到密码。验证密码是否正确,如果正确则认证通过。

但是,这种认证方式存在中间人攻击的风险,如果有人截获了SSH客户端的登录请求后,冒充SSH服务器将伪造的公钥发送给SSH客户端,就可以获取到用户的登录密码。所以,在首次登录SSH服务器时,SSH客户端上会提示公钥指纹,并询问用户是否确认登录。用户确认后公钥将被保存并信任,下次访问时,SSH客户端将会核对SSH服务器发来的公钥和本地保存的是否相同。这种方式适用于公布了公钥指纹的SSH服务器以及已登录过正确SSH服务器的SSH客户端。

密钥认证

为避免中间人攻击,可以使用安全性更高的密钥认证。密钥认证的基本原理是SSH服务器使用客户端的公钥对随机内容加密,SSH客户端使用自己的私钥解密并发送给服务器以证实自己的身份。密钥认证登录流程如下:

  1. 在进行SSH连接之前,SSH客户端需要先生成自己的公钥私钥对,并将自己的公钥存放在SSH服务器上。
  2. SSH客户端向SSH服务器发送登录请求。
  3. SSH服务器根据请求中的用户名等信息在本地搜索客户端的公钥,并用这个公钥加密一个随机数发送给客户端。
  4. SSH客户端使用自己的私钥对返回信息进行解密,并发送给SSH服务器。
  5. SSH服务器验证SSH客户端解密的信息是否正确,如果正确则认证通过。

会话请求

认证通过后,SSH客户端向服务器发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。服务器根据客户端请求进行回应。

会话交互

会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互,双方发送的数据均使用会话密钥进行加解密。

三、SSH配置

SSH服务由openssh软件包提供,大部分系统默认安装了openssh。

查看SSH是否安装。
[root@1060a ~]# rpm -qa | grep openssh
openssh-clients-8.2p1-19.up1.0.2.uelc20.04.x86_64
openssh-server-8.2p1-19.up1.0.2.uelc20.04.x86_64
openssh-8.2p1-19.up1.0.2.uelc20.04.x86_64

SSH配置文件存放在 /etc/ssh目录下,ssh_config为客户端配置文件,sshd_config为服务端配置文件。

修改sshd_config配置文件:
	允许root登录 PermitRootLogin yes  
	修改ssh的服务端口 Port 2222  
	修改ssh监听的地址 ListenAddress 172.18.0.101  如果是0.0.0.0  监听所有地址
	修改密码的最大错误次数 MaxAuthTries 1 
	修改最大的连接会话数 MaxSessions 10
 	修改仅允许秘钥认证  PasswordAuthentication no
	禁用允许空密码登录  PermitEmptyPasswords no
修改完后重启服务   
#systemctl  restart sshd

openssh-client提供了远程登录命令ssh。

连接的格式
ssh  用户名@远程主机的IP地址或者是主机名(远程登录)
eg: # ssh root@192.168.1.1
eg: # ssh root@servera
ssh  用户名@远程主机的IP地址或者是主机名  命令(远程执行)
eg: # ssh root@192.168.1.1 'systemctl stop firewalld'
当不指定用户名时,默认使用客户端执行ssh命令的用户。

拓展:

Port:设置SSH服务监听的端口号,默认为22。
Protocol:设置SSH协议版本,可以选择SSH1或SSH2。
HostKey:设置SSH服务器的密钥文件路径。
HostName:设置SSH服务器的主机名。
User:设置允许登录的用户,可以是用户名、用户组名或通配符。
Group:设置允许登录的用户组,可以是用户组名或通配符。
PubkeyAuthentication:设置是否允许使用公钥认证方式登录。
PasswordAuthentication:设置是否允许使用密码认证方式登录。
AllowUsers:设置允许登录的用户列表,多个用户之间用空格分隔。
AllowGroups:设置允许登录的用户组列表,多个用户组之间用空格分隔。
DenyUsers:设置禁止登录的用户列表,多个用户之间用空格分隔。
DenyGroups:设置禁止登录的用户组列表,多个用户组之间用空格分隔。
Subsystem:设置SSH子系统类型,如sftp、ssh、login等。
UsePrivilegeSeparation:设置是否启用特权分离模式。
ClientAliveInterval:设置客户端空闲超时时间,单位为秒。
ClientAliveCountMax:设置客户端空闲超时重试次数。
Banner:设置SSH登录时的欢迎信息。
PermitRootLogin:设置是否允许root用户登录。
StrictModes:设置是否启用安全模式,限制root用户的操作权限。
LogLevel:设置SSH日志级别,如DEBUG、INFO、WARN、ERROR等。

本人不才,在deepin论坛分享了一些自己在Linux学习过程中的一些知识积累,在分享的同时也在论坛中学习到了很多知识。现在想去拉起一个群聊,来分享知识,希望大家都能加入进来,分享自己所擅长的知识,本人也会在群里分享Linux,网络,docker,mysql等知识,同时也希望各位大佬能够帮助在下,完善自己的分享中的不足。

群号:751639288

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2023-12-27 18:46
#1

感谢分享like

Reply View the author
废物头子
deepin
2023-12-27 18:49
#2

期望大家提出一些建议,大家也可以在评论区里面提出后续想要什么服务配置

Reply View the author
晚秋(lateautumn)
Moderator
2023-12-27 19:01
#3

看了楼主的这篇帖子,终于知道ssh是用来干什么的了。joy

Reply View the author
babyfengfjx
Super Moderator
CQA
2023-12-27 19:49
#4

NICE!

Reply View the author
yanjuner
Super Moderator
2023-12-27 21:51
#5

专业,太专业了

欢迎更多有点子的大佬投稿干货!

Reply View the author
jjcui8595
Moderator
2023-12-27 22:32
#6

感谢分享,内容大赞like

Reply View the author
乾豫恒益
deepin
2024-03-04 10:48
#7

yeah

tail

收藏了!

Reply View the author
133******03
deepin
2024-03-05 21:42
#8
rpm -qa | grep openssh 

这是 centos 的命令吧?

Reply View the author
废物头子
deepin
2024-03-06 15:13
#9
133******03
rpm -qa | grep openssh 

这是 centos 的命令吧?

uos1060服务器可以用啊

都是yum系的

Reply View the author