在 centOS 上设置 SSH 服务配置(远程服务端)
SSH 是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用 SSH 协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者 Tatu Ylonen 设计了SSH 协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为 Linux 系统的标准配置。
SSH 只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。所有 ssh 客户端工具,包括 ssh 命令,scp、sftp、ssh-copy-id 等命令都是借助于 ssh 连接来完成任务的。
卸载并重装 SSH 服务
若使用 SSH 连接,那么本机客户端和远程服务端,都需要安装 SSH 服务。
#查看 openssh 安装情况rpm -qa openssh* #卸载dnf remove openssh* #重装dnf -y install openssl openssh #查看版本ssh -V
- SSH 服务配置文件:/etc/ssh/sshd_config。服务器端 SSH 服务运行的系统配置。
- 全局用户配置文件:/etc/ssh/ssh_config。此是客户端,进行 SSH 连接的选项配置。是全局的。
- 当前用户配置文件:~/.ssh/config。此是客户端,进行 SSH 连接的选项配置。是当前用户的配置。它优先于全局的配置。若 root 用户,配置文件路径是/root/.ssh/config。其他用户,比如自设置 git 用户,配置文件路径是/home/git/.ssh/config。
#设置开机自启systemctl enable sshd #启动systemctl start sshd #重启systemctl restart sshd #停止systemctl stop sshd #检查 sshd 服务是否已经启动ps -e | grep sshd
开启防火墙的 SSH 端口
SSH 默认端口是 22
#永久放开 22 端口,然后重新载入,使其生效firewall-cmd --permanent --zone=public --add-port=22/tcpfirewall-cmd --reload #查看所有打开的端口firewall-cmd --zone=public --list-ports #重启 firewalldsystemctl restart firewalld #查询当前程序运行端口号netstat -anpl | grep sshd
配置 SSH
SSH 配置文件,位于/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
# 允许 root 用户登录 PermitRootLogin yes # 开启 RSA 算法验证,新版中已经淘汰此选项 RSAAuthentication yes # 使用公钥验证 PubkeyAuthentication yes # 公钥保存位置 AuthorizedKeysFile .ssh/authorized_keys # 允许密码登录,默认值 yes。当设置为 no,则会禁止密码登录。 PasswordAuthentication yes # Pam 认证,默认值 no,不开启。 UsePAM no # GSSAPIAuthentication 认证,默认值 no,不开启。 GSSAPIAuthentication no # DNS 反向解析。默认 no,不开启 UseDNS no # 客户端响应时长 ClientAliveInterval 60 # 客户端响应最大次数 ClientAliveCountMax 3
SSH 版本不同,默认值会不同。此处是版本:OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
开启公钥验证和密码验证,如此即可以使用密码口令登录,也可以使用密钥登录,避免总输入密码的麻烦。不开启 PAM 认证,因为当UsePAM yes
,开启 UsePAM 的时候,panm 认证机制会先去找验证模块,由验证模块决定下一步的验证。PAM 检验的优先级高于 PasswordAuthentication(密码验证),若 pam 认证失败,密码登录也不能使用。不开启 GSSAPIAuthentication 认证。
PAM:插入式验证模块(Pluggable Authentication Module,PAM),简单来说,就是提供了一组身份验证、密码验证的统一抽象接口,应用程序员可以使用这些API接口来实现与安全性相关的功能。
GSSAPI:Generic Security Services Application Program Interface,GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。GSSAPI 本身是一套 API,由 IETF 标准化。其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。
另外,本机客户端进行 SSH 连接时,认证方法顺序,也需要设置为:PreferredAuthentications publickey,password
。
UseDNS
:由于远程目标 server 服务器,若启用 DNS 反向解析:远程目标 server 服务器验证登录 IP,它根据用户输入的 IP,使用反向 DNS 找到主机名,再使用 DNS 找到 IP 地址,最后匹配一下登录的 IP 是否合法。如果客户机的 IP 没有域名,或者 DNS 服务器很慢或不通,那么登录就会很花时间。GSSAPIAuthentication
:由于远程目标 server 服务器,若启用 GSSAPI 用户认证。GSSAPIAuthentication 是基于 GSSAPI 的用户认证,登陆的时候客户端需要对服务器端的 IP 地址进行反解析,如果服务器的 IP 地址没有配置 PTR 记录,那么就会在这里卡住。
ClientAliveCountMax
:sshd 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。到达这个上限后,sshd 将强制断开连接、关闭会话。需要注意的是,"alive"消息与 TCPKeepAlive 有很大差异。"alive"消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。ClientAliveInterval
:设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据, sshd 将通过安全通道向客户端发送一个"alive"消息,并等候应答。默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。
更改保存 sshd_config 文件后,重启 SSH 服务。
systemctl restart sshd
SSH 登录异常
Connection reset by peer
在本机,SSH 连接远程连接服务器的时候,出现:
kex_exchange_identification: read: Connection reset by peer
Connection reset by xxxxxx port 22
Connection close
vim /etc/ssh/sshd_config #修改 sshd_config 配置 MaxSessions 20 MaxStartups 20:30:10 #修改完毕后,重启 sshd 服务systemctl restart sshd
MaxSessions
,每个连接可以并行开启多少个会话(session),默认值是 10。MaxStartups
,这个是限制处于联机页面的连接数,默认值 10。联机页面就是当你登录 ssh 时,还没输入密码的页面。即控制并发初始化连接的个数,初始化连接即还未到认证层面的连接。默认值是三元组形式10:30:100
,表示如果超过 10 个并发初始化连接,则后续的连接由 30%的几率直接被关闭,如果超过 100 个连接,则所有新的连接 100%直接关闭。
Software caused connection abort
本地之前正常访问服务器 ssh 的 22 端口。连接 SSH 即使密码正确也连接不上,等待几秒钟之后提示:FATAL ERROR: Network error: Network error: Software caused connection abort
,根本无法正常的连接。
vim /etc/ssh/sshd_config #修改 sshd_config 配置 LoginGraceTime 0 TCPKeepAlive yes #修改完毕后,重启 sshd 服务systemctl restart sshd
Host key verification failed
本机~/.ssh/known_hosts,服务端发过来的服务端公钥储存文件:A 通过 ssh 首次连接到 B,B 会将公钥1(host key)传递给 A,A 将公钥 1 存入 known_hosts文件中,以后 A 再连接 B 时,B 依然会传递给 A 一个公钥 2,OpenSSH 会核对公钥,通过对比公钥 1 与公钥 2 是否相同来进行简单的验证,如果公钥不同,OpenSSH 会发出警告,避免你受到 DNS Hijack之类的攻击。
A 通过 ssh 登陆 B 时提示:Host key verification failed.
。原因:A 的 known_hosts 文件中记录的 B 的公钥 1 与连接时 B 传过来的公钥 2 不匹配。解决方法:删除 A 的 known_hosts 文件中记录的 B 的公钥(手动进行,不适用于自动化部署情形)。